public IGremlinQueryBase Apply(IGremlinQueryBase query) { var environment = query.AsAdmin().Environment; var anonymous = GremlinQuery.Anonymous(environment); var vertexCriterionTraversal = _vertexCriterion(anonymous.AsAdmin().ChangeQueryType <IVertexGremlinQuery <object> >()); var edgeCriterionTraversal = _edgeCriterion(anonymous.AsAdmin().ChangeQueryType <IEdgeGremlinQuery <object> >()); if (vertexCriterionTraversal.AsAdmin().Steps.Count > 0 || edgeCriterionTraversal.AsAdmin().Steps.Count > 0) { var strategy = GremlinQuery.Create <object>(environment) .AddStep(BuildStep.Instance); if (vertexCriterionTraversal.AsAdmin().Steps.Count > 0) { strategy = strategy.AddStep(new VerticesStep(vertexCriterionTraversal)); } if (edgeCriterionTraversal.AsAdmin().Steps.Count > 0) { strategy = strategy.AddStep(new EdgesStep(edgeCriterionTraversal)); } return(query .AddStep(new WithStrategiesStep(strategy.AddStep(CreateStep.Instance)))); } return(query); }
private IGremlinQueryBase Create() { var startQuery = Volatile.Read(ref _startQuery); if (startQuery != null) { return(startQuery); } IGremlinQueryBase ret = GremlinQuery.Create <object>(Environment); if (!ExcludedStrategyTypes.IsEmpty) { ret = ret.AddStep(new WithoutStrategiesStep(ExcludedStrategyTypes.ToArray())); } foreach (var strategy in IncludedStrategies) { ret = strategy.Apply(ret); } return(Interlocked.CompareExchange(ref _startQuery, ret, null) ?? ret); }