Example #1
0
        private SqlWhereClause Substitute(SqlSelectSpec spec, SqlIdentifier inputParam, SqlWhereClause whereClause)
        {
            if (whereClause == null)
            {
                return(null);
            }

            if (spec is SqlSelectStarSpec)
            {
                return(whereClause);
            }
            else
            {
                SqlSelectValueSpec selValue = spec as SqlSelectValueSpec;
                if (selValue != null)
                {
                    SqlScalarExpression replaced    = selValue.Expression;
                    SqlScalarExpression original    = whereClause.FilterExpression;
                    SqlScalarExpression substituted = SqlExpressionManipulation.Substitute(replaced, inputParam, original);
                    SqlWhereClause      result      = SqlWhereClause.Create(substituted);
                    return(result);
                }
            }

            throw new DocumentQueryException("Unexpected SQL select clause type: " + spec.Kind);
        }
        public override int Visit(SqlWhereClause sqlWhereClause)
        {
            int hashCode = SqlWhereClauseHashCode;

            hashCode = CombineHashes(hashCode, sqlWhereClause.FilterExpression.Accept(this));
            return(hashCode);
        }
 public virtual void Visiting(SqlWhereClause whereClause)
 {
     if (whereClause.HasChild())
     {
         sqlBuilder.Append(" Where ");
     }
 }
        public override SqlObject VisitWhere_clause([NotNull] sqlParser.Where_clauseContext context)
        {
            Contract.Requires(context != null);
            SqlScalarExpression sqlScalarExpression = (SqlScalarExpression)this.Visit(context.scalar_expression());

            return(SqlWhereClause.Create(sqlScalarExpression));
        }
Example #5
0
        public void SqlStringTest()
        {
            ISqlObject     source = new SqlServerSource("Table");
            SqlWhereClause target = new SqlWhereClause();

            target.Condition = new SqlServerField(source, "ID", null).GreaterThan(new SqlStringExpression("1000"));
            Assert.AreEqual <string>(string.Format("{0} {1}", target.Keyword, target.Condition.SqlString), target.SqlString);
        }
Example #6
0
 public void ExecuteWhereClause(SqlWhereClause whereClause)
 {
     foreach (var child in whereClause.Children)
     {
         var filter = HelperConditional.GetRowFilter(( SqlBooleanExpression )child, this);
         RawRowList = RawRowList.Where(r => filter.IsValid(r)).ToList(  );
     }
 }
Example #7
0
        public override void Visit(SqlWhereClause codeObject)
        {
            _stringBuilder.Append("WHERE");

            using (_stringBuilder.CreateIndentationContext())
            {
                _stringBuilder.AppendIndentedLine();

                codeObject.Expression.Accept(this);
            }
        }
Example #8
0
        private void AddWhereParameter(MemoryDbDataReader.ResultBatchWithRawRows batch, RawData rawData,
                                       List <RawTableRow> rows, SqlWhereClause whereClause)
        {
            var tableColumn = Helper.FindTableAndColumn(null, _PartitionField, rawData.TableAliasList);
            var value       = new SelectDataFromColumn(tableColumn, _RawData).Select(new RawTableJoinRow(rows));

            rawData.Parameters.Add(new MemoryDbParameter {
                ParameterName = _PartitionField, Value = value
            });
            rawData.WhereClause = whereClause.Expression;
        }
Example #9
0
        public SqlSelectQuery <T> Where(Expression <Func <T, bool> > predicate)
        {
            if (predicate == null)
            {
                return(this);
            }
            var clause = new SqlWhereClause(predicate);

            Clauses.Add(clause);
            return(this);
        }
Example #10
0
        public void GetHashCodeTest()
        {
            const string cn   = "columnName";
            const string cv   = "columnValue";
            var          swc1 = HelperObjectFactory.MakeSqlWhereClause();
            var          swc2 = HelperObjectFactory.MakeSqlWhereClause(Conjunction.Between, cn, Operator.NotEqual, cv);
            var          swc3 = new SqlWhereClause(swc1);

            Assert.AreEqual(swc1.GetHashCode(), swc1.GetHashCode());
            Assert.AreEqual(swc1.GetHashCode(), swc3.GetHashCode());
            Assert.AreNotEqual(swc1.GetHashCode(), swc2.GetHashCode());
        }
