Ejemplo n.º 1
0
        public override JoinExpression GetJoinExpression()
        {
            var rightIdentifier = AliasIdentifierExpression;
            var leftIdentifier  = Left.AliasIdentifierExpression;

            var onCondition = default(QueryExpression);

            foreach (var columnPair in _joinColumnPairs)
            {
                var newCondition = QueryExpression.Compare(
                    QueryExpression.Column(columnPair.LeftColumnName, leftIdentifier),
                    ComparisonOperator.AreEqual,
                    QueryExpression.Column(columnPair.RightColumnName, rightIdentifier)
                    );
                onCondition = QueryExpression.CombineConditions(onCondition, ConditionType.AndAlso, newCondition);
            }

            return(QueryExpression.Join(
                       QueryExpression.Alias(
                           Right.AliasIdentifierExpression, rightIdentifier.Identifier
                           ),
                       onCondition,
                       JoinDirection.Left
                       ));
        }
 public virtual async Task Crud_Update()
 {
     using (var tempTable = await DataTestHelpers.CreateAutoIncrementTable(DataProvider))
         using (var queryResult = await DataProvider.ExecuteReaderAsync(
                    new CompositeQueryExpression(
                        QueryExpression.Insert(
                            tempTable.TableName,
                            new[] { "Data" },
                            new object[] { 1 }
                            ),
                        QueryExpression.Update(
                            QueryExpression.Table(tempTable.TableName),
                            QueryExpression.Compare(QueryExpression.Column("Id"), ComparisonOperator.AreEqual, QueryExpression.Value(1)),
                            QueryExpression.Assign(QueryExpression.Column("Data"), QueryExpression.Value(5))
                            ),
                        QueryExpression.Select(
                            new[] { QueryExpression.Column("Data") },
                            from: QueryExpression.Table(tempTable.TableName),
                            where : QueryExpression.Compare(QueryExpression.Column("Id"), ComparisonOperator.AreEqual, QueryExpression.Value(1))
                            )
                        )))
         {
             Assert.IsTrue(queryResult.HasRows);
             Assert.IsTrue(await queryResult.ReadAsync());
             Assert.AreEqual(5, queryResult.GetInt32(0));
         }
 }
        public ExpressionResult Convert(MethodInfo methodInfo, MethodCallExpression node,
                                        ExpressionConverter expressionConverter)
        {
            var searchForExpression = expressionConverter.Convert(node.Arguments[0]);
            var searchInExpression  = expressionConverter.Convert(node.Arguments[1]);

            if (searchInExpression.QueryExpression is ValueExpression valueExpression &&
                valueExpression.Value is IEnumerable valueEnumerable)
            {
                var valueExpressions = new List <QueryExpression>();
                foreach (var value in valueEnumerable)
                {
                    valueExpressions.Add(ORMQueryExpressions.Value(value));
                }

                return(new ExpressionResult(
                           QueryExpression.Compare(searchForExpression.QueryExpression, ComparisonOperator.None,
                                                   QueryExpression.InFunction(valueExpressions.ToArray())),
                           MethodHelper.ConcatJoins(searchForExpression, searchInExpression).ToArray()
                           ));
            }

            return(new ExpressionResult(
                       QueryExpression.Compare(searchForExpression.QueryExpression, ComparisonOperator.None,
                                               QueryExpression.InFunction(searchInExpression.QueryExpression)),
                       MethodHelper.ConcatJoins(searchForExpression, searchInExpression).ToArray()
                       ));
        }
Ejemplo n.º 4
0
        protected override void WriteFunctionToSql(QueryExpression queryExpression)
        {
            switch (queryExpression)
            {
            case ConcatenateQueryExpression concatenateQueryExpression:
                for (var i = 0; i < concatenateQueryExpression.Expressions.Length; i++)
                {
                    ExpressionWriter.Visit(concatenateQueryExpression.Expressions[i]);
                    if (i < concatenateQueryExpression.Expressions.Length - 1)
                    {
                        Sql.Append(" || ");
                    }
                }
                return;

            case LastInsertIdFunctionExpression lastInsertIdExpression:
                Sql.Append("last_insert_rowid()");
                return;

            case TableExistsVirtualFunctionExpression tableExistsExpression:
                ExpressionWriter.Visit(
                    QueryExpression.Select(
                        new[] { QueryExpression.Value(1) },
                        from: QueryExpression.Table("sqlite_master"),
                        where : QueryExpression.AndAlso(
                            QueryExpression.Compare(QueryExpression.Column("type"), ComparisonOperator.AreEqual, QueryExpression.Value("table")),
                            QueryExpression.Compare(QueryExpression.Column("name"), ComparisonOperator.AreEqual, QueryExpression.Value(tableExistsExpression.Table.TableName))
                            )
                        )
                    );
                return;
            }
            base.WriteFunctionToSql(queryExpression);
        }
