package Ġi an m organ . graph store . graphql ; ĊĊ Ċ /** Ċ Ġ* ĠNavig ates Ġthe Ġquery Ġargs . ĠBasic ally Ġthis Ġis Ġa Ġmap Ġthat Ġrepresents Ċ Ġ* Ġthe Ġunderlying ĠGraphQL Ġquery , Ġand Ġas Ġwe Ġrecurse Ġthrough Ġthe Ġgraph Ċ Ġ* Ġwe Ġneed Ġto Ġkeep Ġtrack Ġof Ġwhich Ġpart Ġof Ġthe Ġtree Ġmatters . ĠS light ly Ċ Ġ* Ġsimilar Ġto Ġwalking Ġa Ġdirectory Ġtree . Ċ Ġ* Ċ Ġ* ĠThe Ġorder Ġof Ġthe Ġoriginal Ġmap Ġis Ġretained Ġthrough Ġuse Ġof Ġa ĠLinkedHashMap Ċ Ġ* Ċ Ġ* Ġ@ constructor ĠPass Ġthe Ġcurrent Ġnode Ġor Ġ"/" Ġstring Ġfor Ġroot Ġand Ġthe Ġargs Ġunder Ġthat Ġnode Ċ Ġ*/ Ċ class ĠArgs Walker Ġconstructor ( node Ġ: ĠString , Ġargs Ġ: ĠMap < String , Map < String , Any >>, Ġparent Ġ: ĠArgs Walker ?) Ġ{ ĊĠĠĠ Ġval Ġnode Ġ= Ġif Ġ( node . endsWith ("/ ")) Ġnode Ġelse Ġ"$ node /" ĊĠĠĠ Ġval Ġargs Ġ= Ġargs ĊĠĠĠ Ġval Ġparent Ġ= Ġparent ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuild Ġthe Ġroot Ġnode . ĠThis Ġis Ġalways Ġnamed Ġ" root " ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( args Ġ: ĠMap < String , Map < String , Any >>) Ġ: Ġthis (" root /", Ġargs , Ġnull ) ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrent Ġnode , Ġi . e . Ġthe Ġnode Ġin Ġthe Ġgraph . ĠThe Ġtrailing Ġslash Ġis ĊĠĠĠĠ Ġ* Ġremoved Ġunless Ġthis Ġthe Ġroot , Ġe . g . Ġroot Ġwill Ġbe Ġ"/", Ġwhereas Ġthe Ġa Ġchild ĊĠĠĠĠ Ġ* Ġnode Ġwould Ġbe Ġ" friends " ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnode () Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( node Ġ== Ġ"/") Ġnode Ġelse Ġnode . substring ( 0 , node . length - 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġfull Ġpath Ġback Ġto Ġthe Ġroot ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfull Path () Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnode Ġ: ĠArgs Walker ? Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġvar Ġworking Ġ= Ġnode () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( node ?. parent () Ġ!= null ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode . parent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! node ?. is Root () !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Ġ= Ġnode ?. node () Ġ+ Ġ"/" Ġ+ Ġworking ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġworking ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrent Ġset Ġof Ġfields Ġ( args ) Ġunder Ġthe Ġnode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġargs () Ġ: ĠMap < String , Map < String , Any >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġargs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġnode Ġabove , Ġor Ġnull Ġif Ġthis Ġis Ġthe Ġtop Ġof Ġthe Ġtree ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġparent () Ġ: ĠArgs Walker ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġparent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWalk Ġdown Ġinto Ġthe Ġ( child ) Ġnode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpath Ġ- ĠThe Ġnode , Ġcan Ġbe Ġwith Ġor Ġwithout Ġthe Ġtrailing Ġslash Ġ( same Ġbasic ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrules Ġas Ġdirectory Ġlisting Ġin Ġbash ), Ġe . g . Ġ" friends " Ġor Ġ" friends /" ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwalk Path ( path Ġ: ĠString ) Ġ: ĠArgs Walker Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstandard Path Ġ= Ġif Ġ( path . endsWith ("/ ")) Ġpath Ġelse Ġ"$ path /" ĊĠĠĠĠĠĠĠ Ġval Ġtrimmed Path Ġ= Ġstandard Path . substring ( 0 , standard Path . length - 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġworking Ġ= ĠLinkedHashMap < String , Map < String , Any >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġargs . keys ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . startsWith ( standard Path ) Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrimmed Ġ= Ġkey . substring ( standard Path . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking . put ( trimmed , args . get ( key ) !! ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġ"/" Ġroot Ġnode ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġargs [ trimmed Path ] ĊĠĠĠĠĠĠĠ Ġif Ġ( root Ġ!= Ġnull Ġ&& Ġroot . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworking [" / "] Ġ= Ġroot ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠArgs Walker ( standard Path , Ġworking , Ġthis ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġchildren () Ġ: ĠList < Args Walker > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġworking Ġ= ĠArrayList < Args Walker >() ĊĠĠĠĠĠĠĠ Ġval Ġnodes Ġ= ĠHashSet < String >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġargs . keys ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . contains ("/") Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġkey . split ("/ ")[ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! nodes . contains ( path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking . add ( this . walk Path ( path )); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnodes . add ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġworking ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Child ( path Ġ: ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġchildren ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . node () Ġ== Ġpath ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Root () Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnode Ġ== Ġ" root /" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIs Ġthere Ġa Ġset Ġof Ġnode Ġspecific Ġargs Ġunder Ġ"/" Ġkey ? ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhas Node Args () Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( args . containsKey ("/") Ġ&& Ġargs [" / "] !!. isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġthe Ġargs Ġassociated Ġwith Ġthe Ġnode , Ġbut Ġkeep Ġeverything Ġelse Ġthe Ġsame ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreplace Node Args ( root Args : ĠMap < String , ĠAny >): ĠArgs Walker Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupdated Ġ= ĠHashMap ( args ) ĊĠĠĠĠĠĠĠ Ġupdated [" / "] Ġ= Ġroot Args ĊĠĠĠĠĠĠĠ Ġreturn ĠArgs Walker ( this . node (), updated , this . parent ) ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