protected virtual void FlattenSubQuery(
            SubQueryExpression subQueryExpression, FromClauseBase fromClause, QueryModel queryModel, int destinationIndex)
        {
            ArgumentUtility.CheckNotNull("subQueryExpression", subQueryExpression);
            ArgumentUtility.CheckNotNull("fromClause", fromClause);
            ArgumentUtility.CheckNotNull("queryModel", queryModel);

            CheckFlattenable(subQueryExpression.QueryModel);

            var innerMainFromClause = subQueryExpression.QueryModel.MainFromClause;

            CopyFromClauseData(innerMainFromClause, fromClause);

            var innerSelectorMapping = new QuerySourceMapping();

            innerSelectorMapping.AddMapping(fromClause, subQueryExpression.QueryModel.SelectClause.Selector);
            queryModel.TransformExpressions(ex => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(ex, innerSelectorMapping, false));

            InsertBodyClauses(subQueryExpression.QueryModel.BodyClauses, queryModel, destinationIndex);

            var innerBodyClauseMapping = new QuerySourceMapping();

            innerBodyClauseMapping.AddMapping(innerMainFromClause, new QuerySourceReferenceExpression(fromClause));
            queryModel.TransformExpressions(ex => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(ex, innerBodyClauseMapping, false));
        }
        public void VisitUnknownNonExtensionExpression_Ignored()
        {
            var expression = new UnknownExpression(typeof(object));
            var result     = ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(expression, _querySourceMapping, true);

            Assert.That(result, Is.SameAs(expression));
        }
        public void VisitSubQuery_ExpressionUnchanged()
        {
            var expression = new SubQueryExpression(ExpressionHelper.CreateQueryModel <Cook> ());
            var result     = ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(expression, _querySourceMapping, false);

            Assert.That(((SubQueryExpression)result).QueryModel, Is.SameAs(expression.QueryModel));
        }
        public void VisitUnmappedReference_IgnoreTrue_Ignored()
        {
            var expression = new QuerySourceReferenceExpression(ExpressionHelper.CreateMainFromClause_Int());
            var result     = ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(expression, _querySourceMapping, false);

            Assert.That(result, Is.SameAs(expression));
        }
        public void VisitSubQuery_PassesFlagToInner_Throw()
        {
            var expression = new SubQueryExpression(ExpressionHelper.CreateQueryModel <Cook> ());

            expression.QueryModel.SelectClause.Selector = new QuerySourceReferenceExpression(expression.QueryModel.MainFromClause);
            ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(expression, _querySourceMapping, true);
        }
        public void Replaces_NestedExpressions()
        {
            var expression = Expression.Negate(new QuerySourceReferenceExpression(_oldFromClause));
            var result     = (UnaryExpression)ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(expression, _querySourceMapping, true);

            Assert.That(((QuerySourceReferenceExpression)result.Operand).ReferencedQuerySource, Is.SameAs(_newFromClause));
        }
        public void Replaces_QuerySourceReferenceExpressions()
        {
            var expression = new QuerySourceReferenceExpression(_oldFromClause);
            var result     = ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(expression, _querySourceMapping, true);

            Assert.That(((QuerySourceReferenceExpression)result).ReferencedQuerySource, Is.SameAs(_newFromClause));
        }
        protected virtual Expression ReplaceClauseReferences(
            [NotNull] Expression expression, [NotNull] QuerySourceMapping querySourceMapping)
        {
            Check.NotNull(expression, "expression");
            Check.NotNull(querySourceMapping, "querySourceMapping");

            return(ReferenceReplacingExpressionTreeVisitor
                   .ReplaceClauseReferences(expression, querySourceMapping, throwOnUnmappedReferences: false));
        }
        public IEnumerable <T> ExecuteCollection <T>(QueryModel queryModel)
        {
            var itemHolder = new ItemHolder();

            var currentItemExpression = Expression.Property(Expression.Constant(itemHolder), "Current");

            var luceneQueryModel = PrepareQuery(queryModel);

            var mapping = new QuerySourceMapping();

            mapping.AddMapping(queryModel.MainFromClause, currentItemExpression);
            queryModel.TransformExpressions(e => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(e, mapping, throwOnUnmappedReferences: false));

            var projection = GetProjector <T>(queryModel);
            var projector  = projection.Compile();

            var searcherHandle = CheckoutSearcher();

            using (searcherHandle)
            {
                var searcher    = searcherHandle.Searcher;
                var skipResults = luceneQueryModel.SkipResults;
                var maxResults  = Math.Min(luceneQueryModel.MaxResults, searcher.MaxDoc - skipResults);
                var query       = luceneQueryModel.Query;

                var scoreFunction = luceneQueryModel.GetCustomScoreFunction <TDocument>();
                if (scoreFunction != null)
                {
                    query = new DelegatingCustomScoreQuery <TDocument>(query, ConvertDocumentForCustomBoost, scoreFunction);
                }

                var executionContext = new QueryExecutionContext(searcher, query, luceneQueryModel.Filter);

                PrepareSearchSettings(executionContext);

                var hits = searcher.Search(executionContext.Query, executionContext.Filter, maxResults + skipResults, luceneQueryModel.Sort);

                if (luceneQueryModel.Last)
                {
                    skipResults = hits.ScoreDocs.Length - 1;
                    if (skipResults < 0)
                    {
                        yield break;
                    }
                }

                var tracker = luceneQueryModel.DocumentTracker as IRetrievedDocumentTracker <TDocument>;

                executionContext.Phase = QueryExecutionPhase.ConvertResults;
                executionContext.Hits  = hits;

                foreach (var p in EnumerateHits(hits, executionContext, searcher, tracker, itemHolder, skipResults, projector))
                {
                    yield return(p);
                }
            }
        }
        protected override void FlattenSubQuery(
            [NotNull] SubQueryExpression subQueryExpression,
            [NotNull] FromClauseBase fromClause,
            [NotNull] QueryModel queryModel,
            int destinationIndex)
        {
            Check.NotNull(subQueryExpression, nameof(subQueryExpression));
            Check.NotNull(fromClause, nameof(fromClause));
            Check.NotNull(queryModel, nameof(queryModel));

            var subQueryModel = subQueryExpression.QueryModel;

            VisitQueryModel(subQueryModel);

            if (subQueryModel.ResultOperators
                .Any(ro => !(ro is OfTypeResultOperator)) ||
                subQueryModel.BodyClauses.Any(bc => bc is OrderByClause))
            {
                return;
            }

            var innerMainFromClause
                = subQueryExpression.QueryModel.MainFromClause;

            CopyFromClauseData(innerMainFromClause, fromClause);

            var innerSelectorMapping = new QuerySourceMapping();

            innerSelectorMapping.AddMapping(fromClause, subQueryExpression.QueryModel.SelectClause.Selector);

            queryModel.TransformExpressions(
                ex => ReferenceReplacingExpressionTreeVisitor
                .ReplaceClauseReferences(ex, innerSelectorMapping, false));

            InsertBodyClauses(subQueryExpression.QueryModel.BodyClauses, queryModel, destinationIndex);

            var innerBodyClauseMapping = new QuerySourceMapping();

            innerBodyClauseMapping
            .AddMapping(innerMainFromClause, new QuerySourceReferenceExpression(fromClause));

            queryModel.TransformExpressions(ex =>
                                            ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(ex, innerBodyClauseMapping, false));

            foreach (var resultOperator in subQueryModel.ResultOperators.Reverse())
            {
                queryModel.ResultOperators.Insert(0, resultOperator);
            }

            foreach (var queryAnnotation
                     in _queryAnnotations
                     .Where(qa => qa.QuerySource == subQueryExpression.QueryModel.MainFromClause))
            {
                queryAnnotation.QuerySource = fromClause;
            }
        }
        public void VisitExtensionExpression_ChildrenAreProcessed()
        {
            var extensionExpression = new TestExtensionExpression(new QuerySourceReferenceExpression(_oldFromClause));

            var result = (TestExtensionExpression)ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(extensionExpression, _querySourceMapping, true);

            var expectedExpression = new TestExtensionExpression(new QuerySourceReferenceExpression(_newFromClause));

            ExpressionTreeComparer.CheckAreEqualTrees(expectedExpression, result);
        }
