コード例 #1
0
ファイル: _SqlExpression.cs プロジェクト: yuanfei05/vita
 protected SqlExpression(SqlExpressionType sqlNodeType, Type type)
     : base()
 {
     SqlNodeType = sqlNodeType;
       _type = type;
       Operands = new List<Expression>();
 }
コード例 #2
0
 private SqlBinaryExpression(SerializationInfo info, StreamingContext context)
     : base(info, context)
 {
     Left = (SqlExpression)info.GetValue("Left", typeof(SqlExpression));
     Right = (SqlExpression)info.GetValue("Right", typeof(SqlExpression));
     expressionType = (SqlExpressionType) info.GetInt32("ExpressionType");
 }
コード例 #3
0
ファイル: JoinNode.cs プロジェクト: ArsenShnurkov/deveeldb
 public JoinNode(IQueryPlanNode left, IQueryPlanNode right, ObjectName leftColumnName, SqlExpressionType @operator, SqlExpression rightExpression)
     : base(left, right)
 {
     LeftColumnName = leftColumnName;
     Operator = @operator;
     RightExpression = rightExpression;
 }
コード例 #4
0
ファイル: SimpleSelectNode.cs プロジェクト: meikeric/deveeldb
 public SimpleSelectNode(IQueryPlanNode child, ObjectName columnName, SqlExpressionType op, SqlExpression expression)
     : base(child)
 {
     ColumnName   = columnName;
     OperatorType = op;
     Expression   = expression;
 }
コード例 #5
0
 private SqlBinaryExpression(SerializationInfo info, StreamingContext context)
     : base(info, context)
 {
     Left           = (SqlExpression)info.GetValue("Left", typeof(SqlExpression));
     Right          = (SqlExpression)info.GetValue("Right", typeof(SqlExpression));
     expressionType = (SqlExpressionType)info.GetInt32("ExpressionType");
 }
コード例 #6
0
        public static SqlBinaryExpression All(SqlExpression left, SqlExpressionType allType, SqlExpression right)
        {
            if (allType == SqlExpressionType.Equal ||
                allType == SqlExpressionType.AllEqual)
            {
                return(AllEqual(left, right));
            }
            if (allType == SqlExpressionType.NotEqual ||
                allType == SqlExpressionType.AllNotEqual)
            {
                return(AllNotEqual(left, right));
            }
            if (allType == SqlExpressionType.GreaterThan ||
                allType == SqlExpressionType.AllGreaterThan)
            {
                return(AllGreaterThan(left, right));
            }
            if (allType == SqlExpressionType.SmallerThan ||
                allType == SqlExpressionType.AllSmallerThan)
            {
                return(AllSmallerThan(left, right));
            }
            if (allType == SqlExpressionType.GreaterOrEqualThan ||
                allType == SqlExpressionType.AllGreaterOrEqualThan)
            {
                return(AllGreaterOrEqualThan(left, right));
            }
            if (allType == SqlExpressionType.SmallerOrEqualThan ||
                allType == SqlExpressionType.AllSmallerOrEqualThan)
            {
                return(AllSmallerOrEqualThan(left, right));
            }

            throw new ArgumentException(String.Format("The type '{0}' cannot be part of an ALL operator.", allType));
        }
コード例 #7
0
        private void EvaluateSingles(List <SqlBinaryExpression> list, List <ExpressionPlan> plans)
        {
            // The list of simple expression plans (lhs = single)
            var simplePlanList = new List <SingleColumnPlan>();
            // The list of complex function expression plans (lhs = expression)
            var complexPlanList = new List <SingleColumnPlan>();

            foreach (var expression in list)
            {
                // The single var
                ObjectName        singleVar;
                SqlExpressionType op = expression.ExpressionType;
                SqlExpression     left = expression.Left, right = expression.Right;

                if (expression.Right is SqlQuantifiedExpression)
                {
                    singleVar = expression.Left.AsReferenceName();

                    if (singleVar != null)
                    {
                        plans.Add(new SimpleSelectPlan(this, singleVar, op, expression.Right));
                    }
                    else
                    {
                        singleVar = expression.Left.DiscoverReferences().First();
                        plans.Add(new ComplexSinglePlan(this, singleVar, expression));
                    }
                }
                else
                {
                    singleVar = expression.Left.DiscoverReferences().FirstOrDefault();
                    if (singleVar == null)
                    {
                        // Reverse the expressions and the operator
                        var tempExp = left;
                        left      = right;
                        right     = tempExp;
                        op        = op.Reverse();
                        singleVar = left.DiscoverReferences().First();
                    }

                    var tableSource = FindPlan(singleVar);

                    // Simple LHS?
                    var v = left.AsReferenceName();
                    if (v != null)
                    {
                        AddSingleColumnPlan(simplePlanList, tableSource, v, singleVar, new [] { left, right }, op);
                    }
                    else
                    {
                        // No, complex lhs
                        AddSingleColumnPlan(complexPlanList, tableSource, null, singleVar, new [] { left, right }, op);
                    }
                }
            }

            plans.AddRange(simplePlanList.Select(plan => new SimpleSinglePlan(this, plan.UniqueName, plan.Expression)).Cast <ExpressionPlan>());
            plans.AddRange(complexPlanList.Select(plan => new ComplexSinglePlan(this, plan.UniqueName, plan.Expression)).Cast <ExpressionPlan>());
        }
コード例 #8
0
 private SqlBinaryExpression(ObjectData data)
     : base(data)
 {
     Left = data.GetValue<SqlExpression>("Left");
     Right = data.GetValue<SqlExpression>("Right");
     expressionType = (SqlExpressionType) data.GetInt32("ExpressionType");
 }
コード例 #9
0
 public JoinNode(IQueryPlanNode left, IQueryPlanNode right, ObjectName leftColumnName, SqlExpressionType @operator, SqlExpression rightExpression)
     : base(left, right)
 {
     LeftColumnName  = leftColumnName;
     Operator        = @operator;
     RightExpression = rightExpression;
 }
コード例 #10
0
        public bool BinaryInfixTests(string infix, SqlExpressionType type)
        {
            var value =
                _generator.GenerateSql(new SqlBinaryExpression(type, constants[0], constants[1]));

            return($"(2 {infix} 5)" == value);
        }
コード例 #11
0
        private SqlObject Relational(SqlExpressionType opType, SqlObject a, SqlObject b)
        {
            switch (opType)
            {
            case SqlExpressionType.Equal:
                return(a.Equal(b));

            case SqlExpressionType.NotEqual:
                return(a.NotEqual(b));

            case SqlExpressionType.GreaterThan:
                return(a.GreaterThan(b));

            case SqlExpressionType.LessThan:
                return(a.LessThan(b));

            case SqlExpressionType.GreaterThanOrEqual:
                return(a.GreaterThanOrEqual(b));

            case SqlExpressionType.LessThanOrEqual:
                return(a.LessOrEqualThan(b));

            case SqlExpressionType.Is:
                return(a.Is(b));

            case SqlExpressionType.IsNot:
                return(a.IsNot(b));

            default:
                return(SqlObject.Unknown);
            }
        }
