1414
1515package org .janusgraph .graphdb .tinkerpop .optimize ;
1616
17+ import org .apache .tinkerpop .gremlin .process .traversal .step .map .GraphStep ;
18+ import org .apache .tinkerpop .gremlin .process .traversal .step .map .NoOpBarrierStep ;
1719import org .janusgraph .core .Cardinality ;
1820import org .janusgraph .core .PropertyKey ;
1921import org .janusgraph .core .JanusGraphTransaction ;
3335
3436import org .javatuples .Pair ;
3537
38+ import java .util .Arrays ;
3639import java .util .Comparator ;
3740import java .util .List ;
3841
4144 */
4245public interface HasStepFolder <S , E > extends Step <S , E > {
4346
44- public void addAll (Iterable <HasContainer > hasContainers );
47+ void addAll (Iterable <HasContainer > hasContainers );
4548
46- public void orderBy (String key , Order order );
49+ void orderBy (String key , Order order );
4750
48- public void setLimit (int limit );
51+ void setLimit (int limit );
4952
50- public int getLimit ();
53+ int getLimit ();
5154
52- public static boolean validJanusGraphHas (HasContainer has ) {
55+ static boolean validJanusGraphHas (HasContainer has ) {
5356 return JanusGraphPredicate .Converter .supports (has .getBiPredicate ());
5457 }
5558
56- public static boolean validJanusGraphHas (Iterable <HasContainer > has ) {
59+ static boolean validJanusGraphHas (Iterable <HasContainer > has ) {
5760 for (HasContainer h : has ) {
5861 if (!validJanusGraphHas (h )) return false ;
5962 }
6063 return true ;
6164 }
6265
63- public static boolean validJanusGraphOrder (OrderGlobalStep ostep , Traversal rootTraversal ,
66+ static boolean validJanusGraphOrder (OrderGlobalStep ostep , Traversal rootTraversal ,
6467 boolean isVertexOrder ) {
6568 for (Pair <Traversal .Admin <Object , Comparable >, Comparator <Comparable >> comp : (List <Pair <Traversal .Admin <Object , Comparable >, Comparator <Comparable >>>) ostep .getComparators ()) {
6669 if (!(comp .getValue1 () instanceof ElementValueComparator )) return false ;
@@ -76,8 +79,29 @@ public static boolean validJanusGraphOrder(OrderGlobalStep ostep, Traversal root
7679 return true ;
7780 }
7881
79- public static void foldInHasContainer (final HasStepFolder janusgraphStep , final Traversal .Admin <?, ?> traversal ) {
82+ static void foldInIds (final HasStepFolder janusgraphStep , final Traversal .Admin <?, ?> traversal ) {
83+ Step <?, ?> currentStep = janusgraphStep .getNextStep ();
84+ while (true ) {
85+ if (currentStep instanceof HasContainerHolder ) {
86+ for (final HasContainer hasContainer : ((HasContainerHolder ) currentStep ).getHasContainers ()) {
87+ if (GraphStep .processHasContainerIds ((GraphStep ) janusgraphStep , hasContainer )) {
88+ currentStep .getLabels ().forEach (janusgraphStep ::addLabel );
89+ traversal .removeStep (currentStep );
90+ }
91+ }
92+ }
93+ else if (currentStep instanceof IdentityStep ) {
94+ // do nothing, has no impact
95+ } else if (currentStep instanceof NoOpBarrierStep ) {
96+ // do nothing, has no impact
97+ } else {
98+ break ;
99+ }
100+ currentStep = currentStep .getNextStep ();
101+ }
102+ }
80103
104+ static void foldInHasContainer (final HasStepFolder janusgraphStep , final Traversal .Admin <?, ?> traversal ) {
81105 Step <?, ?> currentStep = janusgraphStep .getNextStep ();
82106 while (true ) {
83107 if (currentStep instanceof HasContainerHolder ) {
@@ -89,6 +113,8 @@ public static void foldInHasContainer(final HasStepFolder janusgraphStep, final
89113 }
90114 } else if (currentStep instanceof IdentityStep ) {
91115 // do nothing, has no impact
116+ } else if (currentStep instanceof NoOpBarrierStep ) {
117+ // do nothing, has no impact
92118 } else {
93119 break ;
94120 }
@@ -105,7 +131,7 @@ public static void foldInHasContainer(final HasStepFolder janusgraphStep, final
105131// } else return false;
106132// }
107133
108- public static void foldInOrder (final HasStepFolder janusgraphStep , final Traversal .Admin <?, ?> traversal ,
134+ static void foldInOrder (final HasStepFolder janusgraphStep , final Traversal .Admin <?, ?> traversal ,
109135 final Traversal <?, ?> rootTraversal , boolean isVertexOrder ) {
110136 Step <?, ?> currentStep = janusgraphStep .getNextStep ();
111137 OrderGlobalStep <?, ?> lastOrder = null ;
@@ -120,6 +146,8 @@ public static void foldInOrder(final HasStepFolder janusgraphStep, final Travers
120146 // do nothing, can be skipped
121147 } else if (currentStep instanceof HasStep ) {
122148 // do nothing, can be skipped
149+ } else if (currentStep instanceof NoOpBarrierStep ) {
150+ // do nothing, can be skipped
123151 } else {
124152 break ;
125153 }
@@ -139,7 +167,7 @@ public static void foldInOrder(final HasStepFolder janusgraphStep, final Travers
139167 }
140168 }
141169
142- public static class OrderEntry {
170+ class OrderEntry {
143171
144172 public final String key ;
145173 public final Order order ;
@@ -150,7 +178,7 @@ public OrderEntry(String key, Order order) {
150178 }
151179 }
152180
153- public static <E extends Ranging > void foldInRange (final HasStepFolder janusgraphStep , final Traversal .Admin <?, ?> traversal ) {
181+ static <E extends Ranging > void foldInRange (final HasStepFolder janusgraphStep , final Traversal .Admin <?, ?> traversal ) {
154182 Step <?, ?> nextStep = JanusGraphTraversalUtil .getNextNonIdentityStep (janusgraphStep );
155183
156184 if (nextStep instanceof RangeGlobalStep ) {
0 commit comments