예제 #1
0
        public static IGremlinQuery EmitProperty(this IGremlinQuery query,
                                                 string propertyName)
        {
            IGremlinQuery newQuery = query.AddBlock(string.Format(".{0}", propertyName));

            return(newQuery);
        }
        public IGremlinQuery Apply(IGremlinQuery query)
        {
            var environment = query.AsAdmin().Environment;
            var anonymous   = GremlinQuery.Anonymous(environment);

            var vertexCriterionTraversal = _vertexCriterion(anonymous.AsAdmin().ChangeQueryType <IVertexGremlinQuery <IVertex> >());
            var edgeCriterionTraversal   = _edgeCriterion(anonymous.AsAdmin().ChangeQueryType <IEdgeGremlinQuery <IEdge> >());

            if (vertexCriterionTraversal.AsAdmin().Steps.Count > 1 || edgeCriterionTraversal.AsAdmin().Steps.Count > 1)
            {
                var strategy = GremlinQuery.Create <Unit>("SubgraphStrategy", environment)
                               .AddStep(BuildStep.Instance);

                if (vertexCriterionTraversal.AsAdmin().Steps.Count > 1)
                {
                    strategy = strategy.AddStep(new VerticesStep(vertexCriterionTraversal));
                }

                if (edgeCriterionTraversal.AsAdmin().Steps.Count > 1)
                {
                    strategy = strategy.AddStep(new EdgesStep(edgeCriterionTraversal));
                }

                return(query
                       .AddStep(new WithStrategiesStep(strategy.AddStep(CreateStep.Instance))));
            }

            return(query);
        }
예제 #3
0
 public IAsyncEnumerable <TElement> Execute <TElement>(IGremlinQuery <TElement> query)
 {
     return(AsyncEnumerable
            .Return(JToken.Parse(_json))
            .GraphsonDeserialize <TElement[]>(new GraphsonDeserializer(query.AsAdmin().Model))
            .SelectMany(x => x.ToAsyncEnumerable()));
 }
예제 #4
0
            private IGremlinQuery Create()
            {
                var startQuery = Volatile.Read(ref _startQuery);

                if (startQuery != null)
                {
                    return(startQuery);
                }

                IGremlinQuery ret = GremlinQuery.Create(
                    Model,
                    Executor,
                    Name,
                    Logger);

                if (!ExcludedStrategyNames.IsEmpty)
                {
                    ret = ret.AddStep(new WithoutStrategiesStep(ExcludedStrategyNames.ToArray()));
                }

                foreach (var strategy in IncludedStrategies)
                {
                    ret = strategy.Apply(ret);
                }

                return(Interlocked.CompareExchange(ref _startQuery, ret, null) ?? ret);
            }
예제 #5
0
        public static IEnumerable <TResult> Table <TResult>(
            this IGremlinQuery query) where TResult : new()
        {
            var newQuery = query.AddBlock(".table(new Table()).cap");

            return(new GremlinProjectionEnumerable <TResult>(newQuery));
        }
예제 #6
0
        public static IGremlinNodeQuery <TNode> In <TNode>(this IGremlinQuery query, string label, IEnumerable <Filter> filters, StringComparison comparison = StringComparison.OrdinalIgnoreCase)
        {
            var newQuery    = query.AddBlock(@in, label);
            var filterQuery = newQuery.AddFilterBlock(string.Empty, filters, comparison);

            return(new GremlinNodeEnumerable <TNode>(filterQuery));
        }
예제 #7
0
        public static IGremlinRelationshipQuery <TData> OutE <TData>(this IGremlinQuery query, string label, Expression <Func <TData, bool> > filter, StringComparison comparison = StringComparison.OrdinalIgnoreCase)
            where TData : class, new()
        {
            var filters = FilterFormatters.TranslateFilter(filter);

            return(query.OutE <TData>(label, filters, comparison));
        }
예제 #8
0
        public static IGremlinRelationshipQuery <TData> BackE <TData>(this IGremlinQuery query, string label)
            where TData : class, new()
        {
            var newQuery = query.AddBlock(".back({0})", label);

            return(new GremlinRelationshipEnumerable <TData>(newQuery));
        }
 public GremlinProjectionEnumerable(IGremlinQuery query)
 {
     queryDeclarations = query.QueryDeclarations;
     client            = query.Client;
     queryText         = query.QueryText;
     queryParameters   = query.QueryParameters;
 }