コード例 #12
0
 public NonCorrelatedAnyAllNode(IQueryPlanNode left, IQueryPlanNode right, ObjectName[] leftColumnNames, SqlExpressionType subQueryType, bool isAll)
     : base(left, right)
 {
     LeftColumnNames = leftColumnNames;
     SubQueryType = subQueryType;
     IsAll = isAll;
 }
コード例 #13
0
 public NonCorrelatedAnyAllNode(IQueryPlanNode left, IQueryPlanNode right, ObjectName[] leftColumnNames, SqlExpressionType subQueryType, bool isAll)
     : base(left, right)
 {
     LeftColumnNames = leftColumnNames;
     SubQueryType    = subQueryType;
     IsAll           = isAll;
 }
コード例 #14
0
ファイル: SimpleSelectNode.cs プロジェクト: prepare/deveeldb
 public SimpleSelectNode(IQueryPlanNode child, ObjectName columnName, SqlExpressionType op, SqlExpression expression)
     : base(child)
 {
     ColumnName = columnName;
     OperatorType = op;
     Expression = expression;
 }
コード例 #15
0
        public static SqlExpressionType Reverse(this SqlExpressionType type)
        {
            if (type == SqlExpressionType.Equal ||
                type == SqlExpressionType.NotEqual ||
                type == SqlExpressionType.Is ||
                type == SqlExpressionType.IsNot)
            {
                return(type);
            }
            if (type == SqlExpressionType.GreaterThan)
            {
                return(SqlExpressionType.SmallerThan);
            }
            if (type == SqlExpressionType.SmallerThan)
            {
                return(SqlExpressionType.GreaterThan);
            }
            if (type == SqlExpressionType.GreaterOrEqualThan)
            {
                return(SqlExpressionType.SmallerOrEqualThan);
            }
            if (type == SqlExpressionType.SmallerOrEqualThan)
            {
                return(SqlExpressionType.GreaterOrEqualThan);
            }

            throw new InvalidOperationException("Cannot reverse a non conditional operator.");
        }
コード例 #16
0
        public static SqlExpressionType All(this SqlExpressionType type)
        {
            if (type == SqlExpressionType.Equal)
            {
                return(SqlExpressionType.AllEqual);
            }
            if (type == SqlExpressionType.NotEqual)
            {
                return(SqlExpressionType.AllNotEqual);
            }
            if (type == SqlExpressionType.GreaterThan)
            {
                return(SqlExpressionType.AllGreaterThan);
            }
            if (type == SqlExpressionType.GreaterOrEqualThan)
            {
                return(SqlExpressionType.AllGreaterOrEqualThan);
            }
            if (type == SqlExpressionType.SmallerThan)
            {
                return(SqlExpressionType.AllSmallerThan);
            }
            if (type == SqlExpressionType.SmallerOrEqualThan)
            {
                return(SqlExpressionType.AllSmallerOrEqualThan);
            }

            throw new ArgumentException();
        }
コード例 #17
0
        public static bool IsBinary(this SqlExpressionType expressionType)
        {
            switch (expressionType)
            {
            case SqlExpressionType.Add:
            case SqlExpressionType.Subtract:
            case SqlExpressionType.Divide:
            case SqlExpressionType.Multiply:
            case SqlExpressionType.Modulo:
            case SqlExpressionType.And:
            case SqlExpressionType.Or:
            case SqlExpressionType.XOr:
            case SqlExpressionType.Equal:
            case SqlExpressionType.NotEqual:
            case SqlExpressionType.GreaterThan:
            case SqlExpressionType.GreaterThanOrEqual:
            case SqlExpressionType.LessThan:
            case SqlExpressionType.LessThanOrEqual:
            case SqlExpressionType.Is:
            case SqlExpressionType.IsNot:
                return(true);

            default:
                return(false);
            }
        }
コード例 #18
0
        public static SqlExpressionType SubQueryPlainType(this SqlExpressionType type)
        {
            if (type.IsAny())
            {
                if (type == SqlExpressionType.AnyEqual)
                {
                    return(SqlExpressionType.Equal);
                }
                if (type == SqlExpressionType.AnyNotEqual)
                {
                    return(SqlExpressionType.NotEqual);
                }
                if (type == SqlExpressionType.AnyGreaterThan)
                {
                    return(SqlExpressionType.GreaterThan);
                }
                if (type == SqlExpressionType.AnyGreaterOrEqualThan)
                {
                    return(SqlExpressionType.GreaterOrEqualThan);
                }
                if (type == SqlExpressionType.AnySmallerThan)
                {
                    return(SqlExpressionType.AnySmallerThan);
                }
                if (type == SqlExpressionType.AnySmallerOrEqualThan)
                {
                    return(SqlExpressionType.SmallerOrEqualThan);
                }
            }

            if (type.IsAll())
            {
                if (type == SqlExpressionType.AllEqual)
                {
                    return(SqlExpressionType.Equal);
                }
                if (type == SqlExpressionType.AllNotEqual)
                {
                    return(SqlExpressionType.NotEqual);
                }
                if (type == SqlExpressionType.AllGreaterThan)
                {
                    return(SqlExpressionType.GreaterThan);
                }
                if (type == SqlExpressionType.AllGreaterOrEqualThan)
                {
                    return(SqlExpressionType.GreaterOrEqualThan);
                }
                if (type == SqlExpressionType.AllSmallerThan)
                {
                    return(SqlExpressionType.AllSmallerThan);
                }
                if (type == SqlExpressionType.AllSmallerOrEqualThan)
                {
                    return(SqlExpressionType.SmallerOrEqualThan);
                }
            }

            throw new ArgumentException();
        }
コード例 #19
0
 private SqlBinaryExpression(ObjectData data)
     : base(data)
 {
     Left           = data.GetValue <SqlExpression>("Left");
     Right          = data.GetValue <SqlExpression>("Right");
     expressionType = (SqlExpressionType)data.GetInt32("ExpressionType");
 }
コード例 #20
0
        public static void ParseString(string s, SqlExpressionType expressionType)
        {
            var exp = SqlExpression.Parse(s);

            Assert.NotNull(exp);
            Assert.Equal(expressionType, exp.ExpressionType);
            Assert.IsType <SqlBinaryExpression>(exp);
        }
コード例 #21
0
 protected OperandsMutableSqlExpression(SqlExpressionType sqlExpressionType, Type type, IList <Expression> operands)
     : base(sqlExpressionType, type)
 {
     if (operands != null)
     {
         this.Operands.AddRange(operands);
     }
 }