Ejemplo n.º 5
0
 public void OrElse(EntityField <T> schemaField, ComparisonOperator @operator, IQueryBuilder subQuery)
 {
     OrElse(QueryExpression.Compare(
                QueryExpression.Column(schemaField.Column.Name, schemaField.Source.AliasIdentifierExpression),
                @operator,
                subQuery.BuildQuery()
                ));
     AddJoin(schemaField.Source);
 }
Ejemplo n.º 6
0
 public void OrElse(EntityField <T> schemaField, ComparisonOperator @operator, T entity)
 {
     OrElse(QueryExpression.Compare(
                QueryExpression.Column(schemaField.Column.Name, schemaField.Source.AliasIdentifierExpression),
                @operator,
                GetValueExpression(schemaField, entity)
                ));
     AddJoin(schemaField.Source);
 }
Ejemplo n.º 7
0
        public void OrElse(EntityField <T> schemaField, ComparisonOperator @operator, Expression <Func <T, bool> > valueExpression)
        {
            var valueExpressionResult = ExpressionConverter.Convert(valueExpression);

            OrElse(QueryExpression.Compare(
                       QueryExpression.Column(schemaField.Column.Name, schemaField.Source.AliasIdentifierExpression),
                       @operator,
                       valueExpressionResult.QueryExpression
                       ));
            AddJoin(schemaField.Source);
        }
Ejemplo n.º 8
0
        public void OrElse <TValue>(EntityField <T> schemaField, ComparisonOperator @operator, TValue value)
        {
            var valueExpression = ORMQueryExpressions.Value(value);

            OrElse(QueryExpression.Compare(
                       QueryExpression.Column(schemaField.Column.Name, schemaField.Source.AliasIdentifierExpression),
                       @operator,
                       valueExpression
                       ));
            AddJoin(schemaField.Source);
        }
        public ExpressionResult Convert(MethodInfo methodInfo, MethodCallExpression node,
                                        ExpressionConverter expressionConverter)
        {
            var searchField = expressionConverter.Convert(node.Arguments[0]);
            var searchText  = expressionConverter.Convert(node.Arguments[1]);

            return(new ExpressionResult(
                       QueryExpression.Compare(searchField.QueryExpression, ComparisonOperator.Like, searchText.QueryExpression),
                       MethodHelper.ConcatJoins(searchField, searchText).ToArray()
                       ));
        }
        public virtual async Task Select_WithWhere()
        {
            using (var tempTable = await Select_CreatePopulatedSelectTable())
                using (var queryResult = await DataProvider.ExecuteReaderAsync(
                           QueryExpression.Select(
                               new[] { QueryExpression.All() },
                               from: QueryExpression.Table(tempTable.TableName),
                               where : QueryExpression.Compare(QueryExpression.Column("Data"), ComparisonOperator.AreEqual, QueryExpression.Value(3)),
                               limit: QueryExpression.Value(1)
                               )))
                {
                    Assert.IsTrue(queryResult.HasRows);

                    Assert.IsTrue(await queryResult.ReadAsync());
                    Assert.AreEqual(3, queryResult.GetInt32(1));

                    Assert.IsFalse(await queryResult.ReadAsync());
                }
        }
