Exemple #1
0
 private void RegisterOuterMapping(ApplyParameter parameter, int value)
 {
     if (outerColumnUsages.TryGetValue(parameter, out var map) && !map.Contains(value))
     {
         map.Add(value);
     }
 }
        public static Expression Rewrite(Expression expression,
                                         ApplyParameter oldParameter, ApplyParameter newParameter)
        {
            var expressionRewriter = new ApplyParameterRewriter(oldParameter, newParameter);

            return(expressionRewriter.Visit(expression));
        }
        public static CompilableProvider Rewrite(CompilableProvider provider, ApplyParameter oldParameter, ApplyParameter newParameter)
        {
            var expressionRewriter = new ApplyParameterRewriter(oldParameter, newParameter);
            var providerRewriter   = new CompilableProviderVisitor(expressionRewriter.RewriteExpression);

            return(providerRewriter.VisitCompilable(provider));
        }
        public ItemProjectorExpression RewriteApplyParameter(ApplyParameter oldParameter, ApplyParameter newParameter)
        {
            var newDataSource        = ApplyParameterRewriter.Rewrite(DataSource, oldParameter, newParameter);
            var newItemProjectorBody = ApplyParameterRewriter.Rewrite(Item, oldParameter, newParameter);

            return(new ItemProjectorExpression(newItemProjectorBody, newDataSource, Context));
        }
Exemple #5
0
 public void CrossApplyExistenseTest()
 {
     Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries);
     using (var session = Domain.OpenSession()) {
         using (session.OpenTransaction()) {
             LoadData(session);
             long total = 0;
             foreach (var customer in allCustomers)
             {
                 if (allInvoices.Any(o => o.Customer == customer))
                 {
                     total++;
                 }
             }
             var parameter = new ApplyParameter();
             var subquery  = orderPrimary
                             .Filter(t => t.GetValue(invoiceCustomerIndex) == parameter.Value.GetValue(customerIdIndex))
                             .Existence("LALALA");
             var result = customerPrimary
                          .Apply(parameter, subquery, false, ApplySequenceType.Single, JoinType.Inner)
                          .GetRecordSetReader(Session.Current, new ParameterContext())
                          .ToEnumerable()
                          .Count(t => (bool)t.GetValue(t.Count - 1));
             Assert.AreEqual(total, result);
         }
     }
 }
 public ApplyParameter Find(LambdaExpression predicate)
 {
     ArgumentValidator.EnsureArgumentNotNull(predicate, "predicate");
     result = null;
     Visit(predicate);
     return(result);
 }
Exemple #7
0
        public static Expression Rewrite(Expression expression,
                                         Parameter <Tuple> parameterOfTuple, ApplyParameter applyParameter)
        {
            var expressionRewriter = new ApplyParameterToTupleParameterRewriter(parameterOfTuple, applyParameter);

            return(expressionRewriter.Visit(expression));
        }
Exemple #8
0
        private IncludeFilterMappingGatherer(Expression filterDataTuple, ApplyParameter filteredTuple, MappingEntry[] resultMapping)
        {
            calculatedColumnParameter = Expression.Parameter(typeof(Tuple), "filteredRow");

            this.filterDataTuple = filterDataTuple;
            this.filteredTuple   = filteredTuple;
            this.resultMapping   = resultMapping;
        }
 /// <summary>
 /// Initializes a new instance of this class.
 /// </summary>
 public ApplyProvider(ApplyParameter applyParameter, CompilableProvider left, CompilableProvider right, bool isInlined, ApplySequenceType applySequenceType, JoinType applyType)
     : base(ProviderType.Apply, left, right)
 {
     ApplyParameter = applyParameter;
     IsInlined      = isInlined;
     SequenceType   = applySequenceType;
     ApplyType      = applyType;
     Initialize();
 }
        protected override Provider VisitApply(ApplyProvider provider)
        {
            // split

            List <int> leftMapping;
            List <int> rightMapping;

            SplitMappings(provider, out leftMapping, out rightMapping);

            ApplyParameter applyParameter     = provider.ApplyParameter;
            var            currentOuterUsages = new List <int>();

            outerColumnUsages.Add(applyParameter, currentOuterUsages);
            outerColumnUsageVisitor.VisitCompilable(provider.Right);
            outerColumnUsages.Remove(applyParameter);

            leftMapping = Merge(leftMapping, currentOuterUsages);

            if (leftMapping.Count == 0)
            {
                leftMapping.Add(0);
            }

            // visit

            var oldMappings = ReplaceMappings(provider.Left, leftMapping);
            CompilableProvider newLeftProvider = VisitCompilable(provider.Left);

            leftMapping = mappings[provider.Left];

            ReplaceMappings(provider.Right, rightMapping);
            outerColumnUsages.Add(applyParameter, leftMapping);
            CompilableProvider newRightProvider = VisitCompilable(provider.Right);

            outerColumnUsages.Remove(applyParameter);

            var pair = OverrideRightApplySource(provider, newRightProvider, rightMapping);

            if (pair.First == null)
            {
                rightMapping = mappings[provider.Right];
            }
            else
            {
                newRightProvider = pair.First;
                rightMapping     = pair.Second;
            }
            RestoreMappings(oldMappings);

            mappings[provider] = Merge(leftMapping, rightMapping.Select(map => map + provider.Left.Header.Length));

            if (newLeftProvider == provider.Left && newRightProvider == provider.Right)
            {
                return(provider);
            }
            return(new ApplyProvider(applyParameter, newLeftProvider, newRightProvider, provider.IsInlined, provider.SequenceType, provider.ApplyType));
        }