예제 #10
0
 public static IGremlinQuery <T> AddE <T>(this IGremlinQuery query, string edgeName)
     where T : new()
 {
     return(query
            .AddStep <T>(new AddEStringGremlinStep(edgeName))
            .AddStep <T>(new AddElementPropertiesStep(new T())));
 }
        public IGremlinQuery Apply(IGremlinQuery query)
        {
            var admin     = query.AsAdmin();
            var anonymous = GremlinQuery.Anonymous(admin.Model);

            var vertexCriterionTraversal = _vertexCriterion(anonymous.AsAdmin().ChangeQueryType <IVertexGremlinQuery <IVertex> >());
            var edgeCriterionTraversal   = _edgeCriterion(anonymous.AsAdmin().ChangeQueryType <IEdgeGremlinQuery <IEdge> >());

            if (vertexCriterionTraversal.AsAdmin().Steps.Count > 0 || edgeCriterionTraversal.AsAdmin().Steps.Count > 0)
            {
                var strategy = GremlinQuery.Create <Unit>(admin.Model, GremlinQueryExecutor.Invalid, "SubgraphStrategy")
                               .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);
        }
예제 #12
0
        private static void Main()
        {
            ICayleyClient client = new CayleyClient("http://localhost:64210/api/v1/query/gremlin");
            IGraphObject  g      = new GraphObject();
            IGremlinQuery query  = g.V().Has("name", "Casablanca")
                                   .Out("/film/film/starring")
                                   .Out("/film/performance/actor")
                                   .Out("name")
                                   .All();
            CayleyResponse response = client.Send(query);

            System.Console.WriteLine(response.Content);

            System.Console.WriteLine("--------------------------------------------------------------------------------");

            var           filmToActor       = g.Morphism().Out("/film/film/starring").Out("/film/performance/actor");
            IGremlinQuery queryWithMorphism = g.V()
                                              .Has("name", "Casablanca")
                                              .Follow(filmToActor)
                                              .Out("name")
                                              .All();
            CayleyResponse morpResponse = client.Send(queryWithMorphism);

            System.Console.WriteLine(morpResponse.Content);

            System.Console.WriteLine("--------------------------------------------------------------------------------");

            string         emitQuery    = g.Emit(new { name = "John Doe", age = 25, hasRoom = true });
            CayleyResponse emitResponse = client.Send(emitQuery);

            System.Console.WriteLine(emitResponse.Content);
            System.Console.ReadLine();
        }
 public GremlinRelationshipEnumerable(IGremlinQuery query)
 {
     client            = query.Client;
     queryText         = query.QueryText;
     queryParameters   = query.QueryParameters;
     queryDeclarations = query.QueryDeclarations;
 }
예제 #14
0
        public void Vertext_HasStep_Test()
        {
            IGremlinQuery query = g.V().Has("name", "Casablanca");

            query.Build().Should().NotBeNullOrWhiteSpace();
            query.Build().Should().Be(@"g.V().Has('name','Casablanca')");
        }
예제 #15
0
        public void Vertext_Out_Step_Test()
        {
            IGremlinQuery query = g.V().Has("name", "Casablanca").Out("/film/film/starring").Out("/film/performance/actor").Out("name");

            query.Build().Should().NotBeNullOrWhiteSpace();
            query.Build().Should().Be(@"g.V().Has('name','Casablanca').Out('/film/film/starring').Out('/film/performance/actor').Out('name')");
        }
예제 #16
0
        public static IGremlinRelationshipQuery <TData> LoopE <TData>(this IGremlinQuery query, string label, uint loopCount)
            where TData : class, new()
        {
            var newQuery = query.AddBlock(".loop({0}){{ it.loops < {1} }}", label, loopCount);

            return(new GremlinRelationshipEnumerable <TData>(newQuery));
        }
예제 #17
0
        public static IGremlinRelationshipQuery <TData> ExceptE <TData>(this IGremlinQuery query, string variable)
            where TData : class, new()
        {
            var newQuery = query.AddBlock(string.Format(".except({0})", variable));

            return(new GremlinRelationshipEnumerable <TData>(newQuery));
        }
        static string RebuildParametersAndDeclarations(IGremlinQuery query, Dictionary <string, object> paramsDictionary,
                                                       List <string> declarations, ref int nextParamaterIndex, ref string rootQuery)
        {
            var updatedIndex = nextParamaterIndex;
            var paramNames   = new List <string>();

            declarations.AddRange(query.QueryDeclarations);
            var modifiedQueryText = ParameterReferenceRegex.Replace(
                query.QueryText,
                m =>
            {
                var parameterIndex = updatedIndex;
                updatedIndex++;

                var oldParamKey = m.Value;
                var newParamKey = string.Format("p{0}", parameterIndex);

                paramNames.Add(newParamKey);
                paramsDictionary.Add(newParamKey, query.QueryParameters[oldParamKey]);

                return(newParamKey);
            });

            nextParamaterIndex = updatedIndex;

            foreach (var declareStatement in query.QueryDeclarations)
            {
                rootQuery         = declareStatement + rootQuery;
                modifiedQueryText = modifiedQueryText.Replace(declareStatement, string.Empty);
            }
            return(modifiedQueryText);
        }
예제 #19
0
        public static IGremlinRelationshipQuery <TData> OutE <TData>(this IGremlinQuery query, IEnumerable <Filter> filters, StringComparison comparison = StringComparison.OrdinalIgnoreCase)
            where TData : class, new()
        {
            var newQuery = query.AddFilterBlock(outE, filters, comparison);

            return(new GremlinRelationshipEnumerable <TData>(newQuery));
        }
 public static IGremlinQuery PrependVariablesToBlock(this IGremlinQuery baseQuery, IGremlinQuery query)
 {
     var declarations = query
         .QueryDeclarations
         .Aggregate(string.Empty, (current, declaration) => !baseQuery.QueryText.Contains(declaration) ? declaration + current : current);
     return new GremlinQuery(baseQuery.Client, declarations + baseQuery.QueryText, baseQuery.QueryParameters, query.QueryDeclarations);
 }
예제 #21
0
        public static IGremlinRelationshipQuery IfThenElse(this IGremlinQuery baseQuery, IGremlinQuery ifExpression, IGremlinQuery ifThen, IGremlinQuery ifElse)
        {
            ifThen = ifThen ?? new GremlinQuery(baseQuery.Client, string.Empty, new Dictionary<string, object>(), new List<string>());
            ifElse = ifElse ?? new GremlinQuery(baseQuery.Client, string.Empty, new Dictionary<string, object>(), new List<string>());

            if (ifExpression.GetType() == typeof(IdentityPipe))
                ((IdentityPipe)ifExpression).Client = ifExpression.Client;

            if (ifExpression.GetType() == typeof(GremlinIterator))
                ((GremlinIterator)ifExpression).Client = ifExpression.Client;

            if (ifThen.GetType() == typeof(IdentityPipe))
                ((IdentityPipe)ifThen).Client = ifThen.Client;

            if (ifThen.GetType() == typeof(GremlinIterator))
                ((GremlinIterator)ifThen).Client = ifThen.Client;

            if (ifElse.GetType() == typeof(IdentityPipe))
                ((IdentityPipe)ifElse).Client = ifElse.Client;

            if (ifElse.GetType() == typeof(GremlinIterator))
                ((GremlinIterator)ifElse).Client = ifElse.Client;

            baseQuery = baseQuery.AddIfThenElseBlock(".ifThenElse{{{0}}}{{{1}}}{{{2}}}", ifExpression, ifThen, ifElse);
            return new GremlinRelationshipEnumerable(baseQuery);
        }
예제 #22
0
        public static IGremlinQuery BothE(this IGremlinQuery query,
                                          IEnumerable <Filter> filters, StringComparison comparison = StringComparison.OrdinalIgnoreCase)
        {
            IGremlinQuery newQuery = query.AddFilterBlock(BOTH_E, filters, comparison);

            return(newQuery);
        }
예제 #23
0
 public static Task <T> FirstAsync <T>(this IGremlinQuery <T> query, ITypedGremlinQueryProvider provider, CancellationToken ct = default(CancellationToken))
 {
     return(query
            .Limit(1)
            .Execute(provider)
            .First(ct));
 }
예제 #24
0
        public static IGremlinRelationshipQuery <TData> InE <TData>(this IGremlinQuery query)
            where TData : class, new()
        {
            var newQuery = query.AddBlock(inE);

            return(new GremlinRelationshipEnumerable <TData>(newQuery));
        }
예제 #25
0
        public static IEnumerable <TResult> Table <TResult, TClosure1, TClosure2, TClosure3, TClosure4, TClosure5, TClosure6, TClosure7, TClosure8, TClosure9, TClosure10>(
            this IGremlinQuery query,
            Expression <Func <TClosure1, object> > closure1,
            Expression <Func <TClosure2, object> > closure2,
            Expression <Func <TClosure3, object> > closure3,
            Expression <Func <TClosure4, object> > closure4,
            Expression <Func <TClosure5, object> > closure5,
            Expression <Func <TClosure6, object> > closure6,
            Expression <Func <TClosure7, object> > closure7,
            Expression <Func <TClosure8, object> > closure8,
            Expression <Func <TClosure9, object> > closure9,
            Expression <Func <TClosure10, object> > closure10) where TResult : new()
        {
            var newQuery = query.AddBlock(".table(new Table())");

            newQuery = AddClosure(newQuery, closure1);
            newQuery = AddClosure(newQuery, closure2);
            newQuery = AddClosure(newQuery, closure3);
            newQuery = AddClosure(newQuery, closure4);
            newQuery = AddClosure(newQuery, closure5);
            newQuery = AddClosure(newQuery, closure6);
            newQuery = AddClosure(newQuery, closure7);
            newQuery = AddClosure(newQuery, closure8);
            newQuery = AddClosure(newQuery, closure9);
            newQuery = AddClosure(newQuery, closure10);
            newQuery = newQuery.AddBlock(".cap");
            return(new GremlinProjectionEnumerable <TResult>(newQuery));
        }
        public static IGremlinQuery PrependVariablesToBlock(this IGremlinQuery baseQuery, IGremlinQuery query)
        {
            var declarations = query
                               .QueryDeclarations
                               .Aggregate(string.Empty, (current, declaration) => !baseQuery.QueryText.Contains(declaration) ? declaration + current : current);

            return(new GremlinQuery(baseQuery.Client, declarations + baseQuery.QueryText, baseQuery.QueryParameters, query.QueryDeclarations));
        }
예제 #27
0
        public static IGremlinRelationshipQuery InE(this IGremlinQuery query, string label)
        {
            var filter = GetFilter(label);

            var newQuery = query.AddFilterBlock(inE, new[] { filter }, StringComparison.Ordinal);

            return(new GremlinRelationshipEnumerable(newQuery));
        }
예제 #28
0
        public static IGremlinNodeQuery <TNode> In <TNode>(this IGremlinQuery query, string label, Expression <Func <TNode, bool> > filter, StringComparison comparison = StringComparison.OrdinalIgnoreCase)
        {
            var newQuery    = query.AddBlock(@in, label);
            var filters     = FilterFormatters.TranslateFilter(filter);
            var filterQuery = newQuery.AddFilterBlock(string.Empty, filters, comparison);

            return(new GremlinNodeEnumerable <TNode>(filterQuery));
        }
예제 #29
0
        public static IGremlinNodeQuery <TNode> AggregateV <TNode>(this IGremlinQuery query, string variable)
        {
            var newQuery = query.AddBlock(string.Format(".aggregate({0})", variable));

            newQuery.QueryDeclarations.Add(string.Format("{0} = [];", variable));
            newQuery = newQuery.PrependVariablesToBlock(newQuery);
            return(new GremlinNodeEnumerable <TNode>(newQuery));
        }
예제 #30
0
        public static IGremlinQuery <TTarget> As <TSource, TTarget>(this IGremlinQuery <TSource> query, Func <IGremlinQuery <TSource>, StepLabel <TSource>, IGremlinQuery <TTarget> > continuation)
        {
            var stepLabel = query.IdentifierFactory.CreateStepLabel <TSource>();

            return(continuation(
                       query.As(stepLabel),
                       stepLabel));
        }
예제 #31
0
        public static IGremlinQuery BothE(this IGremlinQuery query, string label)
        {
            Filter filter = GetFilter(label);

            IGremlinQuery newQuery = query.AddFilterBlock(BOTH_E, new[] { filter }, StringComparison.Ordinal);

            return(newQuery);
        }
예제 #32
0
        public static IGremlinRelationshipQuery AggregateE(this IGremlinQuery query, string variable)
        {
            var newQuery = query.AddBlock(string.Format(".aggregate({0})", variable));

            newQuery.QueryDeclarations.Add(string.Format("{0} = [];", variable));
            newQuery = newQuery.PrependVariablesToBlock(newQuery);
            return(new GremlinRelationshipEnumerable(newQuery));
        }
예제 #33
0
        public static IGremlinQuery IfThenElse(this IGremlinQuery baseQuery, IGremlinQuery ifExpression,
            IGremlinQuery ifThen, IGremlinQuery ifElse)
        {
            ifThen = ifThen ?? new GremlinQuery(string.Empty, new Dictionary<string, object>(), new List<string>());
            ifElse = ifElse ?? new GremlinQuery(string.Empty, new Dictionary<string, object>(), new List<string>());


            baseQuery = baseQuery.AddIfThenElseBlock(".ifThenElse{{{0}}}{{{1}}}{{{2}}}", ifExpression, ifThen, ifElse);
            return baseQuery;

        }
        public static IGremlinQuery AddIfThenElseBlock(this IGremlinQuery baseQuery, string ifThenElseText, IGremlinQuery ifExpression, IGremlinQuery ifThen, IGremlinQuery ifElse)
        {
            var declarations = new List<string>();
            var rootQuery = baseQuery.QueryText;
            var paramsDictionary = new Dictionary<string, object>(baseQuery.QueryParameters);
            var nextParameterIndex = baseQuery.QueryParameters.Count;

            var modifiedQueryTextifExpression = RebuildParametersAndDeclarations(ifExpression, paramsDictionary, declarations, ref nextParameterIndex, ref rootQuery);
            var modifiedQueryTextifThen = RebuildParametersAndDeclarations(ifThen, paramsDictionary, declarations, ref nextParameterIndex, ref rootQuery);
            var modifiedQueryTextifElse = RebuildParametersAndDeclarations(ifElse, paramsDictionary, declarations, ref nextParameterIndex, ref rootQuery);

            var newQueryText = string.Format(ifThenElseText, modifiedQueryTextifExpression, modifiedQueryTextifThen, modifiedQueryTextifElse);

            return new GremlinQuery(baseQuery.Client, rootQuery + newQueryText, paramsDictionary, declarations);
        }
        public static IGremlinQuery AddCopySplitBlock(this IGremlinQuery baseQuery, string text, IGremlinQuery[] queries)
        {
            var declarations = new List<string>();
            var rootQuery = baseQuery.QueryText;
            var inlineQueries = new List<string>();

            var paramsDictionary = new Dictionary<string, object>(baseQuery.QueryParameters);
            var nextParameterIndex = baseQuery.QueryParameters.Count;

            foreach (var query in queries)
            {
                var modifiedQueryText = RebuildParametersAndDeclarations(query, paramsDictionary, declarations, ref nextParameterIndex, ref rootQuery);
                inlineQueries.Add(modifiedQueryText);
            }

            var splitBlockQueries = string.Format(text, inlineQueries.ToArray());

            return new GremlinQuery(baseQuery.Client, rootQuery + splitBlockQueries, paramsDictionary, declarations);
        }
예제 #36
0
 public static IGremlinQuery Follow(this IGremlinQuery query, IGremlinQuery morphismQuery)
 {
     IGremlinQuery newQuery = query.AddBlock(string.Format(".Follow({0})", morphismQuery.Build()));
     return newQuery;
 } 
        static string RebuildParametersAndDeclarations(IGremlinQuery query, Dictionary<string, object> paramsDictionary,
            List<string> declarations, ref int nextParamaterIndex, ref string rootQuery)
        {
            var updatedIndex = nextParamaterIndex;
            var paramNames = new List<string>();

            declarations.AddRange(query.QueryDeclarations);
            var modifiedQueryText = ParameterReferenceRegex.Replace(
                query.QueryText,
                m =>
                {
                    var parameterIndex = updatedIndex;
                    updatedIndex++;

                    var oldParamKey = m.Value;
                    var newParamKey = string.Format("p{0}", parameterIndex);

                    paramNames.Add(newParamKey);
                    paramsDictionary.Add(newParamKey, query.QueryParameters[oldParamKey]);

                    return newParamKey;
                });

            nextParamaterIndex = updatedIndex;

            foreach (var declareStatement in query.QueryDeclarations)
            {
                rootQuery = declareStatement + rootQuery;
                modifiedQueryText = modifiedQueryText.Replace(declareStatement, string.Empty);
            }
            return modifiedQueryText;
        }
 public GremlinNodeEnumerable(IGremlinQuery query)
 {
     queryText = query.QueryText;
     queryParameters = query.QueryParameters;
     queryDeclarations = query.QueryDeclarations;
 }
예제 #39
0
 public CayleyResponse Send(IGremlinQuery query)
 {
     string queryText = query.Build();
     return Send(queryText);
 }