Example #1
0
        static string AddUnaryCondition(ISqlSyntax sqlFragmentBuilder, string input, UnarySqlOperator condition, bool hasOneItemOnly)
        {
            switch (condition)
            {
            case UnarySqlOperator.AverageFunction:
                return(Func(sqlFragmentBuilder.AverageFunctionName));

            case UnarySqlOperator.CountFunction:
                return(Func(sqlFragmentBuilder.CountFunctionName));

            case UnarySqlOperator.MaxFunction:
                return(Func(sqlFragmentBuilder.MaxFunctionName));

            case UnarySqlOperator.MinFunction:
                return(Func(sqlFragmentBuilder.MinFunctionName));

            case UnarySqlOperator.SumFunction:
                return(Func(sqlFragmentBuilder.SumFunctionName));

            default:
                throw new InvalidOperationException($"Cannot build sql expression for expression type {condition}.");
            }

            string Func(string functionName) => $"{functionName}({input})";
        }
        public override string BuildFromString(BuildMapState state, ISqlSyntax sqlFragmentBuilder, string wrappedQueryAlias = null)
        {
            var tableIsFirstParamPart = wrappedQueryAlias == null;

            var table1 = (First.Param ?? "").StartsWith("@") ? null : wrappedQueryAlias;

            return(Next.Aggregate(
                       BuildColumn(table1, First),
                       Aggregate));

            string Aggregate(string x, (StringBasedElement param, BinarySqlOperator type) y)
            {
                var table  = (y.param.Param ?? "").StartsWith("@") ? null : wrappedQueryAlias;
                var yValue = BuildColumn(table, y.param);

                return(ISqlExpressionUtils.Combine(sqlFragmentBuilder, x, yValue, y.type));
            }

            string BuildColumn(string tab, StringBasedElement el)
            {
                var column = el.AddRoot(state).param;

                if (tableIsFirstParamPart)
                {
                    var p = column.Split('.');
                    if (p.Length > 1)
                    {
                        tab    = p.Take(p.Length - 1).JoinString(".");
                        column = p[p.Length - 1];
                    }
                }

                return(sqlFragmentBuilder.BuildSelectColumn(tab, column));
            }
        }
Example #3
0
        /// <summary>
        /// Build the string for a SELECT column
        /// </summary>
        public static string BuildSelectColumn(this ISqlSyntax builder, string tableName, string columnName)
        {
            columnName = (columnName ?? "").StartsWith("@") ? columnName : builder.WrapColumn(columnName);

            return(tableName == null ?
                   $"{columnName}" :
                   $"{builder.WrapTable(tableName)}.{columnName}");
        }
Example #4
0
        public string BuildFromString(BuildMapState state, ISqlSyntax sqlFragmentBuilder, string wrappedQueryAlias = null)
        {
            var first = First.BuildFromString(state, sqlFragmentBuilder, wrappedQueryAlias);

            return(AddUnaryCondition(
                       sqlFragmentBuilder,
                       first,
                       Operator,
                       First.HasOneItemOnly));
        }
Example #5
0
        /// <summary>
        /// Add an alias to a SELECT column
        /// </summary>
        public static string AddAliasColumn(this ISqlSyntax builder, string sqlCode, string alias)
        {
            if (string.IsNullOrEmpty(alias) ||
                alias.StartsWith($"{SqlStatementConstants.RootObjectAlias}."))
            {
                return(sqlCode);
            }

            return(builder.BuildAlias(sqlCode, builder.WrapAlias(alias)));
        }
Example #6
0
 public Dependencies(
     ISqlSyntax sqlSyntax,
     DataTypes dataTypes,
     Action <Settings> cleanupOldDatabase,
     Func <Settings, IConnection> createConnection)
 {
     DataTypes          = dataTypes;
     CleanupOldDatabase = cleanupOldDatabase;
     CreateConnection   = createConnection;
     SqlSyntax          = sqlSyntax;
 }