Example #11
0
 public SqlQuery(
     SqlSelectClause selectClause,
     SqlFromClause fromClause,
     SqlWhereClause whereClause,
     SqlOrderbyClause orderbyClause)
     : base(SqlObjectKind.Query)
 {
     this.SelectClause  = selectClause;
     this.FromClause    = fromClause;
     this.WhereClause   = whereClause;
     this.OrderbyClause = orderbyClause;
 }
Example #12
0
        public SqlSelectQuery <T> Where(string predicate)
        {
            if (predicate == null)
            {
                return(this);
            }
            var exp    = Expression.Constant(predicate);
            var clause = new SqlWhereClause(exp as Expression);

            Clauses.Add(clause);
            return(this);
        }
Example #13
0
 private static IEnumerable <CosmosElement> ExecuteWhereClause(
     IEnumerable <CosmosElement> dataSource,
     SqlWhereClause sqlWhereClause)
 {
     return(dataSource
            .Where(element =>
     {
         CosmosElement evaluation = sqlWhereClause.FilterExpression.Accept(
             ScalarExpressionEvaluator.Singleton,
             element);
         return evaluation is CosmosBoolean cosmosBoolean && cosmosBoolean.Value;
     }));
 }
Example #14
0
        /// <summary>
        /// Add a Where clause to a query; may need to create a new query.
        /// </summary>
        /// <param name="whereClause">Clause to add.</param>
        /// <param name="context">The translation context.</param>
        /// <returns>A new query containing the specified Where clause.</returns>
        public QueryUnderConstruction AddWhereClause(SqlWhereClause whereClause, TranslationContext context)
        {
            QueryUnderConstruction result = context.PackageCurrentQueryIfNeccessary();

            whereClause        = QueryUnderConstruction.CombineWithConjunction(result.whereClause, whereClause);
            result.whereClause = whereClause;
            foreach (Binding binding in context.CurrentSubqueryBinding.TakeBindings())
            {
                result.AddBinding(binding);
            }

            return(result);
        }
        public override bool Visit(SqlWhereClause first, SqlObject secondAsObject)
        {
            if (!(secondAsObject is SqlWhereClause second))
            {
                return(false);
            }

            if (!Equals(first.FilterExpression, second.FilterExpression))
            {
                return(false);
            }

            return(true);
        }
Example #16
0
        /// <summary>
        /// Add a Where clause to a query; may need to create a new query.
        /// </summary>
        /// <param name="whereClause">Clause to add.</param>
        /// <param name="elementType">Type of element in input collection.</param>
        /// <param name="inScope">Set of parameter names in scope.</param>
        /// <returns>A new query containing the specified Where clause.</returns>
        public QueryUnderConstruction AddWhereClause(SqlWhereClause whereClause, Type elementType, HashSet <ParameterExpression> inScope)
        {
            QueryUnderConstruction.ValidateNonSubquerySupport(this);

            QueryUnderConstruction result = this;

            if (this.selectClause != null)
            {
                result = this.PackageQuery(inScope);
            }

            whereClause        = QueryUnderConstruction.CombineWithConjunction(result.whereClause, whereClause);
            result.whereClause = whereClause;
            return(result);
        }
Example #17
0
        public void EqualsTest()
        {
            const string cn   = "columnName";
            const string cv   = "columnValue";
            var          swc1 = HelperObjectFactory.MakeSqlWhereClause();
            var          swc2 = HelperObjectFactory.MakeSqlWhereClause(Conjunction.Between, cn, Operator.NotEqual, cv);
            var          swc3 = new SqlWhereClause(swc1);

            Assert.IsFalse(swc1.Equals((object)null));
            Assert.IsFalse(swc1.Equals(null));

            Assert.IsTrue(swc1.Equals((object)swc1));
            Assert.IsTrue(swc1.Equals(swc1));

            Assert.IsFalse(swc1.Equals(swc2));
            Assert.IsTrue(swc1.Equals(swc3));
        }
Example #18
0
        public void ConstructorAndPropertiesTests()
        {
            const string cn  = "columnName";
            const string cv  = "columnValue";
            var          swc = HelperObjectFactory.MakeSqlWhereClause(Conjunction.Between, cn, Operator.NotEqual, cv);

            Assert.AreEqual(Conjunction.Between, swc.Conjunction);
            Assert.AreEqual(cn, swc.ColumnName);
            Assert.AreEqual(Operator.NotEqual, swc.Operator);
            Assert.AreEqual(cv, swc.ColumnValue);

            var swc2 = new SqlWhereClause(swc);

            Assert.AreEqual(swc2.Conjunction, swc.Conjunction);
            Assert.AreEqual(swc2.ColumnName, swc.ColumnName);
            Assert.AreEqual(swc2.Operator, swc.Operator);
            Assert.AreEqual(swc2.ColumnValue, swc.ColumnValue);
        }
Example #19
0
        private static SqlWhereClause CombineWithConjunction(SqlWhereClause first, SqlWhereClause second)
        {
            if (first == null)
            {
                return(second);
            }

            if (second == null)
            {
                return(first);
            }

            var previousFilter = first.FilterExpression;
            var currentFilter  = second.FilterExpression;
            var and            = new SqlBinaryScalarExpression(SqlBinaryScalarOperatorKind.And, previousFilter, currentFilter);
            var result         = new SqlWhereClause(and);

            return(result);
        }
Example #20
0
        private static SqlWhereClause CombineWithConjunction(SqlWhereClause first, SqlWhereClause second)
        {
            if (first == null)
            {
                return(second);
            }

            if (second == null)
            {
                return(first);
            }

            SqlScalarExpression       previousFilter = first.FilterExpression;
            SqlScalarExpression       currentFilter  = second.FilterExpression;
            SqlBinaryScalarExpression and            = SqlBinaryScalarExpression.Create(SqlBinaryScalarOperatorKind.And, previousFilter, currentFilter);
            SqlWhereClause            result         = SqlWhereClause.Create(and);

            return(result);
        }
Example #21
0
        /// <summary>
        /// Add a Where clause to a query; may need to create a new query.
        /// </summary>
        /// <param name="whereClause">Clause to add.</param>
        /// <param name="context">The translation context.</param>
        /// <returns>A new query containing the specified Where clause.</returns>
        public QueryUnderConstruction AddWhereClause(SqlWhereClause whereClause, TranslationContext context)
        {
            QueryUnderConstruction result = this;

            if (this.ShouldBeOnNewQuery(LinqMethods.Where, 2))
            {
                result = this.PackageQuery(context.InScope, context.PeekCollection());
                context.CurrentSubqueryBinding.ShouldBeOnNewQuery = false;
            }

            whereClause        = QueryUnderConstruction.CombineWithConjunction(result.whereClause, whereClause);
            result.whereClause = whereClause;
            foreach (Binding binding in context.CurrentSubqueryBinding.TakeBindings())
            {
                result.AddBinding(binding);
            }

            return(result);
        }
Example #22
0
            private void AddConditions(SqlWhereClause where, ISqlTableSource table)
            {
                var keys = table.GetKeys(true);

                if (keys == null)
                {
                    return;
                }

                foreach (var key in keys.OfType <SqlField>())
                {
                    var maxValue = GetMaxValue(key.DataType);
                    if (maxValue == null)
                    {
                        continue;
                    }

                    var cond = new SqlSearchCondition();

                    cond = cond.Expr(key).IsNull.Or;

                    if (maxValue is string)
                    {
                        cond.Expr(key).GreaterOrEqual.Expr(new SqlValue(maxValue));
                    }
                    else
                    {
                        cond.Expr(key).LessOrEqual.Expr(new SqlValue(maxValue));
                    }

                    where.ConcatSearchCondition(cond);

                    // only one field is enough
                    break;
                }
            }
Example #23
0
 public abstract void Visit(SqlWhereClause sqlObject);
Example #24
0
 public abstract TOutput Visit(SqlWhereClause sqlObject, TArg input);
 public virtual void Visited(SqlWhereClause whereClause)
 {
 }
Example #26
0
        /// <summary>
        /// Flatten subqueries into a single query by substituting their expressions in the current query.
        /// </summary>
        /// <returns>A flattened query.</returns>
        private QueryUnderConstruction Flatten()
        {
            // SELECT fo(y) FROM y IN (SELECT fi(x) FROM x WHERE gi(x)) WHERE go(y)
            // is translated by substituting fi(x) for y in the outer query
            // producing
            // SELECT fo(fi(x)) FROM x WHERE gi(x) AND (go(fi(x))
            if (this.inputQuery == null)
            {
                // we are flat already
                if (this.selectClause == null)
                {
                    // If selectClause doesn't exists, use SELECT v0 where v0 is the input parameter, instead of SELECT *.
                    string parameterName = this.fromParameters.GetInputParameter().Name;
                    SqlScalarExpression parameterExpression = SqlPropertyRefScalarExpression.Create(null, SqlIdentifier.Create(parameterName));
                    this.selectClause = SqlSelectClause.Create(SqlSelectValueSpec.Create(parameterExpression));
                }
                else
                {
                    this.selectClause = SqlSelectClause.Create(this.selectClause.SelectSpec, this.topSpec, this.selectClause.HasDistinct);
                }

                return(this);
            }

            QueryUnderConstruction flatInput   = this.inputQuery.Flatten();
            SqlSelectClause        inputSelect = flatInput.selectClause;
            SqlWhereClause         inputwhere  = flatInput.whereClause;

            // Determine the paramName to be replaced in the current query
            // It should be the top input parameter name which is not binded in this collection.
            // That is because if it has been binded before, it has global scope and should not be replaced.
            string           paramName        = null;
            HashSet <string> inputQueryParams = new HashSet <string>();

            foreach (Binding binding in this.inputQuery.fromParameters.GetBindings())
            {
                inputQueryParams.Add(binding.Parameter.Name);
            }

            foreach (Binding binding in this.fromParameters.GetBindings())
            {
                if (binding.ParameterDefinition == null || inputQueryParams.Contains(binding.Parameter.Name))
                {
                    paramName = binding.Parameter.Name;
                }
            }

            SqlIdentifier         replacement     = SqlIdentifier.Create(paramName);
            SqlSelectClause       composedSelect  = Substitute(inputSelect, inputSelect.TopSpec ?? this.topSpec, replacement, this.selectClause);
            SqlWhereClause        composedWhere   = Substitute(inputSelect.SelectSpec, replacement, this.whereClause);
            SqlOrderbyClause      composedOrderBy = Substitute(inputSelect.SelectSpec, replacement, this.orderByClause);
            SqlWhereClause        and             = QueryUnderConstruction.CombineWithConjunction(inputwhere, composedWhere);
            FromParameterBindings fromParams      = QueryUnderConstruction.CombineInputParameters(flatInput.fromParameters, this.fromParameters);
            SqlOffsetSpec         offsetSpec;
            SqlLimitSpec          limitSpec;

            if (flatInput.offsetSpec != null)
            {
                offsetSpec = flatInput.offsetSpec;
                limitSpec  = flatInput.limitSpec;
            }
            else
            {
                offsetSpec = this.offsetSpec;
                limitSpec  = this.limitSpec;
            }
            QueryUnderConstruction result = new QueryUnderConstruction(this.aliasCreatorFunc)
            {
                selectClause   = composedSelect,
                whereClause    = and,
                inputQuery     = null,
                fromParameters = flatInput.fromParameters,
                orderByClause  = composedOrderBy ?? this.inputQuery.orderByClause,
                offsetSpec     = offsetSpec,
                limitSpec      = limitSpec,
                alias          = new Lazy <ParameterExpression>(() => this.Alias)
            };

            return(result);
        }
        public void SqlExistsScalarExpressionTest()
        {
            CosmosObject tag = CosmosObject.Create(new Dictionary <string, CosmosElement>
            {
                ["name"] = CosmosString.Create("asdf")
            });

            CosmosObject tags = CosmosObject.Create(new Dictionary <string, CosmosElement>
            {
                ["tags"] = CosmosArray.Create(new List <CosmosElement>()
                {
                    tag
                }),
                ["_rid"] = CosmosString.Create("AYIMAMmFOw8YAAAAAAAAAA==")
            });

            CosmosObject tagsWrapped = CosmosObject.Create(new Dictionary <string, CosmosElement>
            {
                ["c"]    = tags,
                ["_rid"] = CosmosString.Create("AYIMAMmFOw8YAAAAAAAAAA==")
            });

            // EXISTS(SELECT VALUE t.name FROM t in c.tags where t.name = "asdf")
            SqlExistsScalarExpression existsScalarExpressionMatched = SqlExistsScalarExpression.Create(
                SqlQuery.Create(
                    SqlSelectClause.Create(
                        SqlSelectValueSpec.Create(
                            TestUtils.CreatePathExpression("t", "name"))),
                    SqlFromClause.Create(
                        SqlArrayIteratorCollectionExpression.Create(
                            SqlIdentifier.Create("t"),
                            SqlInputPathCollection.Create(
                                SqlIdentifier.Create("c"),
                                SqlStringPathExpression.Create(
                                    null,
                                    SqlStringLiteral.Create("tags"))))),
                    SqlWhereClause.Create(
                        SqlBinaryScalarExpression.Create(
                            SqlBinaryScalarOperatorKind.Equal,
                            TestUtils.CreatePathExpression("t", "name"),
                            SqlLiteralScalarExpression.Create(SqlStringLiteral.Create("asdf")))),
                    groupByClause: null,
                    orderByClause: null,
                    offsetLimitClause: null));

            AssertEvaluation(CosmosBoolean.Create(true), existsScalarExpressionMatched, tagsWrapped);

            SqlExistsScalarExpression existsScalarExpressionNotMatched = SqlExistsScalarExpression.Create(
                SqlQuery.Create(
                    SqlSelectClause.Create(
                        SqlSelectValueSpec.Create(
                            TestUtils.CreatePathExpression("t", "name"))),
                    SqlFromClause.Create(
                        SqlArrayIteratorCollectionExpression.Create(
                            SqlIdentifier.Create("t"),
                            SqlInputPathCollection.Create(
                                SqlIdentifier.Create("c"),
                                SqlStringPathExpression.Create(
                                    null,
                                    SqlStringLiteral.Create("tags"))))),
                    SqlWhereClause.Create(
                        SqlBinaryScalarExpression.Create(
                            SqlBinaryScalarOperatorKind.NotEqual,
                            TestUtils.CreatePathExpression("t", "name"),
                            SqlLiteralScalarExpression.Create(SqlStringLiteral.Create("asdf")))),
                    groupByClause: null,
                    orderByClause: null,
                    offsetLimitClause: null));

            AssertEvaluation(CosmosBoolean.Create(false), existsScalarExpressionNotMatched, tagsWrapped);
        }
Example #28
0
 public abstract TResult Visit(SqlWhereClause sqlObject);
 public override void Visit(SqlWhereClause sqlWhereClause)
 {
     this.writer.Write("WHERE ");
     sqlWhereClause.FilterExpression.Accept(this);
 }
 public override SqlObject Visit(SqlWhereClause sqlWhereClause)
 {
     return(SqlWhereClause.Create(sqlWhereClause.FilterExpression.Accept(this) as SqlScalarExpression));
 }