Exemple #11
0
        public SqlExpression GetOuterExpression(ApplyParameter parameter, int columnIndex)
        {
            var reference         = OuterReferences[parameter];
            var sqlProvider       = reference.First;
            var useQueryReference = reference.Second;

            return(useQueryReference
        ? sqlProvider.PermanentReference[columnIndex]
        : ExtractColumnExpression(sqlProvider.Request.Statement.Columns[columnIndex]));
        }
        private int ResolveOuterMapping(ApplyParameter parameter, int value)
        {
            int result = outerColumnUsages[parameter].IndexOf(value);

            if (result < 0)
            {
                return(value);
            }
            return(result);
        }
 public SubQueryExpression(
     Type type,
     ParameterExpression parameterExpression,
     bool defaultIfEmpty,
     ProjectionExpression projectionExpression,
     ApplyParameter applyParameter)
     : base(ExtendedExpressionType.SubQuery, type, parameterExpression, defaultIfEmpty)
 {
     ProjectionExpression = projectionExpression;
     ApplyParameter       = applyParameter;
 }
Exemple #14
0
 public GroupingExpression(
     Type type,
     ParameterExpression parameterExpression,
     bool defaultIfEmpty,
     ProjectionExpression projectionExpression,
     ApplyParameter applyParameter,
     Expression keyExpression,
     SelectManyGroupingInfo selectManyInfo)
     : base(type, parameterExpression, defaultIfEmpty, projectionExpression, applyParameter, ExtendedExpressionType.Grouping)
 {
     SelectManyInfo = selectManyInfo;
     KeyExpression  = keyExpression;
 }
        public ApplyParameter GetApplyParameter(CompilableProvider provider)
        {
            ApplyParameter parameter;

            if (!applyParameters.TryGetValue(provider, out parameter))
            {
                parameter = new ApplyParameter(provider.GetType().GetShortName());
                // parameter = new ApplyParameter(provider.ToString());
                // ENABLE ONLY FOR DEBUGGING!
                // May lead TO entity.ToString() calls, while ToString can be overriden.
                applyParameters.Add(provider, parameter);
            }
            return(parameter);
        }
        // Constructors

        public virtual Expression ReplaceApplyParameter(ApplyParameter newApplyParameter)
        {
            if (newApplyParameter == ApplyParameter)
            {
                return(new SubQueryExpression(Type, OuterParameter, DefaultIfEmpty, ProjectionExpression, ApplyParameter));
            }

            var newItemProjector        = ProjectionExpression.ItemProjector.RewriteApplyParameter(ApplyParameter, newApplyParameter);
            var newProjectionExpression = new ProjectionExpression(
                ProjectionExpression.Type,
                newItemProjector,
                ProjectionExpression.TupleParameterBindings,
                ProjectionExpression.ResultType);

            return(new SubQueryExpression(Type, OuterParameter, DefaultIfEmpty, newProjectionExpression, newApplyParameter));
        }
Exemple #17
0
        public override Expression ReplaceApplyParameter(ApplyParameter newApplyParameter)
        {
            if (newApplyParameter == ApplyParameter)
            {
                return(new GroupingExpression(Type, OuterParameter, DefaultIfEmpty, ProjectionExpression, ApplyParameter, KeyExpression, SelectManyInfo));
            }

            var newItemProjector        = ProjectionExpression.ItemProjector.RewriteApplyParameter(ApplyParameter, newApplyParameter);
            var newProjectionExpression = new ProjectionExpression(
                ProjectionExpression.Type,
                newItemProjector,
                ProjectionExpression.TupleParameterBindings,
                ProjectionExpression.ResultType);

            return(new GroupingExpression(Type, OuterParameter, DefaultIfEmpty, newProjectionExpression, newApplyParameter, KeyExpression, SelectManyInfo));
        }
 protected override Expression VisitMethodCall(MethodCallExpression mc)
 {
     if (mc.AsTupleAccess() != null)
     {
         var applyParameter = mc.GetApplyParameter();
         if (result == null)
         {
             result = applyParameter;
         }
         else if (applyParameter != null && result != applyParameter)
         {
             throw new InvalidOperationException(Strings.ExPredicateContainsAccessesToDifferentApplyParameters);
         }
         return(mc);
     }
     return(base.VisitMethodCall(mc));
 }
 private void SaveApplyPredicate(FilterProvider filter, ApplyParameter applyParameter)
 {
     if (owner.State.Predicates.ContainsKey(applyParameter))
     {
         owner.State.Predicates[applyParameter]
         .Add(new Pair <Expression <Func <Tuple, bool> >, ColumnCollection>(filter.Predicate,
                                                                            filter.Header.Columns));
     }
     else
     {
         var newPair = new Pair <Expression <Func <Tuple, bool> >, ColumnCollection>(filter.Predicate,
                                                                                     filter.Header.Columns);
         owner.State.Predicates.Add(applyParameter,
                                    new List <Pair <Expression <Func <Tuple, bool> >, ColumnCollection> > {
             newPair
         });
     }
 }
Exemple #20
0
 public void OuterApplyTest()
 {
     using (var session = Domain.OpenSession()) {
         using (session.OpenTransaction()) {
             LoadData(session);
             long total = 0;
             foreach (var customer in allCustomers)
             {
                 total += Math.Max(1, allInvoices.Count(o => o.Customer == customer));
             }
             var parameter = new ApplyParameter();
             var subquery  = orderPrimary
                             .Filter(t => t.GetValue(invoiceCustomerIndex) == parameter.Value.GetValue(customerIdIndex))
                             .Alias("XYZ");
             var result = customerPrimary
                          .Apply(parameter, subquery, false, ApplySequenceType.All, JoinType.LeftOuter)
                          .Count(Session.Current);
             Assert.AreEqual(total, result);
         }
     }
 }
Exemple #21
0
        private int ResolveOuterMapping(ApplyParameter parameter, int value)
        {
            var result = outerColumnUsages[parameter].IndexOf(value);

            return(result < 0 ? value : result);
        }
Exemple #22
0
        // Constructors

        private ApplyParameterToTupleParameterRewriter(Parameter <Tuple> parameterOfTuple, ApplyParameter applyParameter)
        {
            this.parameterOfTuple      = parameterOfTuple;
            parameterOfTupleExpression = Expression.Property(Expression.Constant(parameterOfTuple), WellKnownMembers.ParameterOfTupleValue);
            this.applyParameter        = applyParameter;
        }
Exemple #23
0
        public static CompilableProvider Rewrite(CompilableProvider provider, Parameter <Tuple> parameterOfTuple, ApplyParameter applyParameter)
        {
            var expressionRewriter = new ApplyParameterToTupleParameterRewriter(parameterOfTuple, applyParameter);
            var providerRewriter   = new CompilableProviderVisitor(expressionRewriter.RewriteExpression);

            return(providerRewriter.VisitCompilable(provider));
        }
        // Constructors

        private ApplyParameterRewriter(ApplyParameter oldParameter, ApplyParameter newParameter)
        {
            newApplyParameterValueExpression = Expression.Property(Expression.Constant(newParameter), WellKnownMembers.ApplyParameterValue);
            oldApplyParameter = oldParameter;
            newApplyParameter = newParameter;
        }
Exemple #25
0
 private static int DefaultResolveOuterColumn(ApplyParameter parameter, int columnIndex)
 {
     throw new NotSupportedException();
 }
Exemple #26
0
        public static MappingEntry[] Gather(Expression filterExpression, Expression filterDataTuple, ApplyParameter filteredTuple, int columnCount)
        {
            var mapping = Enumerable.Repeat((MappingEntry)null, columnCount).ToArray();
            var visitor = new IncludeFilterMappingGatherer(filterDataTuple, filteredTuple, mapping);

            visitor.Visit(filterExpression);
            if (mapping.Contains(null))
            {
                throw Exceptions.InternalError("Failed to gather mappings for IncludeProvider", OrmLog.Instance);
            }
            return(mapping);
        }
        // Constructors

        /// <summary>
        /// Initializes a new instance of this class.
        /// </summary>
        public ApplyParameterAccessVisitor(ApplyParameter applyParameter, Func <MethodCallExpression, int, Expression> processor)
        {
            this.processor      = processor;
            this.applyParameter = applyParameter;
        }
        // Constructors

        /// <summary>
        /// Initializes a new instance of this class.
        /// </summary>
        public ApplyProvider(ApplyParameter applyParameter, CompilableProvider left, CompilableProvider right)
            : this(applyParameter, left, right, false, ApplySequenceType.All, JoinType.Inner)
        {
        }
 private static void DefaultRegisterOuterColumn(ApplyParameter parameter, int columnIndex)
 {
 }
            // Constructors

            public SubqueryFilterChecker(ApplyParameter filterParameter)
            {
                this.filterParameter = filterParameter;
                meaningfulLefts      = new Stack <Expression>();
                meaningfulRights     = new Stack <Expression>();
            }