Ejemplo n.º 11
0
        public ExpressionResult Convert(MethodInfo methodInfo, MethodCallExpression node,
                                        ExpressionConverter expressionConverter)
        {
            if (node.Arguments.Count != 1)
            {
                throw new System.Exception("Incorrect number of arguments to HasFlag");
            }

            var enumValueConvertExpression  = node.Arguments[0] as UnaryExpression;
            var enumValueConstantExpression = enumValueConvertExpression.Operand;
            var convertedArgument           = expressionConverter.Convert(enumValueConstantExpression);

            var calledOn = expressionConverter.Convert(node.Object);

            return(new ExpressionResult(
                       QueryExpression.Compare(
                           new BitwiseOperationQueryExpression(calledOn.QueryExpression, BitwiseOperator.And, convertedArgument.QueryExpression),
                           ComparisonOperator.AreEqual, convertedArgument.QueryExpression),
                       MethodHelper.ConcatJoins(convertedArgument, calledOn).ToArray()
                       ));
        }
 public virtual async Task Crud_Delete()
 {
     using (var tempTable = await DataTestHelpers.CreateAutoIncrementTable(DataProvider))
         using (var queryResult = await DataProvider.ExecuteReaderAsync(
                    QueryExpression.Transaction(
                        QueryExpression.Insert(
                            tempTable.TableName,
                            new[] { "Data" },
                            new object[] { 1 }
                            ),
                        QueryExpression.Delete(
                            QueryExpression.Table(tempTable.TableName),
                            QueryExpression.Compare(QueryExpression.Column("Id"), ComparisonOperator.AreEqual, QueryExpression.Value(1))
                            ),
                        QueryExpression.Select(
                            new[] { QueryExpression.Column("Data") },
                            from: QueryExpression.Table(tempTable.TableName),
                            where : QueryExpression.Compare(QueryExpression.Column("Id"), ComparisonOperator.AreEqual, QueryExpression.Value(1))
                            )
                        )))
         {
             Assert.IsFalse(queryResult.HasRows);
         }
 }
            protected override Expression VisitBinary(BinaryExpression node)
            {
                var leftExpression  = ConvertToQueryExpression(node.Left);
                var rightExpression = ConvertToQueryExpression(node.Right);

                switch (node.NodeType)
                {
                case ExpressionType.AddChecked:
                case ExpressionType.Add:
                    SetConversionResult(
                        QueryExpression.Add(leftExpression, rightExpression)
                        );
                    break;

                case ExpressionType.SubtractChecked:
                case ExpressionType.Subtract:
                    SetConversionResult(
                        QueryExpression.Subtract(leftExpression, rightExpression)
                        );
                    break;

                case ExpressionType.MultiplyChecked:
                case ExpressionType.Multiply:
                    SetConversionResult(
                        QueryExpression.Multiply(leftExpression, rightExpression)
                        );
                    break;

                case ExpressionType.Divide:
                    SetConversionResult(
                        QueryExpression.Divide(leftExpression, rightExpression)
                        );
                    break;


                case ExpressionType.And:
                    SetConversionResult(
                        new BitwiseOperationQueryExpression(leftExpression, BitwiseOperator.And, rightExpression)
                        );
                    break;

                case ExpressionType.ExclusiveOr:
                    SetConversionResult(
                        new BitwiseOperationQueryExpression(leftExpression, BitwiseOperator.ExclusiveOr, rightExpression)
                        );
                    break;

                case ExpressionType.Or:
                    SetConversionResult(
                        new BitwiseOperationQueryExpression(leftExpression, BitwiseOperator.Or, rightExpression)
                        );
                    break;


                case ExpressionType.AndAlso:
                    SetConversionResult(
                        QueryExpression.AndAlso(leftExpression, rightExpression)
                        );
                    break;

                case ExpressionType.OrElse:
                    SetConversionResult(
                        QueryExpression.OrElse(leftExpression, rightExpression)
                        );
                    break;


                case ExpressionType.Equal:
                    SetConversionResult(
                        QueryExpression.Compare(leftExpression, ComparisonOperator.AreEqual, rightExpression)
                        );
                    break;

                case ExpressionType.NotEqual:
                    SetConversionResult(
                        QueryExpression.Compare(leftExpression, ComparisonOperator.AreNotEqual, rightExpression)
                        );
                    break;

                case ExpressionType.GreaterThan:
                    SetConversionResult(
                        QueryExpression.Compare(leftExpression, ComparisonOperator.GreaterThan, rightExpression)
                        );
                    break;

                case ExpressionType.GreaterThanOrEqual:
                    SetConversionResult(
                        QueryExpression.Compare(leftExpression, ComparisonOperator.GreaterThanOrEqualTo, rightExpression)
                        );
                    break;

                case ExpressionType.LessThan:
                    SetConversionResult(
                        QueryExpression.Compare(leftExpression, ComparisonOperator.LessThan, rightExpression)
                        );
                    break;

                case ExpressionType.LessThanOrEqual:
                    SetConversionResult(
                        QueryExpression.Compare(leftExpression, ComparisonOperator.LessThanOrEqualTo, rightExpression)
                        );
                    break;


                default:
                    throw new Exception($"Unsupported binary node type '{node.NodeType}'.");
                }

                return(node);
            }