Esempio n. 1
0
        internal Column[] ProcessValueArrayInliner(BuildContext buildContext, BuildArgs buildArgs, Column[] values)
        {
            if (values.Length == 1 && values[0].Original is System.String)
            {
                var      name     = (System.String)values[0].Original;
                Variable variable = buildContext.ParamRoot.TryGetVariable(name, out chainException);

                if (variable.IsInliner())
                {
                    // inliner type check
                    if (variable.DT != DT.InColumn)
                    {
                        buildContext.TryTakeException(variable.DT.InvalidInlinerException(GetType().Name,
                                                                                          variable.Name, new[] { DT.InColumn }));
                        return(null);
                    }

                    string arg2 = variable.Name;

                    if (buildArgs.Executable != null)
                    {
                        ParameterArgument inlinerArgument = buildArgs.Executable.GetInlinerArgument(variable.Name);

                        if (inlinerArgument.Value != null)
                        {
                            if (inlinerArgument.Value is System.String[])
                            {
                                var args = new List <Column>();
                                foreach (var column in (System.String[])inlinerArgument.Value)
                                {
                                    args.Add(column);
                                }
                                return(args.ToArray());
                            }
                            else if (inlinerArgument.Value is Column[])
                            {
                                return((Column[])inlinerArgument.Value);
                            }
                        }
                        else
                        {
                            buildContext.TryTakeException(new QueryTalkException(this,
                                                                                 QueryTalkExceptionType.InlinerArgumentNull,
                                                                                 String.Format("{0} = null", arg2)));
                            return(null);
                        }
                    }
                }
            }

            return(null);
        }
Esempio n. 2
0
        internal ColumnAsChainer(string column, string alias)
            : base(alias)
        {
            _columnName = alias;

            if (!CheckNull(Arg(() => column, column)))
            {
                return;
            }

            if (chainException != null)
            {
                return;
            }

            Build = (buildContext, buildArgs) =>
            {
                QueryTalkException exception;
                Variable           variable   = buildContext.TryGetVariable(column, out exception);
                string             inlinerSql = null;
                string             columnSql  = null;

                if (variable.IsInliner())
                {
                    inlinerSql = variable.Name;
                    if (variable.DT != DT.InColumn)
                    {
                        buildContext.TryTakeException(variable.DT.InvalidInlinerException(GetType().Name, inlinerSql, _inliners));
                        return(null);
                    }

                    if (buildArgs.Executable != null)
                    {
                        ParameterArgument argument = buildArgs.Executable.GetInlinerArgument(inlinerSql);
                        if (argument.Value != null)
                        {
                            if (argument.Value is System.String)
                            {
                                inlinerSql = Filter.DelimitColumnMultiPart((string)argument.Value, out chainException);
                            }
                            else
                            {
                                inlinerSql = ((Column)argument.Value).Build(buildContext, buildArgs);
                            }
                        }
                        else
                        {
                            buildContext.TryTakeException(new QueryTalkException(this,
                                                                                 QueryTalkExceptionType.InlinerArgumentNull,
                                                                                 String.Format("{0} = null", inlinerSql)));
                            return(null);
                        }
                    }
                }
                else
                {
                    columnSql = Variable.ProcessVariable(column, buildContext, buildArgs, out chainException);
                    TryThrow();

                    if (columnSql == null)
                    {
                        if (buildContext.IsCurrentStringAsValue)
                        {
                            columnSql = buildContext.BuildString(column);
                        }
                        else
                        {
                            columnSql = Filter.DelimitMultiPartOrParam(column, IdentifierType.ColumnOrParam, out chainException);
                        }
                    }
                }

                var sql = Text.GenerateSql(100)
                          .Append(inlinerSql ?? columnSql).S()
                          .Append(Text.As).S()
                          .Append(Filter.Delimit(Name))
                          .ToString();

                buildContext.TryTakeException(chainException);

                return(sql);
            };
        }
Esempio n. 3
0
        internal CollateChainer(System.String identifier, string collation)
            : base(null)
        {
            CheckNullAndThrow(Arg(() => identifier, identifier));
            CheckNullAndThrow(Arg(() => collation, collation));

            Build = (buildContext, buildArgs) =>
            {
                string   sql;
                Variable variable = buildContext.TryGetVariable(identifier, out chainException);
                if (variable.IsInliner())
                {
                    if (!_inliners.Contains(variable.DT))
                    {
                        buildContext.TryTakeException(variable.DT.InvalidInlinerException(GetType().Name,
                                                                                          variable.Name, _inliners));
                        return(null);
                    }

                    var arg2 = variable.Name;
                    if (buildArgs.Executable != null)
                    {
                        ParameterArgument inlinerArgument = buildArgs.Executable.GetInlinerArgument(variable.Name);
                        if (inlinerArgument.Value != null)
                        {
                            if (inlinerArgument.Value is System.String)
                            {
                                _columnName = (System.String)inlinerArgument.Value;
                                return(Filter.DelimitColumnMultiPart((string)inlinerArgument.Value, out chainException));
                            }
                            else
                            {
                                _columnName = ((Column)inlinerArgument.Value).ColumnName;
                                return(((Column)inlinerArgument.Value).Build(buildContext, buildArgs));
                            }
                        }
                        else
                        {
                            buildContext.TryTakeException(new QueryTalkException(this,
                                                                                 QueryTalkExceptionType.InlinerArgumentNull,
                                                                                 String.Format("{0} = null", arg2)));
                            return(null);
                        }
                    }

                    return(arg2);
                }
                else
                {
                    Column argument = new Column(identifier);
                    if (argument.ProcessVariable(buildContext, buildArgs, out sql, variable))
                    {
                        return(sql);
                    }
                }

                // not a variable:

                _columnName = identifier;

                sql = Text.GenerateSql(100)
                      .Append(Filter.DelimitMultiPartOrParam(identifier, IdentifierType.ColumnOrParam, out chainException)).S()
                      .Append(Text.Collate).S()
                      .Append(collation)
                      .ToString();
                buildContext.TryTakeException(chainException);
                return(sql);
            };
        }