/* Ċ Ġ* ĠLicensed Ġto Ġthe ĠApache ĠSoftware ĠFoundation Ġ( ASF ) Ġunder Ġone Ċ Ġ* Ġor Ġmore Ġcontributor Ġlicense Ġagreements . Ġ ĠSee Ġthe ĠNOTICE Ġfile Ċ Ġ* Ġdistributed Ġwith Ġthis Ġwork Ġfor Ġadditional Ġinformation Ċ Ġ* Ġregarding Ġcopyright Ġownership . Ġ ĠThe ĠASF Ġlicenses Ġthis Ġfile Ċ Ġ* Ġto Ġyou Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ċ Ġ* Ġ" License "); Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ċ Ġ* Ġwith Ġthe ĠLicense . Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ċ Ġ* Ġsoftware Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ċ Ġ* Ġ" AS ĠIS " ĠBASIS , ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY Ċ Ġ* ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ġ ĠSee Ġthe ĠLicense Ġfor Ġthe Ċ Ġ* Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ġlimitations Ċ Ġ* Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . apache . t inker pop 4 . gre mlin . process . traversal . strategy . optimization Ċ Ċ import Ġorg . apache . t inker pop 4 . gre mlin . process . traversal . Step Ċ Ċ /** Ċ Ġ* Ġ` Match Where Strategy ` Ġwill Ġfold Ġany Ġpost - ` where ()` Ġstep Ġthat Ġmaintains Ġa Ġtraversal Ġconstraint Ġinto Ċ Ġ* Ġ` match ()`. Ġ[ Match Step ] Ġis Ġint elligent Ġwith Ġtraversal Ġconstraint Ġapplications Ġand Ġthus , Ġcan Ġmore Ċ Ġ* Ġefficiently Ġuse Ġthe Ġconstraint Ġof Ġ[ Where Traversal Step ] Ġor Ġ[ Where Predicate Step ]. Ċ Ġ* Ċ Ġ* Ġ@ author ĠMark o ĠA . ĠRod rig ue z Ġ( http :// mark or od rig ue z . com ) Ċ Ġ* Ġ@ example Ġ< pre > Ċ Ġ* Ġ__ . match ( a , b ). where ( c ) ĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġis Ġreplaced Ġby Ġ__ . match ( a , b , c ) Ċ Ġ* Ġ__ . match ( a , b ). select (). where ( c ) ĠĠ Ġ// Ġis Ġreplaced Ġby Ġ__ . match ( a , b , c ). select () Ċ </ pre > Ġ* Ċ Ġ*/ Ċ class ĠMatch Predicate Strategy Ġprivate Ġconstructor () Ġ: ĠAbstract Traversal Strategy < Optimization Strategy ?> (), ĊĠĠĠ ĠOptimization Strategy Ġ{ ĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġfun Ġapply ( traversal : ĠTra versal . Admin < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! Traversal Helper . has Step Of Class ( Match Step :: class . java , Ġtraversal )) Ġreturn ĊĠĠĠĠĠĠĠ ĠTra versal Helper . get Steps Of Class ( Match Step :: class . java , Ġtraversal ). forEach Ġ{ Ġmatch Step Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmatch (). select (). where () Ġ--> Ġmatch ( where ()). select () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmatch (). select (). ded up () Ġ--> Ġmatch ( ded up ()). select () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext Step : ĠStep < *, Ġ*> Ġ= Ġmatch Step . getNext Step () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( next Step Ġis ĠWhere Predicate Step Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Step Ġis ĠWhere Traversal Step Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Step Ġis ĠD ed up Global Step Ġ&& Ġ!( next Step Ġas ĠD ed up Global Step ). get Scope Keys () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEmpty () Ġ&& Ġ( next Step Ġas ĠD ed up Global Step ). getLocal Children (). isEmpty () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Step Ġis ĠSelect Step Ġ&& Ġ( next Step Ġas ĠSelect Step ). getLocal Children (). isEmpty () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Step Ġis ĠSelect One Step Ġ&& Ġ( next Step Ġas ĠSelect One Step ). getLocal Children (). isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Step Ġ= Ġif Ġ( next Step Ġis ĠWhere Predicate Step Ġ|| Ġnext Step Ġis ĠWhere Traversal Step ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtraversal . remove Step ( next Step ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Step . add Global Child ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( traversal Ġis ĠGraph Traversal ) ĠDefault Graph Traversal (). add Step ( next Step ) Ġelse ĠDefault Traversal (). add Step ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Step ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Step . getNext Step () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( next Step Ġis ĠD ed up Global Step Ġ&& Ġ!( next Step Ġas ĠD ed up Global Step ). get Scope Keys () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEmpty () Ġ&& Ġ( next Step Ġas ĠD ed up Global Step ). getLocal Children () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEmpty () Ġ&& Ġ! Traversal Helper . on Graph Computer ( traversal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtraversal . remove Step ( next Step ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Step . set Ded up Labels (( next Step Ġas ĠD ed up Global Step < *> ). get Scope Keys ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Step . getNext Step () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( next Step . get Labels (). isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Step . getNext Step () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġfun Ġapply Prior (): ĠSet < Class < out ĠOptimization Strategy ? >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPR I ORS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġfun Ġapply Post (): ĠSet < Class < out ĠOptimization Strategy ? >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPOST S ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠINSTANCE Ġ= ĠMatch Predicate Strategy () ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPR I ORS : ĠSet < Class < out ĠOptimization Strategy ? >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCollections . singleton ( Identity Removal Strategy :: class . java ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPOST S : ĠSet < Class < out ĠOptimization Strategy ? >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCollections . singleton ( Filter Ranking Strategy :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġinstance (): ĠMatch Predicate Strategy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINSTANCE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }