コード例 #1
0
        public virtual IGraphQueryStep Visit(IGraphQueryStep root)
        {
            _token.ThrowIfCancellationRequested();

            switch (root)
            {
            case QueryQueryStep qqs:
                return(VisitQueryQueryStep(qqs));

            case EdgeQueryStep eqs:
                return(VisitEdgeQueryStep(eqs));

            case CollectionDestinationQueryStep cdqs:
                return(VisitCollectionDestinationQueryStep(cdqs));

            case IntersectionQueryStep <Except> iqse:
                return(VisitIntersectionQueryStepExcept(iqse));

            case IntersectionQueryStep <Union> iqsu:
                return(VisitIntersectionQueryStepUnion(iqsu));

            case IntersectionQueryStep <Intersection> iqsi:
                return(VisitIntersectionQueryStepIntersection(iqsi));

            case RecursionQueryStep rqs:
                return(VisitRecursionQueryStep(rqs));

            default:
                throw new NotSupportedException($"Unexpected type {root.GetType().Name} for QueryPlanRewriter.Visit");
            }
        }
コード例 #2
0
 public SingleEdgeMatcher(SingleEdgeMatcher step, IGraphQueryStep right)
 {
     Right           = right;
     QueryParameters = step.QueryParameters;
     IncludedEdges   = new Dictionary <string, Sparrow.Json.BlittableJsonReaderObject>(StringComparer.OrdinalIgnoreCase);
     Results         = new List <Match>();
     Edge            = step.Edge;
     EdgeAlias       = step.EdgeAlias;
 }
コード例 #3
0
ファイル: SingleEdgeMatcher.cs プロジェクト: radtek/ravendb
 public SingleEdgeMatcher(SingleEdgeMatcher step, IGraphQueryStep right, char identityPartsSeparator)
 {
     Right = right;
     _identityPartsSeparator = identityPartsSeparator;
     QueryParameters         = step.QueryParameters;
     IncludedEdges           = new Dictionary <string, BlittableJsonReaderObject>(StringComparer.OrdinalIgnoreCase);
     Results   = new List <Match>();
     Edge      = step.Edge;
     EdgeAlias = step.EdgeAlias;
 }
コード例 #4
0
        private IGraphQueryStep BuildQueryPlanForRecursiveEdge(IGraphQueryStep left, int index, PatternMatchElementExpression patternExpression)
        {
            var recursive = patternExpression.Path[index].Recursive.Value;
            var pattern   = recursive.Pattern;
            var steps     = new List <SingleEdgeMatcher>((pattern.Count + 1) / 2);

            for (int i = 0; i < pattern.Count; i += 2)
            {
                if (GraphQuery.WithEdgePredicates.TryGetValue(pattern[i].Alias, out var recursiveEdge) == false)
                {
                    throw new InvalidOperationException($"BuildQueryPlanForEdge was invoked for recursive alias='{pattern[i].Alias}' which suppose to be an edge but no corresponding WITH EDGE clause was found.");
                }

                steps.Add(new SingleEdgeMatcher
                {
                    IncludedEdges   = new Dictionary <string, Sparrow.Json.BlittableJsonReaderObject>(StringComparer.OrdinalIgnoreCase),
                    QueryParameters = _query.QueryParameters,
                    Edge            = recursiveEdge,
                    Results         = new List <Match>(),
                    Right           = i + 1 < pattern.Count ? BuildQueryPlanForMatchNode(pattern[i + 1]) : null,
                    EdgeAlias       = pattern[i].Alias
                });
            }

            var recursiveStep = new RecursionQueryStep(left, steps, recursive, recursive.GetOptions(_query.Metadata, _query.QueryParameters), _token)
            {
                CollectIntermediateResults = CollectIntermediateResults
            };

            if (index + 1 < patternExpression.Path.Length)
            {
                if (patternExpression.Path[index + 1].Recursive.HasValue)
                {
                    throw new InvalidQueryException("Two adjacent 'recursive' queries are not allowed", GraphQuery.QueryText);
                }

                if (patternExpression.Path[index + 1].IsEdge)
                {
                    var nextPlan = BuildQueryPlanForPattern(patternExpression, index + 2);
                    nextPlan = BuildQueryPlanForEdge(recursiveStep, nextPlan, patternExpression.Path[index + 1]);
                    recursiveStep.SetNext(nextPlan.GetSingleGraphStepExecution());
                }
                else
                {
                    var nextPlan = BuildQueryPlanForPattern(patternExpression, index + 1);
                    recursiveStep.SetNext(nextPlan.GetSingleGraphStepExecution());
                }
            }


            return(recursiveStep);
        }
コード例 #5
0
        private IGraphQueryStep BuildQueryPlanForEdge(IGraphQueryStep left, IGraphQueryStep right, MatchPath edge)
        {
            var alias = edge.Alias;

            if (GraphQuery.WithEdgePredicates.TryGetValue(alias, out var withEdge) == false)
            {
                throw new InvalidOperationException($"BuildQueryPlanForEdge was invoked for alias='{alias}' which suppose to be an edge but no corresponding WITH EDGE clause was found.");
            }

            return(new EdgeQueryStep(left, right, withEdge, edge, _query.QueryParameters, _token)
            {
                CollectIntermediateResults = CollectIntermediateResults
            });
        }
コード例 #6
0
ファイル: EdgeQueryStep.cs プロジェクト: yitaom2/ravendb
        public EdgeQueryStep(IGraphQueryStep left, IGraphQueryStep right, EdgeQueryStep eqs, OperationCancelToken token)
        {
            _left    = left;
            _right   = right;
            _aliases = new HashSet <string>();

            _aliases.UnionWith(_left.GetAllAliases());
            _aliases.UnionWith(_right.GetAllAliases());
            _aliases.Add(eqs._edgePath.Alias.Value);

            _edgePath        = eqs._edgePath;
            _queryParameters = eqs._queryParameters;
            _edgesExpression = eqs._edgesExpression;


            _outputAlias = _right.GetOutputAlias();
            _token       = token;
        }
コード例 #7
0
ファイル: EdgeQueryStep.cs プロジェクト: yitaom2/ravendb
        public EdgeQueryStep(IGraphQueryStep left, IGraphQueryStep right, WithEdgesExpression edgesExpression, MatchPath edgePath, BlittableJsonReaderObject queryParameters, OperationCancelToken token)
        {
            _left  = left;
            _right = right;

            _aliases = new HashSet <string>();

            _aliases.UnionWith(_left.GetAllAliases());
            _aliases.UnionWith(_right.GetAllAliases());
            _aliases.Add(edgePath.Alias.Value);

            _edgePath        = edgePath;
            _queryParameters = queryParameters;
            _edgesExpression = edgesExpression;

            _outputAlias = _right.GetOutputAlias();
            _token       = token;
        }
コード例 #8
0
        public IntersectionQueryStep(IGraphQueryStep left, IGraphQueryStep right, OperationCancelToken token, bool returnEmptyIfRightEmpty = false, bool returnEmptyIfLeftEmpty = true)
        {
            _returnEmptyIfLeftEmpty  = returnEmptyIfLeftEmpty;
            _returnEmptyIfRightEmpty = returnEmptyIfRightEmpty;
            _unionedAliases          = new HashSet <string>();
            _unionedAliases.UnionWith(left.GetAllAliases());
            _unionedAliases.UnionWith(right.GetAllAliases());

            var tmpIntersection = new HashSet <string>(left.GetAllAliases());

            tmpIntersection.IntersectWith(right.GetAllAliases());

            _intersectedAliases = tmpIntersection.ToList();

            _left  = left;
            _right = right;
            _token = token;
        }
コード例 #9
0
        public virtual async Task VisitAsync(IGraphQueryStep root)
        {
            switch (root)
            {
            case QueryQueryStep qqs:
                VisitQueryQueryStep(qqs);
                return;

            case EdgeQueryStep eqs:
                await VisitEdgeQueryStepAsync(eqs);

                return;

            case CollectionDestinationQueryStep cdqs:
                VisitCollectionDestinationQueryStep(cdqs);
                return;

            case IntersectionQueryStep <Except> iqse:
                await VisitIntersectionQueryStepExceptAsync(iqse);

                return;

            case IntersectionQueryStep <Union> iqsu:
                await VisitIntersectionQueryStepUnionAsync(iqsu);

                return;

            case IntersectionQueryStep <Intersection> iqsi:
                await VisitIntersectionQueryStepIntersectionAsync(iqsi);

                return;

            case RecursionQueryStep rqs:
                await VisitRecursionQueryStepAsync(rqs);

                return;

            default:
                throw new NotSupportedException($"Unexpected type {root.GetType().Name} for QueryPlanVisitor.Visit");
            }
        }
コード例 #10
0
        public RecursionQueryStep(IGraphQueryStep left, RecursionQueryStep rqs, OperationCancelToken token)
        {
            _left      = left;
            _steps     = rqs._steps;
            _recursive = rqs._recursive;
            _options   = rqs._options;

            _stepAliases.Add(left.GetOutputAlias());

            foreach (var step in _steps)
            {
                if (step.Right == null)
                {
                    continue;
                }
                _stepAliases.Add(step.Right.GetOutputAlias());
            }

            _outputAlias = _stepAliases.Last();
            _token       = token;
        }
コード例 #11
0
        public RecursionQueryStep(IGraphQueryStep left, List <SingleEdgeMatcher> steps, RecursiveMatch recursive, RecursiveMatch.RecursiveOptions options, OperationCancelToken token)
        {
            _left      = left;
            _steps     = steps;
            _recursive = recursive;
            _options   = options;

            _stepAliases.Add(left.GetOutputAlias());

            foreach (var step in _steps)
            {
                if (step.Right == null)
                {
                    continue;
                }
                _stepAliases.Add(step.Right.GetOutputAlias());
            }

            _outputAlias = _stepAliases.Last();
            _allLliases.UnionWith(_left.GetAllAliases());
            _allLliases.Add(_recursive.Alias.Value);
            _token = token;
        }
コード例 #12
0
 public void BuildQueryPlan()
 {
     new GraphQuerySyntaxValidatorVisitor(GraphQuery).Visit(_query.Metadata.Query); //this will throw if the syntax will be bad
     RootQueryStep = BuildQueryPlanForExpression(_query.Metadata.Query.GraphQuery.MatchClause);
     ClearUniqueQueriesFromIdenticalQueries();
 }
コード例 #13
0
        public void OptimizeQueryPlan()
        {
            var cdqsr = new EdgeCollectionDestinationRewriter(_database.DocumentsStorage, _token);

            RootQueryStep = cdqsr.Visit(RootQueryStep);
        }
コード例 #14
0
 public void Set(IGraphQueryStep left, IGraphQueryStep right)
 {
     _leftAliases  = left.GetAllAliases();
     _rightAliases = right.GetAllAliases();
 }