Example #1
0
 protected void VisitSource(VfpExpressionBinding source)
 {
     //bool saveIsNested = this.isNested;
     //this.isNested = true;
     //switch ((VfpExpressionType)source.NodeType) {
     //    case VfpExpressionType.Table:
     //        TableExpression table = (TableExpression)source;
     //        this.WriteTableName(table.Name);
     //        if (!this.HideTableAliases) {
     //            this.Write(" ");
     //            this.WriteAsAliasName(GetAliasName(table.Alias));
     //        }
     //        break;
     //    case VfpExpressionType.Select:
     //        SelectExpression select = (SelectExpression)source;
     //        this.Write("(");
     //        this.WriteLine(Indentation.Inner);
     //        this.Visit(select);
     //        this.WriteLine(Indentation.Same);
     //        this.Write(") ");
     //        this.WriteAsAliasName(GetAliasName(select.Alias));
     //        this.Indent(Indentation.Outer);
     //        break;
     //    case VfpExpressionType.Join:
     //        this.VisitJoin((JoinExpression)source);
     //        break;
     //    default:
     //        throw new InvalidOperationException("Select source is not valid type");
     //}
     //this.isNested = saveIsNested;
 }
Example #2
0
        protected override VfpExpressionBinding VisitVfpExpressionBinding(VfpExpressionBinding binding)
        {
            var entityType = binding.VariableType.EdmType as EntityType;

            if (entityType != null)
            {
                _entityTypes.Add(entityType);
            }

            return(base.VisitVfpExpressionBinding(binding));
        }
Example #3
0
        protected override VfpExpressionBinding VisitVfpExpressionBinding(VfpExpressionBinding binding)
        {
            binding = base.VisitVfpExpressionBinding(binding);

            var filterExpression = binding.Expression as VfpFilterExpression;

            if (filterExpression == null)
            {
                return(binding);
            }

            var project = filterExpression.Input.Expression as VfpProjectExpression;

            if (project == null)
            {
                return(binding);
            }

            var scan = project.Input.Expression as VfpScanExpression;

            if (scan == null)
            {
                return(binding);
            }

            var newInstance = project.Projection as VfpNewInstanceExpression;

            if (newInstance == null)
            {
                return(binding);
            }

            var properties = newInstance.Arguments.OfType <VfpPropertyExpression>().ToList().AsReadOnly();

            if (!properties.Any())
            {
                return(binding);
            }

            if (!VfpPropertyExpressionChecker.CanRewrite(filterExpression.Predicate))
            {
                return(binding);
            }

            var newFilterPredicate   = VfpPropertyExpressionRewriter.Rewrite(filterExpression.Predicate, properties);
            var newFilterExpression  = project.Input.Filter(newFilterPredicate);
            var newFilterBinding     = newFilterExpression.BindAs(binding.Variable.VariableName);
            var newProjection        = VfpVariableReferenceExpressionRewriter.Rewrite(project.Projection, binding.Variable);
            var newProjectExpression = newFilterBinding.Project(newProjection);
            var newBinding           = newProjectExpression.BindAs(binding.Variable.VariableName);

            return(newBinding);
        }
        private static IEnumerable <EdmMember> GetKeyMembers(VfpExpressionBinding expressionBinding, VfpExpression expression)
        {
            var keyMembers = GetKeyMembers(expressionBinding.VariableType.EdmType);

            if (keyMembers.Any())
            {
                return(keyMembers);
            }

            var entityTypes = EntityTypeGatherer.Gather(expression);

            return(GetKeyMembers(entityTypes));
        }
Example #5
0
        protected override VfpExpressionBinding VisitVfpExpressionBinding(VfpExpressionBinding binding)
        {
            binding = base.VisitVfpExpressionBinding(binding);

            if (!_xmlToCursors.ContainsKey(binding.VariableName))
            {
                return(binding);
            }

            var xmlToCursors = _xmlToCursors[binding.VariableName];

            if (!xmlToCursors.Any())
            {
                return(binding);
            }

            var scan = binding.Expression as VfpScanExpression;

            if (scan == null)
            {
                return(binding);
            }

            var           scanBinding = scan.BindAs(CursorNamePrefix + (_count++));
            VfpExpression predicate   = null;

            foreach (var xmlToCursor in xmlToCursors)
            {
                var scanProperty          = scanBinding.Variable.Property(xmlToCursor.ColumnProperty.Property);
                var xmlToCursorExpression = VfpExpressionBuilder.XmlToCursor(scanProperty, xmlToCursor.XmlToCursor.Parameter, CursorNamePrefix + xmlToCursor.XmlToCursor.CursorName, xmlToCursor.XmlToCursor.ItemType);

                _xmlToCursorsToBeRemoved.Add(xmlToCursor.XmlToCursor.CursorName);

                if (predicate == null)
                {
                    predicate = xmlToCursorExpression;
                }
                else
                {
                    predicate = predicate.And(xmlToCursorExpression);
                }
            }

            var filter        = scanBinding.Filter(predicate);
            var filterBinding = filter.BindAs(binding.Variable.VariableName);

            return(filterBinding);
        }
        private VfpLimitExpression GetVfpLimitExpression(VfpLimitExpression limitExpression, VfpScanExpression scanExpression)
        {
            if (scanExpression == null)
            {
                return(null);
            }

            var keyMembers = GetKeyMembers(scanExpression.Target.ElementType.KeyMembers);

            if (!keyMembers.Any())
            {
                return(null);
            }

            var variableReference = new VfpVariableReferenceExpression(scanExpression.ResultType, GetUniqueVariableName());
            var expressionBinding = new VfpExpressionBinding(scanExpression, variableReference);
            var sortClauses       = GetSortClauses(keyMembers, expressionBinding).ToList().AsReadOnly();
            var sortExpression    = new VfpSortExpression(scanExpression.ResultType, expressionBinding, sortClauses);

            return(new VfpLimitExpression(limitExpression.ResultType,
                                          sortExpression,
                                          limitExpression.Limit,
                                          limitExpression.WithTies));
        }