Exemplo n.º 12
0
        private static ClientSideSelect CreateClientSideSelect(Expression expression, QueryModel queryModel)
        {
            // TODO - don't like calling GetGenericArguments here...

            var parameter = Expression.Parameter(expression.Type.GetGenericArguments()[0], "inputParameter");

            var mapping = new QuerySourceMapping();

            mapping.AddMapping(queryModel.MainFromClause, parameter);

            var body = ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(queryModel.SelectClause.Selector, mapping, false);

            var lambda = Expression.Lambda(body, parameter);

            return(new ClientSideSelect(lambda));
        }
        public void Replaces_SubQueryExpressions_WithCorrectCloneContext()
        {
            var subQueryModel    = ExpressionHelper.CreateQueryModel <Cook> ();
            var referencedClause = ExpressionHelper.CreateMainFromClause_Int();

            subQueryModel.SelectClause.Selector = new QuerySourceReferenceExpression(referencedClause);
            var expression = new SubQueryExpression(subQueryModel);

            var newReferenceExpression = new QuerySourceReferenceExpression(ExpressionHelper.CreateMainFromClause_Int());

            _querySourceMapping.AddMapping(referencedClause, newReferenceExpression);

            var result = ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(expression, _querySourceMapping, false);
            var newSubQuerySelectClause = ((SubQueryExpression)result).QueryModel.SelectClause;

            Assert.That(newSubQuerySelectClause.Selector, Is.SameAs(newReferenceExpression));
        }
Exemplo n.º 14
0
        private Expression ReplaceClauseReferences(Expression expression)
        {
            var isNestedQuery = _parentQueryModelVisitor != null;

            var resultExpression
                = ReferenceReplacingExpressionTreeVisitor
                  .ReplaceClauseReferences(
                      expression,
                      _querySourceMapping,
                      throwOnUnmappedReferences: !isNestedQuery);

            if (isNestedQuery)
            {
                resultExpression
                    = _parentQueryModelVisitor.ReplaceClauseReferences(resultExpression);
            }

            return(resultExpression);
        }
Exemplo n.º 15
0
        public override void VisitAdditionalFromClause(AdditionalFromClause fromClause, QueryModel queryModel, int index)
        {
            var subQuery = fromClause.FromExpression as SubQueryExpression;

            if (subQuery == null)
            {
                return;
            }

            var subQueryModel = subQuery.QueryModel;

            if (!IsLeftJoin(subQueryModel))
            {
                return;
            }

            var mainFromClause = subQueryModel.MainFromClause;

            var restrictions = subQueryModel.BodyClauses
                               .OfType <WhereClause>()
                               .Select(w => new NhWithClause(w.Predicate));

            var join = new NhJoinClause(mainFromClause.ItemName,
                                        mainFromClause.ItemType,
                                        mainFromClause.FromExpression,
                                        restrictions);

            var innerSelectorMapping = new QuerySourceMapping();

            innerSelectorMapping.AddMapping(fromClause, subQueryModel.SelectClause.Selector);

            queryModel.TransformExpressions(ex => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(ex, innerSelectorMapping, false));

            queryModel.BodyClauses.RemoveAt(index);
            queryModel.BodyClauses.Insert(index, @join);
            InsertBodyClauses(subQueryModel.BodyClauses.Where(b => !(b is WhereClause)), queryModel, index + 1);

            var innerBodyClauseMapping = new QuerySourceMapping();

            innerBodyClauseMapping.AddMapping(mainFromClause, new QuerySourceReferenceExpression(@join));

            queryModel.TransformExpressions(ex => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(ex, innerBodyClauseMapping, false));
        }
Exemplo n.º 16
0
            protected override void FlattenSubQuery(
                SubQueryExpression subQueryExpression,
                FromClauseBase fromClause,
                QueryModel queryModel,
                int destinationIndex)
            {
                var subQueryModel = subQueryExpression.QueryModel;

                if (!(subQueryModel.ResultOperators.Count <= 0 &&
                      !subQueryModel.BodyClauses.Any(bc => bc is OrderByClause)))
                {
                    return;
                }

                var innerMainFromClause
                    = subQueryExpression.QueryModel.MainFromClause;

                CopyFromClauseData(innerMainFromClause, fromClause);

                var innerSelectorMapping = new QuerySourceMapping();

                innerSelectorMapping.AddMapping(fromClause, subQueryExpression.QueryModel.SelectClause.Selector);

                queryModel.TransformExpressions(
                    ex => ReferenceReplacingExpressionTreeVisitor
                    .ReplaceClauseReferences(ex, innerSelectorMapping, false));

                InsertBodyClauses(subQueryExpression.QueryModel.BodyClauses, queryModel, destinationIndex);

                var innerBodyClauseMapping = new QuerySourceMapping();

                innerBodyClauseMapping.AddMapping(innerMainFromClause, new QuerySourceReferenceExpression(fromClause));

                queryModel.TransformExpressions(
                    ex => ReferenceReplacingExpressionTreeVisitor
                    .ReplaceClauseReferences(ex, innerBodyClauseMapping, false));
            }
        private static void FlattenSubQuery(SubQueryExpression subQueryExpression, FromClauseBase fromClause, QueryModel queryModel, int destinationIndex)
        {
            if (!CheckFlattenable(subQueryExpression.QueryModel))
            {
                return;
            }

            var mainFromClause = subQueryExpression.QueryModel.MainFromClause;

            CopyFromClauseData(mainFromClause, fromClause);

            var innerSelectorMapping = new QuerySourceMapping();

            innerSelectorMapping.AddMapping(fromClause, subQueryExpression.QueryModel.SelectClause.Selector);
            queryModel.TransformExpressions(ex => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(ex, innerSelectorMapping, false));

            InsertBodyClauses(subQueryExpression.QueryModel.BodyClauses, queryModel, destinationIndex);
            InsertResultOperators(subQueryExpression.QueryModel.ResultOperators, queryModel);

            var innerBodyClauseMapping = new QuerySourceMapping();

            innerBodyClauseMapping.AddMapping(mainFromClause, new QuerySourceReferenceExpression(fromClause));
            queryModel.TransformExpressions(ex => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(ex, innerBodyClauseMapping, false));
        }
Exemplo n.º 18
0
        public IEnumerable <T> ExecuteCollection <T>(QueryModel queryModel)
        {
            var itemHolder = new ItemHolder();

            var currentItemExpression = Expression.Property(Expression.Constant(itemHolder), "Current");

            var luceneQueryModel = PrepareQuery(queryModel);

            var mapping = new QuerySourceMapping();

            mapping.AddMapping(queryModel.MainFromClause, currentItemExpression);
            queryModel.TransformExpressions(e => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(e, mapping, throwOnUnmappedReferences: true));

            var projection = GetProjector <T>(queryModel);
            var projector  = projection.Compile();

            var searcherHandle = CheckoutSearcher();

            using (searcherHandle)
            {
                var searcher    = searcherHandle.Searcher;
                var skipResults = luceneQueryModel.SkipResults;
                var maxResults  = Math.Min(luceneQueryModel.MaxResults, searcher.MaxDoc - skipResults);
                var query       = luceneQueryModel.Query;

                var scoreFunction = luceneQueryModel.GetCustomScoreFunction <TDocument>();
                if (scoreFunction != null)
                {
                    query = new DelegatingCustomScoreQuery <TDocument>(query, ConvertDocumentForCustomBoost, scoreFunction);
                }

                var executionContext = new QueryExecutionContext(searcher, query, luceneQueryModel.Filter);

                PrepareSearchSettings(executionContext);

                var hits = searcher.Search(executionContext.Query, executionContext.Filter, maxResults + skipResults, luceneQueryModel.Sort);

                if (luceneQueryModel.Last)
                {
                    skipResults = hits.ScoreDocs.Length - 1;
                    if (skipResults < 0)
                    {
                        yield break;
                    }
                }

                var tracker = luceneQueryModel.DocumentTracker as IRetrievedDocumentTracker <TDocument>;

                executionContext.Phase = QueryExecutionPhase.ConvertResults;
                executionContext.Hits  = hits;

                for (var i = skipResults; i < hits.ScoreDocs.Length; i++)
                {
                    executionContext.CurrentHit      = i;
                    executionContext.CurrentScoreDoc = hits.ScoreDocs[i];

                    var doc = hits.ScoreDocs[i].Doc;

                    var item = ConvertDocument(searcher.Doc(doc), executionContext);

                    if (tracker != null)
                    {
                        if (tracker.IsMarkedForDeletion(item))
                        {
                            continue;
                        }

                        TDocument tracked;

                        if (tracker.TryGetTrackedDocument(item, out tracked))
                        {
                            item = tracked;
                        }
                        else
                        {
                            var copy = ConvertDocument(searcher.Doc(doc), executionContext);
                            tracker.TrackDocument(item, copy);
                        }
                    }

                    itemHolder.Current = item;
                    yield return(projector(itemHolder.Current));
                }
            }
        }
        public void VisitUnmappedReference_IgnoreFalse_Throws()
        {
            var expression = new QuerySourceReferenceExpression(ExpressionHelper.CreateMainFromClause_Int());

            ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(expression, _querySourceMapping, true);
        }