コード例 #22
0
        public void ParseUnaryString(string s, SqlExpressionType expressionType)
        {
            var exp = SqlExpression.Parse(context, s);

            Assert.NotNull(exp);
            Assert.Equal(expressionType, exp.ExpressionType);
            Assert.IsType <SqlUnaryExpression>(exp);
        }
コード例 #23
0
 public SimpleSelectPlan(QueryTablePlanner planner, ObjectName columnName, SqlExpressionType op, SqlExpression expression)
     : base(0.2f)
 {
     this.planner    = planner;
     this.columnName = columnName;
     this.op         = op;
     this.expression = expression;
 }
コード例 #24
0
        public static SqlExpressionType Inverse(this SqlExpressionType type)
        {
            if (type.IsSubQuery())
            {
                var plainType = type.SubQueryPlainType();
                var invType   = plainType.Inverse();

                if (type.IsAny())
                {
                    return(invType.Any());
                }
                if (type.IsAll())
                {
                    return(invType.All());
                }
            }

            switch (type)
            {
            case SqlExpressionType.Equal:
                return(SqlExpressionType.NotEqual);

            case SqlExpressionType.NotEqual:
                return(SqlExpressionType.Equal);

            case SqlExpressionType.GreaterThan:
                return(SqlExpressionType.SmallerOrEqualThan);

            case SqlExpressionType.SmallerThan:
                return(SqlExpressionType.GreaterOrEqualThan);

            case SqlExpressionType.GreaterOrEqualThan:
                return(SqlExpressionType.SmallerThan);

            case SqlExpressionType.SmallerOrEqualThan:
                return(SqlExpressionType.GreaterThan);

            case SqlExpressionType.And:
                return(SqlExpressionType.Or);

            case SqlExpressionType.Or:
                return(SqlExpressionType.And);

            case SqlExpressionType.Like:
                return(SqlExpressionType.NotLike);

            case SqlExpressionType.NotLike:
                return(SqlExpressionType.Like);

            case SqlExpressionType.Is:
                return(SqlExpressionType.IsNot);

            case SqlExpressionType.IsNot:
                return(SqlExpressionType.Is);
            }

            throw new ArgumentException();
        }
コード例 #25
0
ファイル: IndexRangeSet.cs プロジェクト: meikeric/deveeldb
        public IndexRangeSet Intersect(SqlExpressionType op, DataObject value)
        {
            lock (this) {
                int sz   = ranges.Count;
                var list = ranges.GetRange(0, sz);

                if (op.IsSubQuery())
                {
                    op = op.SubQueryPlainType();
                }

                if (op == SqlExpressionType.NotEqual ||
                    op == SqlExpressionType.IsNot)
                {
                    bool nullCheck = op == SqlExpressionType.NotEqual;
                    int  j         = 0;
                    while (j < sz)
                    {
                        var range      = list[j];
                        var leftRange  = IntersectOn(range, SqlExpressionType.SmallerThan, value, nullCheck);
                        var rightRange = IntersectOn(range, SqlExpressionType.GreaterThan, value, nullCheck);
                        list.RemoveAt(j);
                        if (leftRange != IndexRange.Null)
                        {
                            list.Add(leftRange);
                        }
                        if (rightRange != IndexRange.Null)
                        {
                            list.Add(rightRange);
                        }
                        j++;
                    }

                    return(new IndexRangeSet(list));
                }
                else
                {
                    bool nullCheck = op != SqlExpressionType.Is;
                    int  j         = 0;
                    while (j < sz)
                    {
                        var range = list[j];
                        range = IntersectOn(range, op, value, nullCheck);
                        if (range == IndexRange.Null)
                        {
                            list.RemoveAt(j);
                        }
                        else
                        {
                            list[j] = range;
                        }
                        j++;
                    }

                    return(new IndexRangeSet(list));
                }
            }
        }
コード例 #26
0
        /// <summary>
        /// Renders SqlExpression
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="expr"></param>
        protected virtual void Expression(StringBuilder builder, SqlExpression expr)
        {
            SqlExpressionType type = expr.Type;

            if (type == SqlExpressionType.Field)
            {
                QualifiedIdentifier(builder, expr.TableAlias, expr.Value.ToString());
            }
            else if (type == SqlExpressionType.Function)
            {
                Function(builder, expr.AggFunction, expr.SubExpr1);
            }
            else if (type == SqlExpressionType.Constant)
            {
                Constant(builder, (SqlConstant)expr.Value);
            }
            else if (type == SqlExpressionType.SubQueryText)
            {
                builder.AppendFormat("({0})", (string)expr.Value);
            }
            else if (type == SqlExpressionType.SubQueryObject)
            {
                builder.AppendFormat("({0})", RenderSelect((SelectQuery)expr.Value));
            }
            else if (type == SqlExpressionType.PseudoField)
            {
                builder.AppendFormat("{0}", (string)expr.Value);
            }
            else if (type == SqlExpressionType.Parameter)
            {
                builder.AppendFormat("{0}{1}", this.PrefixNamed, (string)expr.Value);
            }
            else if (type == SqlExpressionType.Raw)
            {
                builder.AppendFormat("{0}", (string)expr.Value);
            }
            else if (type == SqlExpressionType.Case)
            {
                CaseClause(builder, expr.CaseClause);
            }
            else if (type == SqlExpressionType.IfNull)
            {
                IfNull(builder, expr);
            }
            else if (type == SqlExpressionType.Null)
            {
                builder.Append("null");
            }
            else if (type == SqlExpressionType.Round)
            {
                Round(builder, expr);
            }
            else
            {
                throw new InvalidQueryException("Unkown expression type: " + type.ToString());
            }
        }
コード例 #27
0
        public async Task SimpleSelect(string column, SqlExpressionType op, object value, long expectedRowCount)
        {
            var columnName = new ObjectName(left.TableInfo.TableName, column);
            var expression = SqlExpression.Constant(SqlObject.New(SqlValueUtil.FromObject(value)));
            var result     = await left.SimpleSelectAsync(null, columnName, op, expression);

            Assert.NotNull(result);
            Assert.Equal(expectedRowCount, result.RowCount);
        }
コード例 #28
0
        /// <summary>
        /// Creates a new binary expression of the given type.
        /// </summary>
        /// <param name="expressionType">The type of the binary expression to be created</param>
        /// <param name="left">The left as side of the binary expression</param>
        /// <param name="right">The right as side of the binary expression</param>
        /// <remarks>
        /// <para>
        /// The allowed binary <see cref="SqlExpressionType">expression types</see> are:
        /// <list type="bullet">
        /// <item><description><see cref="SqlExpressionType.Add"/></description></item>
        /// <item><description><see cref="SqlExpressionType.Subtract"/></description></item>
        /// <item><description><see cref="SqlExpressionType.Multiply"/></description></item>
        /// <item><description><see cref="SqlExpressionType.Divide"/></description></item>
        /// <item><description><see cref="SqlExpressionType.Modulo"/></description></item>
        /// <item><description><see cref="SqlExpressionType.And"/></description></item>
        /// <item><description><see cref="SqlExpressionType.Or"/></description></item>
        /// <item><description><see cref="SqlExpressionType.XOr"/></description></item>
        /// <item><description><see cref="SqlExpressionType.Equal"/></description></item>
        /// <item><description><see cref="SqlExpressionType.NotEqual"/></description></item>
        /// <item><description><see cref="SqlExpressionType.LessThan"/></description></item>
        /// <item><description><see cref="SqlExpressionType.LessThanOrEqual"/></description></item>
        /// <item><description><see cref="SqlExpressionType.GreaterThan"/></description></item>
        /// <item><description><see cref="SqlExpressionType.GreaterThanOrEqual"/></description></item>
        /// <item><description><see cref="SqlExpressionType.Is"/></description></item>
        /// <item><description><see cref="SqlExpressionType.IsNot"/></description></item>
        /// </list>
        /// </para>
        /// </remarks>
        /// <returns>
        /// Returns an instance of <see cref="SqlBinaryExpression"/> of the given
        /// <paramref name="expressionType"/> and with the given operands.
        /// </returns>
        /// <exception cref="ArgumentException">If the given <paramref name="expressionType"/> is not a valid
        /// binary type.</exception>
        /// <exception cref="ArgumentNullException">If either <paramref name="left"/> or
        /// <paramref name="right"/> is <c>null</c></exception>
        /// <seealso cref="SqlExpressionType.Add"/>
        /// <seealso cref="SqlExpressionType.Subtract"/>
        /// <seealso cref="SqlExpressionType.Multiply"/>
        /// <seealso cref="SqlExpressionType.Modulo"/>
        /// <seealso cref="SqlExpressionType.Divide"/>
        /// <seealso cref="SqlExpressionType.And"/>
        /// <seealso cref="SqlExpressionType.Or"/>
        /// <seealso cref="SqlExpressionType.XOr"/>
        /// <seealso cref="SqlExpressionType.LessThan"/>
        /// <seealso cref="SqlExpressionType.LessThanOrEqual"/>
        /// <seealso cref="SqlExpressionType.GreaterThan"/>
        /// <seealso cref="SqlExpressionType.GreaterThanOrEqual"/>
        /// <seealso cref="SqlExpressionType.Is"/>
        /// <seealso cref="SqlExpressionType.IsNot"/>
        /// <seealso cref="SqlExpressionType.Equal"/>
        /// <seealso cref="SqlExpressionType.NotEqual"/>
        public static SqlBinaryExpression Binary(SqlExpressionType expressionType, SqlExpression left, SqlExpression right)
        {
            if (!expressionType.IsBinary())
            {
                throw new ArgumentException($"Expression type {expressionType} is not binary");
            }

            return(new SqlBinaryExpression(expressionType, left, right));
        }
コード例 #29
0
ファイル: SqlExpression.cs プロジェクト: fabrimaciel/colosoft
 /// <summary>
 /// Construtor completo.
 /// </summary>
 /// <param name="value">Expressão.</param>
 /// <param name="type">Tipo da expressão.</param>
 public SqlExpression(Expression value, SqlExpressionType type)
 {
     _type = type;
     if (type == SqlExpressionType.Column && value.Length > 0 && (value.Text[0] == '?' || value.Text[0] == '@'))
     {
         _type = SqlExpressionType.Variable;
     }
     _value = value;
 }
コード例 #30
0
        public void CreateInvalidQuantify(SqlExpressionType expressionType, SqlExpressionType opType)
        {
            var left  = SqlExpression.Constant(SqlObject.New(SqlValueUtil.FromObject(212)));
            var right = SqlExpression.Constant(SqlObject.New(SqlValueUtil.FromObject(array)));

            var binary = SqlExpression.Binary(opType, left, right);

            Assert.Throws <ArgumentException>(() => SqlExpression.Quantify(expressionType, binary));
        }
コード例 #31
0
        public static void CreateUnary(SqlExpressionType expressionType, object value)
        {
            var obj     = SqlObject.New(SqlValueUtil.FromObject(value));
            var operand = SqlExpression.Constant(obj);
            var exp     = SqlExpression.Unary(expressionType, operand);

            Assert.NotNull(exp.Operand);
            Assert.IsType <SqlConstantExpression>(exp.Operand);
        }
コード例 #32
0
ファイル: ExpressionBuilder.cs プロジェクト: deveel/deveeldb
        public IExpressionBuilder Quantified(SqlExpressionType quantifyType, Action<IExpressionBuilder> exp)
        {
            var builder = new ExpressionBuilder();
            exp(builder);

            expression = SqlExpression.Quantified(quantifyType, builder.Build());

            return this;
        }
コード例 #33
0
 public static bool IsAll(this SqlExpressionType type)
 {
     return(type == SqlExpressionType.AllEqual ||
            type == SqlExpressionType.AllNotEqual ||
            type == SqlExpressionType.AllGreaterThan ||
            type == SqlExpressionType.AllSmallerThan ||
            type == SqlExpressionType.AllGreaterOrEqualThan ||
            type == SqlExpressionType.AllSmallerOrEqualThan);
 }
コード例 #34
0
 public static bool IsAny(this SqlExpressionType type)
 {
     return(type == SqlExpressionType.AnyEqual ||
            type == SqlExpressionType.AnyNotEqual ||
            type == SqlExpressionType.AnyGreaterThan ||
            type == SqlExpressionType.AnySmallerThan ||
            type == SqlExpressionType.AnyGreaterOrEqualThan ||
            type == SqlExpressionType.AnySmallerOrEqualThan);
 }
コード例 #35
0
        public Field All(SqlExpressionType type, Field other, EvaluateContext context)
        {
            if (IsNull)
            {
                return(this);
            }

            return(GroupOperatorHelper.EvaluateAll(type, this, other, context));
        }
コード例 #36
0
        public static SqlUnaryExpression Unary(SqlExpressionType expressionType, SqlExpression operand)
        {
            if (!expressionType.IsUnary())
            {
                throw new ArgumentException($"Expression type {expressionType} is not unary");
            }

            return(new SqlUnaryExpression(expressionType, operand));
        }
コード例 #37
0
        public static SqlQuantifyExpression Quantify(SqlExpressionType expressionType, SqlBinaryExpression expression)
        {
            if (!expressionType.IsQuantify())
            {
                throw new ArgumentException($"The expression type {expressionType} is not a quantification expression");
            }

            return(new SqlQuantifyExpression(expressionType, expression));
        }
コード例 #38
0
        public static Field EvaluateAll(SqlExpressionType plainType, Field ob1, Field ob2,
			EvaluateContext context)
        {
            if (ob2.Type is QueryType) {
                // The sub-query plan
                var planObj = (SqlQueryObject) ob2.Value;

                // Discover the correlated variables for this plan.
                var list = planObj.QueryPlan.DiscoverQueryReferences(1);

                if (list.Count > 0) {
                    // Set the correlated variables from the IVariableResolver
                    foreach (var variable in list) {
                        variable.Evaluate(context.VariableResolver, context.Request);
                    }

                    // Clear the cache in the context
                    context.Request.Access().ClearCachedTables();
                }

                // Evaluate the plan,
                var t = planObj.QueryPlan.Evaluate(context.Request);

                var revPlainOp = plainType.Reverse();
                return Field.Boolean(t.AllRowsMatchColumnValue(0, revPlainOp, ob1));
            }
            if (ob2.Type is ArrayType) {
                var expList = (SqlArray) ob2.Value;

                // Assume true unless otherwise found to be false or NULL.
                Field retVal = Field.BooleanTrue;
                foreach (var exp in expList) {
                    var expItem = exp.Evaluate(context);

                    if (expItem.ExpressionType != SqlExpressionType.Constant)
                        throw new InvalidOperationException();

                    var evalItem = (SqlConstantExpression)expItem;

                    // If there is a null item, we return null if not otherwise found to
                    // be false.
                    if (evalItem.Value.IsNull) {
                        retVal = Field.BooleanNull;
                    } else if (!IsTrue(Evaluate(ob1, plainType, evalItem.Value, context/*, true, false*/))) {
                        // If it doesn't match return false
                        return Field.BooleanFalse;
                    }
                }

                // Otherwise return true or null.  If all match and no NULLs return
                // true.  If all match and there are NULLs then return NULL.
                return retVal;
            }

            throw new InvalidOperationException("Unknown RHS of ALL.");
        }
コード例 #39
0
        public static DataObject EvaluateAny(SqlExpressionType plainType, DataObject ob1, DataObject ob2, EvaluateContext context)
        {
            if (ob2.Type is QueryType) {
                // The sub-query plan
                var plan = ((SqlQueryObject)ob2.Value).QueryPlan;
                // Discover the correlated variables for this plan.
                var list = plan.DiscoverQueryReferences(1);

                if (list.Count > 0) {
                    // Set the correlated variables from the IVariableResolver
                    foreach (var variable in list) {
                        variable.Evaluate(context.VariableResolver);
                    }

                    // Clear the cache in the context
                    context.QueryContext.TableCache.Clear();
                }

                // Evaluate the plan,
                var t = plan.Evaluate(context.QueryContext);

                // The ANY operation
                var revPlainOp = plainType.Reverse();
                // TODO: return t.ColumnMatchesValue(0, revPlainOp, ob1);
                throw new NotImplementedException();
            }

            if (ob2.Type is ArrayType) {
                var expList = (SqlArray)ob2.Value;
                // Assume there are no matches
                var retVal = DataObject.BooleanFalse;
                foreach (var exp in expList) {
                    var expItem = exp.Evaluate(context);
                    if (expItem.ExpressionType != SqlExpressionType.Constant)
                        throw new InvalidOperationException();

                    var evalItem = (SqlConstantExpression) expItem;

                    // If null value, return null if there isn't otherwise a match found.
                    if (evalItem.Value.IsNull) {
                        retVal = DataObject.BooleanNull;
                    } else if (IsTrue(Evaluate(ob1, plainType, evalItem.Value, context))) {
                        // If there is a match, the ANY set test is true
                        return DataObject.BooleanTrue;
                    }
                }
                // No matches, so return either false or NULL.  If there are no matches
                // and no nulls, return false.  If there are no matches and there are
                // nulls present, return null.
                return retVal;
            }

            throw new InvalidOperationException("Unknown RHS of ANY.");
        }
コード例 #40
0
        internal SqlBinaryExpression(SqlExpression left, SqlExpressionType expressionType, SqlExpression right)
        {
            if (left == null)
                throw new ArgumentNullException("left");
            if (right == null)
                throw new ArgumentNullException("right");

            this.expressionType = expressionType;

            Left = left;
            Right = right;
        }
コード例 #41
0
        internal SqlQuantifiedExpression(SqlExpressionType type, SqlExpression value)
        {
            if (type != SqlExpressionType.All &&
                type != SqlExpressionType.Any)
                throw new ArgumentException("Invalid quantified type");

            if (value == null)
                throw new ArgumentNullException("value");

            this.type = type;
            ValueExpression = value;
        }
コード例 #42
0
ファイル: ExpressionBuilder.cs プロジェクト: deveel/deveeldb
        public IExpressionBuilder Binary(SqlExpressionType binaryType, Action<IExpressionBuilder> right)
        {
            if (expression == null)
                throw new InvalidOperationException();

            var builder = new ExpressionBuilder();
            right(builder);

            expression = SqlExpression.Binary(expression, binaryType, builder.Build());

            VerifyUnary();

            return this;
        }
コード例 #43
0
        public IndexRangeSet Intersect(SqlExpressionType op, DataObject value)
        {
            lock (this) {
                int sz = ranges.Count;
                var list = ranges.GetRange(0, sz);

                if (op.IsSubQuery())
                    op = op.SubQueryPlainType();

                if (op == SqlExpressionType.NotEqual ||
                    op == SqlExpressionType.IsNot) {
                    bool nullCheck = op == SqlExpressionType.NotEqual;
                    int j = 0;
                    while (j < sz) {
                        var range = list[j];
                        var leftRange = IntersectOn(range, SqlExpressionType.SmallerThan, value, nullCheck);
                        var rightRange = IntersectOn(range, SqlExpressionType.GreaterThan, value, nullCheck);
                        list.RemoveAt(j);
                        if (leftRange != IndexRange.Null) {
                            list.Add(leftRange);
                        }
                        if (rightRange != IndexRange.Null) {
                            list.Add(rightRange);
                        }
                        j++;
                    }

                    return new IndexRangeSet(list);
                } else {
                    bool nullCheck = op != SqlExpressionType.Is;
                    int j = 0;
                    while (j < sz) {
                        var range = list[j];
                        range = IntersectOn(range, op, value, nullCheck);
                        if (range == IndexRange.Null) {
                            list.RemoveAt(j);
                        } else {
                            list[j] = range;
                        }
                        j++;
                    }

                    return new IndexRangeSet(list);
                }
            }
        }
コード例 #44
0
ファイル: QueryTablePlanner.cs プロジェクト: prepare/deveeldb
 public SimpleSelectPlan(QueryTablePlanner planner, ObjectName columnName, SqlExpressionType op, SqlExpression expression)
     : base(0.2f)
 {
     this.planner = planner;
     this.columnName = columnName;
     this.op = op;
     this.expression = expression;
 }
コード例 #45
0
 private DataObject EvaluateUnary(DataObject operand, SqlExpressionType unaryType)
 {
     switch (unaryType) {
         case SqlExpressionType.UnaryPlus:
             return operand.Plus();
         case SqlExpressionType.Negate:
         case SqlExpressionType.Not:
             return operand.Negate();
         default:
             throw new ExpressionEvaluateException(String.Format("Expression of type '{0}' is not unary.", unaryType));
     }
 }
コード例 #46
0
        private SqlExpression EvaluateBinary(SqlExpression left, SqlExpressionType binaryType, SqlExpression right)
        {
            if (left.ExpressionType != SqlExpressionType.Constant)
                throw new ExpressionEvaluateException("The evaluated left side of a binary expression is not constant");
            if (right.ExpressionType != SqlExpressionType.Constant)
                throw new ExpressionEvaluateException("The evaluated right side of a binary expression is not constant.");

            var value1 = ((SqlConstantExpression) left).Value;
            var value2 = ((SqlConstantExpression) right).Value;

            var result = EvaluateBinary(value1, binaryType, value2);

            return SqlExpression.Constant(result);
        }
コード例 #47
0
        private DataObject EvaluateBinary(DataObject left, SqlExpressionType binaryType, DataObject right)
        {
            if (binaryType.IsAll())
                return left.Any(binaryType.SubQueryPlainType(), right, context);
            if (binaryType.IsAny())
                return left.All(binaryType.SubQueryPlainType(), right, context);

            switch (binaryType) {
                case SqlExpressionType.Add:
                    return left.Add(right);
                case SqlExpressionType.Subtract:
                    return left.Subtract(right);
                case SqlExpressionType.Multiply:
                    return left.Multiply(right);
                case SqlExpressionType.Divide:
                    return left.Divide(right);
                case SqlExpressionType.Modulo:
                    return left.Modulus(right);
                case SqlExpressionType.GreaterThan:
                    return left.IsGreaterThan(right);
                case SqlExpressionType.GreaterOrEqualThan:
                    return left.IsGreterOrEqualThan(right);
                case SqlExpressionType.SmallerThan:
                    return left.IsSmallerThan(right);
                case SqlExpressionType.SmallerOrEqualThan:
                    return left.IsSmallerOrEqualThan(right);
                case SqlExpressionType.Equal:
                    return left.IsEqualTo(right);
                case SqlExpressionType.NotEqual:
                    return left.IsNotEqualTo(right);
                case SqlExpressionType.Is:
                    return left.Is(right);
                case SqlExpressionType.IsNot:
                    return left.IsNot(right);
                case SqlExpressionType.Like:
                    return left.IsLike(right);
                case SqlExpressionType.NotLike:
                    return left.IsNotLike(right);
                case SqlExpressionType.And:
                    return left.And(right);
                case SqlExpressionType.Or:
                    return left.Or(right);
                case SqlExpressionType.XOr:
                    return left.XOr(right);
                // TODO: ANY and ALL
                default:
                    throw new ExpressionEvaluateException(String.Format("The type {0} is not a binary expression or is not supported.", binaryType));
            }
        }
コード例 #48
0
        private static Field Evaluate(Field left, SqlExpressionType binaryType, Field right, EvaluateContext context/*, bool isAll, bool isAny*/)
        {
            //if (isAny)
            //	return left.Any(binaryType, right, context);
            //if (isAll)
            //	return left.All(binaryType, right, context);

            switch (binaryType) {
                case SqlExpressionType.Add:
                    return left.Add(right);
                case SqlExpressionType.Subtract:
                    return left.Subtract(right);
                case SqlExpressionType.Multiply:
                    return left.Multiply(right);
                case SqlExpressionType.Divide:
                    return left.Divide(right);
                case SqlExpressionType.Modulo:
                    return left.Modulus(right);
                case SqlExpressionType.GreaterThan:
                    return left.IsGreaterThan(right);
                case SqlExpressionType.GreaterOrEqualThan:
                    return left.IsGreterOrEqualThan(right);
                case SqlExpressionType.SmallerThan:
                    return left.IsSmallerThan(right);
                case SqlExpressionType.SmallerOrEqualThan:
                    return left.IsSmallerOrEqualThan(right);
                case SqlExpressionType.Equal:
                    return left.IsEqualTo(right);
                case SqlExpressionType.NotEqual:
                    return left.IsNotEqualTo(right);
                case SqlExpressionType.Is:
                    return left.Is(right);
                case SqlExpressionType.IsNot:
                    return left.IsNot(right);
                case SqlExpressionType.Like:
                    return left.IsLike(right);
                case SqlExpressionType.NotLike:
                    return left.IsNotLike(right);
                case SqlExpressionType.And:
                    return left.And(right);
                case SqlExpressionType.Or:
                    return left.Or(right);
                case SqlExpressionType.XOr:
                    return left.XOr(right);
                // TODO: ANY and ALL
                default:
                    throw new ExpressionEvaluateException(String.Format("The type {0} is not a binary expression or is not supported.", binaryType));
            }
        }
コード例 #49
0
ファイル: ExpressionBuilder.cs プロジェクト: deveel/deveeldb
 public IExpressionBuilder Unary(SqlExpressionType unaryType)
 {
     prevUnaryType = unaryType;
     return this;
 }
コード例 #50
0
 private static string GetBinaryOperatorString(SqlExpressionType expressionType)
 {
     switch (expressionType) {
         case SqlExpressionType.Add:
             return "+";
         case SqlExpressionType.Subtract:
             return "-";
         case SqlExpressionType.Divide:
             return "/";
         case SqlExpressionType.Multiply:
             return "*";
         case SqlExpressionType.Modulo:
             return "%";
         case SqlExpressionType.Equal:
             return "=";
         case SqlExpressionType.NotEqual:
             return "<>";
         case SqlExpressionType.GreaterThan:
             return ">";
         case SqlExpressionType.GreaterOrEqualThan:
             return ">=";
         case SqlExpressionType.SmallerThan:
             return "<";
         case SqlExpressionType.SmallerOrEqualThan:
             return "<=";
         case SqlExpressionType.Is:
             return "IS";
         case SqlExpressionType.IsNot:
             return "IS NOT";
         case SqlExpressionType.Like:
             return "LIKE";
         case SqlExpressionType.NotLike:
             return "NOT LIKE";
         case SqlExpressionType.AllEqual:
             return "= ALL";
         case SqlExpressionType.AllNotEqual:
             return "<> ALL";
         case SqlExpressionType.AllGreaterThan:
             return "> ALL";
         case SqlExpressionType.AllGreaterOrEqualThan:
             return ">= ALL";
         case SqlExpressionType.AllSmallerThan:
             return "< ALL";
         case SqlExpressionType.AllSmallerOrEqualThan:
             return "<= ALL";
         case SqlExpressionType.AnyEqual:
             return "= ANY";
         case SqlExpressionType.AnyNotEqual:
             return "<> ANY";
         case SqlExpressionType.AnyGreaterThan:
             return "> ANY";
         case SqlExpressionType.AnyGreaterOrEqualThan:
             return ">= ANY";
         case SqlExpressionType.AnySmallerThan:
             return "< ANY";
         case SqlExpressionType.AnySmallerOrEqualThan:
             return "<= ANY";
         case SqlExpressionType.Or:
             return "OR";
         case SqlExpressionType.And:
             return "AND";
         case SqlExpressionType.XOr:
             return "XOR";
         default:
             throw new NotSupportedException();
     }
 }
コード例 #51
0
 private string GetUnaryOperatorString(SqlExpressionType unaryType)
 {
     switch (unaryType) {
         case SqlExpressionType.UnaryPlus:
             return "+";
         case SqlExpressionType.Negate:
             return "-";
         case SqlExpressionType.Not:
             return "NOT";
         default:
             throw new NotSupportedException();
     }
 }
コード例 #52
0
        public static IEnumerable<int> SelectRows(this ITable table, int[] columnOffsets, SqlExpressionType op,
			DataObject[] values)
        {
            if (columnOffsets.Length > 1)
                throw new NotSupportedException("Multi-column selects not supported yet.");

            return SelectRows(table, columnOffsets[0], op, values[0]);
        }
コード例 #53
0
        public static IEnumerable<int> SelectFromPattern(this ITable table, int column, SqlExpressionType op, DataObject ob)
        {
            if (ob.IsNull)
                return new List<int>();

            if (op == SqlExpressionType.NotLike) {
                // How this works:
                //   Find the set or rows that are like the pattern.
                //   Find the complete set of rows in the column.
                //   Sort the 'like' rows
                //   For each row that is in the original set and not in the like set,
                //     add to the result list.
                //   Result is the set of not like rows ordered by the column.

                var likeSet = (List<int>)table.Search(column, ob.ToString());
                // Don't include NULL values
                var nullCell = DataObject.Null(ob.Type);
                IList<int> originalSet = table.SelectRows(column, SqlExpressionType.IsNot, nullCell).ToList();
                int listSize = System.Math.Max(4, (originalSet.Count - likeSet.Count) + 4);
                List<int> resultSet = new List<int>(listSize);
                likeSet.Sort();
                int size = originalSet.Count;
                for (int i = 0; i < size; ++i) {
                    int val = originalSet[i];
                    // If val not in like set, add to result
                    if (likeSet.BinarySearch(val) == 0) {
                        resultSet.Add(val);
                    }
                }
                return resultSet;
            }

            // if (op.is("like")) {
            return table.Search(column, ob.ToString());
        }
コード例 #54
0
        public static ITable SelectAnyAllNonCorrelated(this ITable table, ObjectName[] leftColumns, SqlExpressionType op, ITable rightTable)
        {
            if (rightTable.TableInfo.ColumnCount != leftColumns.Length) {
                throw new ArgumentException(String.Format("The right table has {0} columns that is different from the specified column names ({1})",
                    rightTable.TableInfo.ColumnCount, leftColumns.Length));
            }

            // Handle trivial case of no entries to select from
            if (table.RowCount == 0)
                return table;

            // Resolve the vars in the left table and check the references are
            // compatible.
            var sz = leftColumns.Length;
            var leftColMap = new int[sz];
            var rightColMap = new int[sz];
            for (int i = 0; i < sz; ++i) {
                leftColMap[i] = table.FindColumn(leftColumns[i]);
                rightColMap[i] = i;

                if (leftColMap[i] == -1)
                    throw new Exception("Invalid reference: " + leftColumns[i]);

                var leftType = table.TableInfo[leftColMap[i]].ColumnType;
                var rightType = rightTable.TableInfo[i].ColumnType;
                if (!leftType.IsComparable(rightType)) {
                    throw new ArgumentException(String.Format("The type of the sub-query expression {0}({1}) " +
                                                              "is not compatible with the sub-query type {2}.",
                        leftColumns[i], leftType, rightType));
                }
            }

            IEnumerable<int> rows;

            if (!op.IsSubQuery())
                throw new ArgumentException(String.Format("The operator {0} is not a sub-query form.", op));

            if (op.IsAll()) {
                // ----- ALL operation -----
                // We work out as follows:
                //   For >, >= type ALL we find the highest value in 'table' and
                //   select from 'source' all the rows that are >, >= than the
                //   highest value.
                //   For <, <= type ALL we find the lowest value in 'table' and
                //   select from 'source' all the rows that are <, <= than the
                //   lowest value.
                //   For = type ALL we see if 'table' contains a single value.  If it
                //   does we select all from 'source' that equals the value, otherwise an
                //   empty table.
                //   For <> type ALL we use the 'not in' algorithm.

                if (op == SqlExpressionType.AllGreaterThan ||
                    op == SqlExpressionType.AllGreaterOrEqualThan) {
                    // Select the last from the set (the highest value),
                    var highestCells = rightTable.GetLastValues(rightColMap);
                    // Select from the source table all rows that are > or >= to the
                    // highest cell,
                    rows = table.SelectRows(leftColMap, op, highestCells);
                } else if (op == SqlExpressionType.AllSmallerThan ||
                           op == SqlExpressionType.AllSmallerOrEqualThan) {
                    // Select the first from the set (the lowest value),
                    var lowestCells = rightTable.GetFirstValues(rightColMap);
                    // Select from the source table all rows that are < or <= to the
                    // lowest cell,
                    rows = table.SelectRows(leftColMap, op, lowestCells);
                } else if (op == SqlExpressionType.AllEqual) {
                    // Select the single value from the set (if there is one).
                    var singleCell = rightTable.GetSingleValues(rightColMap);
                    if (singleCell != null) {
                        // Select all from source_table all values that = this cell
                        rows = table.SelectRows(leftColMap, op, singleCell);
                    } else {
                        // No single value so return empty set (no value in LHS will equal
                        // a value in RHS).
                        return table.EmptySelect();
                    }
                } else if (op == SqlExpressionType.AllNotEqual) {
                    // Equiv. to NOT IN
                    rows = table.SelectRowsNotIn(rightTable, leftColMap, rightColMap);
                } else {
                    throw new ArgumentException(String.Format("Operator of type {0} is not valid in ALL functions.", op.SubQueryPlainType()));
                }
            } else {
                // ----- ANY operation -----
                // We work out as follows:
                //   For >, >= type ANY we find the lowest value in 'table' and
                //   select from 'source' all the rows that are >, >= than the
                //   lowest value.
                //   For <, <= type ANY we find the highest value in 'table' and
                //   select from 'source' all the rows that are <, <= than the
                //   highest value.
                //   For = type ANY we use same method from INHelper.
                //   For <> type ANY we iterate through 'source' only including those
                //   rows that a <> query on 'table' returns size() != 0.

                if (op == SqlExpressionType.AnyGreaterThan ||
                    op == SqlExpressionType.AnyGreaterOrEqualThan) {
                    // Select the first from the set (the lowest value),
                    var lowestCells = rightTable.GetFirstValues(rightColMap);
                    // Select from the source table all rows that are > or >= to the
                    // lowest cell,
                    rows = table.SelectRows(leftColMap, op, lowestCells);
                } else if (op == SqlExpressionType.AnySmallerThan ||
                           op == SqlExpressionType.AnySmallerOrEqualThan) {
                    // Select the last from the set (the highest value),
                    var highestCells = rightTable.GetLastValues(rightColMap);
                    // Select from the source table all rows that are < or <= to the
                    // highest cell,
                    rows = table.SelectRows(leftColMap, op, highestCells);
                } else if (op == SqlExpressionType.AnyEqual) {
                    // Equiv. to IN
                    rows = table.SelectRowsIn(rightTable, leftColMap, rightColMap);
                } else if (op == SqlExpressionType.AnyNotEqual) {
                    // Select the value that is the same of the entire column
                    var cells = rightTable.GetSingleValues(rightColMap);
                    if (cells != null) {
                        // All values from 'source_table' that are <> than the given cell.
                        rows = table.SelectRows(leftColMap, op, cells);
                    } else {
                        // No, this means there are different values in the given set so the
                        // query evaluates to the entire table.
                        return table;
                    }
                } else {
                    throw new ArgumentException(String.Format("Operator of type {0} is not valid in ANY functions.", op.SubQueryPlainType()));
                }
            }

            return new VirtualTable(table, rows.ToArray());
        }
コード例 #55
0
ファイル: QueryTablePlanner.cs プロジェクト: prepare/deveeldb
        private static void AddSingleColumnPlan(IList<SingleColumnPlan> list, TablePlan table, ObjectName columnName, ObjectName uniqueName, SqlExpression[] expParts, SqlExpressionType op)
        {
            var exp = SqlExpression.Binary(expParts[0], op, expParts[1]);

            // Is this source in the list already?
            foreach (var existingPlan in list) {
                if (existingPlan.TablePlan == table &&
                    (columnName == null || existingPlan.ColumnName.Equals(columnName))) {
                    // Append to end of current expression
                    existingPlan.SetSource(columnName, SqlExpression.And(existingPlan.Expression, exp));
                    return;
                }
            }

            // Didn't find so make a new entry in the list.
            list.Add(new SingleColumnPlan(table, columnName, uniqueName, exp));
        }
コード例 #56
0
 public static bool AllRowsMatchColumnValue(this ITable table, int columnOffset, SqlExpressionType op, DataObject value)
 {
     var rows = table.SelectRows(columnOffset, op, value);
     return rows.Count() == table.RowCount;
 }
コード例 #57
0
ファイル: IndexRangeSet.cs プロジェクト: deveel/deveeldb
        private static IndexRange IntersectOn(IndexRange range, SqlExpressionType op, Field value, bool nullCheck)
        {
            var start = range.StartValue;
            var startPosition = range.StartOffset;
            var end = range.EndValue;
            var endPosition = range.EndOffset;

            bool inclusive = op == SqlExpressionType.Is ||
                             op == SqlExpressionType.Equal ||
                             op == SqlExpressionType.GreaterOrEqualThan ||
                             op == SqlExpressionType.SmallerOrEqualThan;

            if (op == SqlExpressionType.Is ||
                op == SqlExpressionType.Equal ||
                op == SqlExpressionType.GreaterThan ||
                op == SqlExpressionType.GreaterOrEqualThan) {
                // With this operator, NULL values must return null.
                if (nullCheck && value.IsNull) {
                    return IndexRange.Null;
                }

                if (start.Equals(IndexRange.FirstInSet)) {
                    start = value;
                    startPosition = inclusive ? RangeFieldOffset.FirstValue : RangeFieldOffset.AfterLastValue;
                } else {
                    int c = value.CompareTo(start);
                    if ((c == 0 && startPosition == RangeFieldOffset.FirstValue) || c > 0) {
                        start = value;
                        startPosition = inclusive ? RangeFieldOffset.FirstValue : RangeFieldOffset.AfterLastValue;
                    }
                }
            }

            if (op == SqlExpressionType.Is ||
                op == SqlExpressionType.Equal ||
                op == SqlExpressionType.SmallerThan ||
                op == SqlExpressionType.SmallerOrEqualThan) {
                // With this operator, NULL values must return null.
                if (nullCheck && value.IsNull) {
                    return IndexRange.Null;
                }

                // If start is first in set, then we have to change it to after NULL
                if (nullCheck && start.Equals(IndexRange.FirstInSet)) {
                    start = Field.Null();
                    startPosition = RangeFieldOffset.AfterLastValue;
                }

                if (end.Equals(IndexRange.LastInSet)) {
                    end = value;
                    endPosition = inclusive ? RangeFieldOffset.LastValue : RangeFieldOffset.BeforeFirstValue;
                } else {
                    int c = value.CompareTo(end);
                    if ((c == 0 && endPosition == RangeFieldOffset.LastValue) || c < 0) {
                        end = value;
                        endPosition = inclusive ? RangeFieldOffset.LastValue : RangeFieldOffset.BeforeFirstValue;
                    }
                }
            }

            // If start and end are not null types (if either are, then it means it
            // is a placeholder value meaning start or end of set).
            if (!start.Equals(IndexRange.FirstInSet) &&
                !end.Equals(IndexRange.LastInSet)) {
                // If start is higher than end, return null
                int c = start.CompareTo(end);
                if ((c == 0 && (startPosition == RangeFieldOffset.AfterLastValue ||
                                endPosition == RangeFieldOffset.BeforeFirstValue)) ||
                    c > 0) {
                    return IndexRange.Null;
                }
            }

            // The new intersected range
            return new IndexRange(startPosition, start, endPosition, end);
        }
コード例 #58
0
 internal SqlUnaryExpression(SqlExpressionType expressionType, SqlExpression operand)
 {
     this.expressionType = expressionType;
     Operand = operand;
 }
コード例 #59
0
 protected OperandsMutableSqlExpression(SqlExpressionType sqlExpressionType, Type type, IList<Expression> operands)
     : base(sqlExpressionType, type)
 {
     if(operands !=null)
       this.Operands.AddRange(operands);
 }
コード例 #60
0
 private SqlUnaryExpression(ObjectData data)
     : base(data)
 {
     Operand = data.GetValue<SqlExpression>("Operand");
     expressionType = (SqlExpressionType) data.GetInt32("Operator");
 }