Example #7
0
        protected override VfpExpressionBinding VisitVfpExpressionBinding(VfpExpressionBinding binding)
        {
            var isFilterBinding = binding.Expression is VfpFilterExpression;

            if (isFilterBinding)
            {
                _filterBindings.Push(binding);
            }

            binding = base.VisitVfpExpressionBinding(binding);

            if (isFilterBinding)
            {
                var expression = binding.Expression;

                foreach (var cursorName in _xmlToCursorsToBeRemoved)
                {
                    expression = XmlToCursorExpressionRemover.Remove(expression, cursorName);
                }

                _xmlToCursorsToBeRemoved.Clear();
                _filterBindings.Pop();

                binding = expression.BindAs(binding.Variable.VariableName);
            }

            if (!_filterBindings.Any())
            {
                return(binding);
            }

            var filterBinding = _filterBindings.Peek();

            if (filterBinding == null)
            {
                return(binding);
            }

            var scan = binding.Expression as VfpScanExpression;

            if (scan == null)
            {
                return(binding);
            }

            if (!_xmlToCursors.ContainsKey(binding.VariableName))
            {
                return(binding);
            }

            var xmlToCursors = _xmlToCursors[binding.VariableName];

            if (!xmlToCursors.Any())
            {
                return(binding);
            }

            foreach (var xmlToCursor in xmlToCursors)
            {
                var xmlToCursorExpression = xmlToCursor.XmlToCursor;

                _count++;

                var variableReference   = xmlToCursorExpression.ItemType.ToTypeUsage().Variable("Xml" + _count);
                var xmlToCursorScan     = VfpExpressionBuilder.XmlToCursorScan(xmlToCursorExpression.Parameter, xmlToCursorExpression.CursorName + "_j");
                var xmlToCursorBinding  = xmlToCursorScan.BindAs(variableReference.VariableName);
                var xmlToCursorProperty = VfpExpressionBuilder.XmlToCursorProperty(variableReference.ResultType, variableReference);
                var scanProperty        = GetScanProperty(binding.Variable, xmlToCursorExpression.Property);
                var comparison          = scanProperty.ExpressionEquals(xmlToCursorProperty);

                var joinVariableReference = binding.VariableType.Variable(binding.VariableName);
                var joinExpression        = binding.InnerJoin(xmlToCursorBinding, comparison, binding.Expression.ResultType);

                _xmlToCursorsToBeRemoved.Add(xmlToCursorExpression.CursorName);

                binding = joinExpression.BindAs(joinVariableReference.VariableName);
            }

            return(binding);
        }
 private static IEnumerable <VfpSortClause> GetSortClauses(IEnumerable <EdmMember> keyMembers, VfpExpressionBinding expressionBinding)
 {
     return(keyMembers.Select(x => new VfpSortClause(new VfpPropertyExpression(x.TypeUsage, x, expressionBinding.Variable), true, string.Empty)));
 }
        private static VfpExpressionBinding GetSortBinding(IEnumerable <EdmMember> keyMembers, VfpExpressionBinding binding, VfpExpression expression)
        {
            var allVarialbes            = VariableReferenceGatherer.Gather(expression).ToList();
            var entityTypeVariables     = allVarialbes.Where(x => x.ResultType.EdmType is EntityType).ToList().GroupBy(x => x.VariableName).Select(x => x.First()).ToList();
            var keyMembersWithVariables = keyMembers.Join(entityTypeVariables, x => x.DeclaringType, x => x.ResultType.EdmType, (k, v) => new { KeyMember = k, Variable = v }).ToList();
            var sortClauses             = keyMembersWithVariables.Select(x => new VfpSortClause(new VfpPropertyVariableNameExpression(x.KeyMember.TypeUsage, x.KeyMember, x.Variable.VariableName), true, string.Empty)).ToList();
            var sortExpression          = binding.Sort(sortClauses);

            return(sortExpression.BindAs(binding.Variable));
        }
 private static bool IsSingleRowTable(VfpExpressionBinding expression) {
     return expression.VariableName.StartsWith("SingleRowTable");
 }
        private static VfpJoinExpression CreateJoin(VfpExpressionBinding left, VfpExpressionBinding right) {
            var comparison = VfpExpressionBuilder.Constant(1).ExpressionEquals(VfpExpressionBuilder.Constant(1));

            return left.LeftJoin(right, comparison, right.VariableType);
        }
 protected virtual VfpExpressionBinding VisitVfpExpressionBinding(VfpExpressionBinding binding)
 {
     return(new VfpExpressionBinding(binding.Expression.Accept(this), (VfpVariableReferenceExpression)binding.Variable.Accept(this)));
 }