Example #7
0
        /// <summary>
        /// Concat 2 query parts in a defined way (e.g. l + r)
        /// </summary>
        public static string Concat(this ISqlSyntax builder, string l, string r, BinarySqlOperator concatType)
        {
            switch (concatType)
            {
            case BinarySqlOperator.And:
                return(builder.BuildAndCondition(l, r));

            case BinarySqlOperator.Or:
                return(builder.BuildOrCondition(l, r));

            case BinarySqlOperator.Add:
                return(builder.BuildAddCondition(l, r));

            case BinarySqlOperator.Subtract:
                return(builder.BuildSubtractCondition(l, r));

            case BinarySqlOperator.Multiply:
                return(builder.BuildMultiplyCondition(l, r));

            case BinarySqlOperator.Divide:
                return(builder.BuildDivideCondition(l, r));

            case BinarySqlOperator.In:
                return(builder.BuildInCondition(l, r));

            case BinarySqlOperator.Comma:
                return(builder.BuildCommaCondition(l, r));

            case BinarySqlOperator.Equal:
                return(builder.BuildEqualityCondition(l, r));

            case BinarySqlOperator.NotEqual:
                return(builder.BuildNonEqualityCondition(l, r));

            case BinarySqlOperator.GreaterThan:
                return(builder.BuildGreaterThanCondition(l, r));

            case BinarySqlOperator.GreaterThanOrEqual:
                return(builder.BuildGreaterThanEqualToCondition(l, r));

            case BinarySqlOperator.LessThan:
                return(builder.BuildLessThanCondition(l, r));

            case BinarySqlOperator.LessThanOrEqual:
                return(builder.BuildLessThanEqualToCondition(l, r));

            default:
                throw new NotSupportedException($"Cannot combine query parts using concatType: {concatType}.");
            }
        }
Example #8
0
 public CompiledQuery(
     QueryParts sql,
     object[] parameters,
     string[] selectColumns,
     RootObjectPropertyGraph propertyGraph,
     ISqlSyntax sqlFragmentBuilder,
     bool requiresSimpleValueUnwrap)
 {
     SqlParts                  = sql;
     Parameters                = RewriteParameters(sql.Assemble().sql, parameters);
     SelectColumns             = selectColumns;
     PropertyGraph             = propertyGraph;
     SqlFragmentBuilder        = sqlFragmentBuilder;
     RequiresSimpleValueUnwrap = requiresSimpleValueUnwrap;
 }
Example #9
0
        public MappedSqlStatementBuilder(
            BuildMapState state,
            IEnumerable <QueryElementBasedMappedProperty> selectProperties,
            ISqlSelectStatement statement,
            ISqlString innerSqlString,
            ISqlSyntax sqlSyntax)
        {
            State            = state ?? throw new ArgumentNullException(nameof(state));
            SelectProperties = selectProperties?.ToDictionary(x => x.To) ?? throw new ArgumentNullException(nameof(selectProperties));
            Statement        = statement ?? throw new ArgumentNullException(nameof(statement));
            InnerSqlString   = innerSqlString ?? throw new ArgumentNullException(nameof(innerSqlString));
            SqlSyntax        = sqlSyntax ?? throw new ArgumentNullException(nameof(innerSqlString));

            // this paradigm can be extended if there are more than 1
            // alias needed per query
            InnerQueryAlias = SqlStatementConstants.InnerQueryAlias;
        }
Example #10
0
        /// <summary>
        /// Compile a sqlBuilder into a query which can be executed multiple times
        /// </summary>
        /// <param name="sqlBuilder">The builder with all properties populated</param>
        /// <param name="parameters">Any constant parameters in the statement</param>
        /// <param name="queryParseType">Define the way results are to be parsed</param>
        public static CompiledQuery <TArgs, TResult> Compile <TArgs, TResult> (
            this ISqlString sqlBuilder,
            ISqlSelectStatement statement,
            IEnumerable <object> parameters,
            ISqlSyntax sqlSyntax,
            QueryParseType queryParseType,
            bool requiresSimpleValueUnwrap)
        {
            var sql = ToSql(sqlBuilder);

            var selectColumns = statement.SelectColumns.Select(Alias).ToArray();
            var resultType    = requiresSimpleValueUnwrap
                ? ReflectionUtils.CreatePropMapValue(typeof(TResult))
                : typeof(TResult);
            var propertyGraph = statement.BuildObjetPropertyGraph(resultType, queryParseType);

            return(new CompiledQuery <TArgs, TResult>(sql, parameters.ToArray(), selectColumns, propertyGraph, sqlSyntax, requiresSimpleValueUnwrap));
        }
        public override string BuildFromString(BuildMapState state, ISqlSyntax sqlFragmentBuilder, string wrappedQueryAlias = null)
        {
            return(Next.Aggregate(
                       BuildColumn(First),
                       Aggregate));

            string Aggregate(string x, (SelectColumnBasedElement param, BinarySqlOperator type) y)
            {
                var yValue = BuildColumn(y.param);

                return(ISqlExpressionUtils.Combine(sqlFragmentBuilder, x, yValue, y.type));
            }

            string BuildColumn(SelectColumnBasedElement el)
            {
                return(sqlFragmentBuilder.BuildSelectColumn(
                           el.IsParameter ? null : wrappedQueryAlias,
                           el.IsParameter ? el.ParameterName : el.Column.Alias));
            }
        }
Example #12
0
        /// <summary>
        /// Compile the query into something which can be executed multiple times
        /// </summary>
        public static ICompiledQuery <TArgs, TMapped> Compile <TArgs, TResult, TMapped>(
            ISqlSyntax sqlSyntax,
            SqlExecutor <TArgs, TResult> query,
            LambdaExpression mapper,
            bool requiresPropertyUnwrap,
            ILogger logger)
        {
            var(wrappedBuilder, parameters) = query.ToSqlStatement();
            var wrappedStatement = new SqlStatement(wrappedBuilder);

            var argsParam = mapper.Parameters.Count > 1 ? mapper.Parameters[1] : null;
            var state     = new BuildMapState(query.PrimaryTableMember.memberName, parameters, mapper.Parameters[0], argsParam, wrappedStatement, query.SqlSyntax, true, MappingPurpose.Mapping);

            var(properties, tables) = MapBuilder.BuildMapFromRoot(state, mapper.Body);

            properties = properties.Enumerate();
            var statement = new MappedSelectStatement(properties, tables, wrappedStatement.Tables.First().PrimaryKey);
            var builder   = new MappedSqlStatementBuilder(state, properties, statement, wrappedBuilder, sqlSyntax);

            return(builder.Compile <TArgs, TMapped>(statement, parameters.Parameters, sqlSyntax, QueryParseType.ORM, requiresPropertyUnwrap));
        }
Example #13
0
 public Query(ISqlSyntax sqlSyntax)
     : base(sqlSyntax)
 {
 }
Example #14
0
 public ResultMapper(ISqlSyntax sqlSyntax)
     : base(sqlSyntax)
 {
 }
Example #15
0
 /// <param name="strictJoins">If set to true, every join added to the SqlDsl query will also be added to the Sql query.
 /// If false, joins which are not used in a mapping, WHERE clause, ON clause etc... will be automatically removed</param>
 public SqlSelect(ISqlSyntax syntax, bool strictJoins)
     : base(syntax, strictJoins)
 {
 }
Example #16
0
 public static string EqualTo(ISqlSyntax first, ISqlSyntax second) => Paren(first, S.EqualTo, second);
Example #17
0
 public static string LessThanEqualTo(ISqlSyntax first, ISqlSyntax second) => Paren(first, S.LessThanEqualTo, second);
Example #18
0
 public static string GreaterThanEqualTo(ISqlSyntax first, ISqlSyntax second) => Paren(first, S.GreaterThanEqualTo, second);
Example #19
0
 private static string Paren(ISqlSyntax first, string oper, ISqlSyntax second) => $"({first.ToSql()} {oper} {second.ToSql()})";