Пример #1
0
        internal override bool TryResolveSourceColumnType(BatchOutputColumnTypeResolver batchResolver, string sourceColumnName, out SourceColumnType columnDbType)
        {
            if (string.IsNullOrEmpty(sourceColumnName))
            {
                throw new ArgumentNullException(nameof(sourceColumnName));
            }

            if (resolved_table == null)
            {
                resolved_table = batchResolver.SchemaMetadata.TryGetColumnSourceMetadata(SchemaName, TableName);
                if (resolved_table == null)
                {
                    // table not exists???
                    throw new NotImplementedException(Key + "." + sourceColumnName);
                }
            }

            ColumnTypeMetadata sourceColumnType = resolved_table.TryGetColumnTypeByName(sourceColumnName);

            if (sourceColumnType != null)
            {
                columnDbType = new SourceColumnType(this, sourceColumnName, sourceColumnType.ColumnDbType, sourceColumnType.AllowNull);
                return(true);
            }
            else
            {
                //throw new NotImplementedException(Key + "." + sourceColumnName + "   Table: [" + SchemaName + "].[" + TableName + "]");
                columnDbType = null;// DbType.Object; // column 'personid' without alias => source traversion
                return(false);
            }
        }
Пример #2
0
 public SelectElementVisitor(bool resolveColumnType, BatchOutputColumnTypeResolver columnTypeResolver, StatementWithCtesAndXmlNamespaces statement) : base(false)
 {
     this.resolveColumnType  = resolveColumnType;
     this.columnTypeResolver = new StatementOutputColumnTypeResolverV2(columnTypeResolver, statement);
     this.outputSet          = new ProcedureOutputSet(statement);
     this.statement          = statement;
 }
Пример #3
0
        public static void LoadViewOutputColumns(ISchemaMetadataProvider schemaMetadata, string ddl, Action <OutputColumnDescriptor> collector)
        {
            TSqlFragment sqlF = ScriptDomFacade.Parse(ddl);
            //CreateViewStatement stmt_CreateView = (CreateViewStatement)((TSqlScript)sqlF).Batches[0].Statements[0];
            SelectStatement stmt_sel = (SelectStatement)((TSqlScript)sqlF).Batches[0].Statements[0];

            BatchOutputColumnTypeResolver batchResolver = new BatchOutputColumnTypeResolver(schemaMetadata, stmt_sel, new BatchWithoutParameters());

            StatementOutputColumnTypeResolverV2 resolver = new StatementOutputColumnTypeResolverV2(batchResolver, stmt_sel);

            QuerySpecification first = TopQuerySpecification(stmt_sel.QueryExpression);

            foreach (SelectElement se in first.SelectElements)
            {
                if (se is SelectScalarExpression scalarExpr)
                {
                    OutputColumnDescriptor col = resolver.ResolveSelectScalarExpression(scalarExpr);
                    collector(col);
                }
                else
                {
                    throw new NotImplementedException(se.WhatIsThis());
                }
            }
        }
Пример #4
0
        public static void LoadFunctionOutputColumns(ISchemaMetadataProvider schemaMetadata, IBatchParameterMetadata parameterMetadata, string functionBodyScript, Action <OutputColumnDescriptor> collector)
        {
            functionBodyScript = RemoveTrailingBlockComment(functionBodyScript);
            if (functionBodyScript.Trim()[0] == '(')
            {
                int idx    = functionBodyScript.IndexOf('(');
                int lastix = functionBodyScript.LastIndexOf(')');

                functionBodyScript = functionBodyScript.Substring(idx + 1, lastix - idx - 2);
                functionBodyScript = functionBodyScript.Trim();
            }
            TSqlFragment    sqlF     = ScriptDomFacade.Parse(functionBodyScript);
            SelectStatement stmt_sel = (SelectStatement)((TSqlScript)sqlF).Batches[0].Statements[0];

            BatchOutputColumnTypeResolver       batchResolver = new BatchOutputColumnTypeResolver(schemaMetadata, sqlF, parameterMetadata);
            StatementOutputColumnTypeResolverV2 resolver      = new StatementOutputColumnTypeResolverV2(batchResolver, stmt_sel);

            QuerySpecification first = TopQuerySpecification(stmt_sel.QueryExpression);

            foreach (SelectElement se in first.SelectElements)
            {
                if (se is SelectScalarExpression scalarExpr)
                {
                    OutputColumnDescriptor col = resolver.ResolveSelectScalarExpression(scalarExpr);
                    collector(col);
                }
                else
                {
                    throw new NotImplementedException(se.WhatIsThis());
                }
            }
        }
Пример #5
0
        public static ProcedureOutputSet[] IsQueryProcedure(bool resolveColumnType, ISchemaMetadataProvider schemaMetadata, ProcedureMetadata procedure_metadata)
        {
            BatchOutputColumnTypeResolver columnTypeResolver = new BatchOutputColumnTypeResolver(schemaMetadata, procedure_metadata.BodyFragment, procedure_metadata);
            StatementVisitor vstor = new StatementVisitor(resolveColumnType, columnTypeResolver, procedure_metadata.BodyFragment);

            procedure_metadata.BodyFragment.Accept(vstor);
            return(vstor.resultHasOutputResultSet.ToArray());
        }
 protected override bool IQueryModel_TryGetQueryOutputColumnAt(BatchOutputColumnTypeResolver batchResolver, int outputColumnIndex, out QueryColumnBase outputColumn)
 {
     if (_queryOutputResolved)
     {
         string outputColumnName = resolved_OutputColumnIndexes[outputColumnIndex];
         return(IQueryModel_TryGetQueryOutputColumnByName(batchResolver, outputColumnName, out outputColumn));
     }
     throw new NotImplementedException("outputColumnIndex:" + outputColumnIndex);
 }
 protected override bool IQueryModel_TryGetQueryOutputColumnByName(BatchOutputColumnTypeResolver batchResolver, string outputColumnName, out QueryColumnBase outputColumn)
 {
     if (_outputColumns.TryGetValue(outputColumnName, out outputColumn))
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Пример #8
0
 internal override bool TryResolveSourceColumnType(BatchOutputColumnTypeResolver batchResolver, string sourceColumnName, out SourceColumnType columnType)
 {
     if (columns.TryGetValue(sourceColumnName, out ColumnTypeMetadata columnTypeX))
     {
         columnType = new SourceColumnType(this, sourceColumnName, columnTypeX.ColumnDbType, columnTypeX.AllowNull);
         return(true);
     }
     else
     {
         columnType = null;
         return(false);
     }
 }
Пример #9
0
        internal override bool TryResolveSourceColumnType(BatchOutputColumnTypeResolver batchResolver, string sourceColumnName, out SourceColumnType columnType)
        {
            for (int idx = 0; idx < _cteColumns.Count; idx++)
            {
                Identifier col = _cteColumns[idx];
                if (string.Equals(sourceColumnName, col.Dequote(), StringComparison.OrdinalIgnoreCase))
                {
                    // get the query's output column on this index
                    if (this.query.TryGetQueryOutputColumnAt(batchResolver, idx, out QueryColumnBase outputColumnX))
                    {
                        if (outputColumnX.ColumnDbType.HasValue)
                        {
                            columnType = new SourceColumnType(this, sourceColumnName, outputColumnX.ColumnDbType.Value, outputColumnX.AllowNull.GetValueOrDefault(true));
                            return(true);
                        }
                        else
                        {
                            columnType = new SourceColumnType(this, sourceColumnName);//  DbType.Object;
                            return(true);
                        }
                    }
                    else
                    {
                        columnType = null;
                        return(false);
                    }
                }
            }

            if (this.query.TryGetQueryOutputColumnByName(batchResolver, sourceColumnName, out QueryColumnBase outputColumn))
            {
                if (outputColumn.ColumnDbType.HasValue)
                {
                    columnType = new SourceColumnType(this, sourceColumnName, outputColumn.ColumnDbType.Value, outputColumn.AllowNull.GetValueOrDefault(true));
                    return(true);
                }
                else
                {
                    columnType = new SourceColumnType(this, sourceColumnName);//  DbType.Object;
                    return(true);
                }
            }
            columnType = null;// DbType.Object;
            return(false);
        }
Пример #10
0
 internal override bool TryResolveSourceColumnType(BatchOutputColumnTypeResolver batchResolver, string sourceColumnName, out SourceColumnType columnType)
 {
     if (this.query.TryGetQueryOutputColumnByName(batchResolver, sourceColumnName, out QueryColumnBase outputColumn))
     {
         if (outputColumn.ColumnDbType.HasValue)
         {
             columnType = new SourceColumnType(this, sourceColumnName, outputColumn.ColumnDbType.Value, outputColumn.AllowNull.GetValueOrDefault(true));
             return(true);
         }
         else
         {
             columnType = new SourceColumnType(this, sourceColumnName);//  DbType.Object;
             return(true);
         }
     }
     columnType = null;// DbType.Object;
     return(false);
 }
Пример #11
0
        protected override bool IQueryModel_TryGetQueryOutputColumnByName(BatchOutputColumnTypeResolver batchResolver, string outputColumnName, out QueryColumnBase outputColumn)
        {
            foreach (var sub_mqe in union_queries)
            {
                if (sub_mqe.IsOutputColumnResolved(outputColumnName, out outputColumn))
                {
                    //AddOutputColumn(outputColumn);
                    return(true);
                }

                if (_isRecirsive)
                {
                    break;
                }
            }

            throw new NotImplementedException(Key + "." + outputColumnName); // source not found?!?!
        }
Пример #12
0
        internal override bool TryResolveSourceColumnType(BatchOutputColumnTypeResolver batchResolver, string sourceColumnName, out SourceColumnType columnType)
        {
            // KEY: int
            // RANK: int

            if (string.Equals("KEY", sourceColumnName, StringComparison.OrdinalIgnoreCase))
            {
                columnType = new SourceColumnType(this, sourceColumnName, DbType.Int32, true);
                return(true);
            }

            if (string.Equals("RANK", sourceColumnName, StringComparison.OrdinalIgnoreCase))
            {
                columnType = new SourceColumnType(this, sourceColumnName, DbType.Int32, true);
                return(true);
            }

            columnType = null;
            return(false);
        }
Пример #13
0
        //private QueryColumnBase override_TryResolveSelectedColumn(BatchOutputColumnTypeResolver batchResolver, string outputColumnName, string sourceColumnName)
        //{
        //    if (resolved_source_metadata == null)
        //    {
        //        resolved_source_metadata = batchResolver.TryGetTableVariable(VarTableRef.Variable.Name);
        //        if (resolved_source_metadata == null)
        //        {
        //            throw new NotImplementedException(VarTableRef.WhatIsThis());
        //        }
        //    }

        //    return base.AddResolveOutputdColumn(new QueryColumnE(this, outputColumnName, sourceColumnName, columnDbType.Value));

        //}

        internal override bool TryResolveSourceColumnType(BatchOutputColumnTypeResolver batchResolver, string sourceColumnName, out SourceColumnType columnType)
        {
            if (resolved_source_metadata == null)
            {
                resolved_source_metadata = batchResolver.TryGetTableVariable(VarTableRef.Variable.Name);
                if (resolved_source_metadata == null)
                {
                    throw new NotImplementedException(VarTableRef.WhatIsThis());
                }
            }

            ColumnTypeMetadata columnDbType = resolved_source_metadata.TryGetColumnTypeByName(sourceColumnName);

            if (columnDbType != null)
            {
                columnType = new SourceColumnType(this, sourceColumnName, columnDbType.ColumnDbType, columnDbType.AllowNull);
                return(true);
            }

            columnType = null;// DbType.Object;
            return(false);
        }
Пример #14
0
        //internal QueryColumnBase override_TryResolveSelectedColumn(BatchOutputColumnTypeResolver batchResolver, string outputColumnName, string sourceColumnName)
        //{
        //    if (resolved_source_metadata == null)
        //    {
        //        resolved_source_metadata = batchResolver.SchemaMetadata.TryGetFunctionTableMetadata(SchemaName, FunctionName);
        //        if (resolved_source_metadata == null)
        //        {
        //            throw new NotImplementedException(SchemaName + "." + FunctionName + "  => " + outputColumnName);
        //        }
        //    }

        //    DbType? columnDbType = resolved_source_metadata.TryGetColumnTypeByName(sourceColumnName);
        //    if (columnDbType == null)
        //    {
        //        return null;
        //    }

        //    string outputColumnNameSafe = outputColumnName ?? sourceColumnName;

        //    return base.AddResolveOutputdColumn(new QueryColumnE(this, outputColumnNameSafe, sourceColumnName, columnDbType.Value));
        //}

        internal override bool TryResolveSourceColumnType(BatchOutputColumnTypeResolver batchResolver, string sourceColumnName, out SourceColumnType columnType)
        {
            if (resolved_source_metadata == null)
            {
                resolved_source_metadata = batchResolver.SchemaMetadata.TryGetFunctionTableMetadata(SchemaName, FunctionName);
                if (resolved_source_metadata == null)
                {
                    throw new NotImplementedException(SchemaName + "." + FunctionName + "  : " + sourceColumnName);
                }
            }


            ColumnTypeMetadata columnDbType = resolved_source_metadata.TryGetColumnTypeByName(sourceColumnName);

            if (columnDbType != null)
            {
                columnType = new SourceColumnType(this, sourceColumnName, columnDbType.ColumnDbType, columnDbType.AllowNull);
                return(true);
            }

            columnType = null; // DbType.Object;
            return(false);
        }
Пример #15
0
 bool IQueryModel.TryGetQueryOutputColumnByName(BatchOutputColumnTypeResolver batchResolver, string outputColumnName, out QueryColumnBase outputColumn)
 {
     return(IQueryModel_TryGetQueryOutputColumnByName(batchResolver, outputColumnName, out outputColumn));
 }
Пример #16
0
 internal StatementVisitor(bool resolveColumnType, BatchOutputColumnTypeResolver columnTypeResolver, TSqlFragment toAnalyze) : base(false)
 {
     this.resolveColumnType  = resolveColumnType;
     this.columnTypeResolver = columnTypeResolver;
     _toAnalyze = toAnalyze;
 }
Пример #17
0
 bool IQueryModel.TryGetQuerySingleOutputColumn(BatchOutputColumnTypeResolver batchResolver, out QueryColumnBase outputColumn)
 {
     return(IQueryModel_TryGetQuerySingleOutputColumn(batchResolver, out outputColumn));
 }
Пример #18
0
 protected abstract bool IQueryModel_TryGetQueryOutputColumnByName(BatchOutputColumnTypeResolver batchResolver, string outputColumnName, out QueryColumnBase outputColumn);
Пример #19
0
 protected override bool IQueryModel_TryGetQueryOutputColumnAt(BatchOutputColumnTypeResolver batchResolver, int outputColumnIndex, out QueryColumnBase outputColumn)
 {
     throw new NotImplementedException("outputColumnIndex:" + outputColumnIndex);
 }
Пример #20
0
 bool IQueryModel.TryGetQueryOutputColumnAt(BatchOutputColumnTypeResolver batchResolver, int outputColumnIndex, out QueryColumnBase outputColumn)
 {
     return(IQueryModel_TryGetQueryOutputColumnAt(batchResolver, outputColumnIndex, out outputColumn));
 }
Пример #21
0
 internal override bool TryResolveSourceColumnType(BatchOutputColumnTypeResolver batchResolver, string sourceColumnName, out SourceColumnType columnType)
 {
     columnType = new SourceColumnType(this, sourceColumnName, constantType, allowNull);
     return(true);
 }
Пример #22
0
 internal override bool TryResolveSourceColumnType(BatchOutputColumnTypeResolver batchResolver, string sourceColumnName, out SourceColumnType columnType)
 {
     columnType = null;// DbType.Object;
     return(false);
 }
Пример #23
0
        protected override bool IQueryModel_TryGetQueryOutputColumnAt(BatchOutputColumnTypeResolver batchResolver, int outputColumnIndex, out QueryColumnBase outputColumn)
        {
            string outputColumnName = _outputColumnIndex[outputColumnIndex];

            return(IQueryModel_TryGetQueryOutputColumnByName(batchResolver, outputColumnName, out outputColumn));
        }
Пример #24
0
 internal override bool TryResolveSourceColumnType(BatchOutputColumnTypeResolver batchResolver, string sourceColumnName, out SourceColumnType columnType)
 {
     columnType = new SourceColumnType(this, sourceColumnName, variableType, true);
     return(true);
 }
Пример #25
0
 protected override bool IQueryModel_TryGetQuerySingleOutputColumn(BatchOutputColumnTypeResolver batchResolver, out QueryColumnBase outputColumn)
 {
     outputColumn = _outputColumns.Values.Single();
     return(true);
 }
Пример #26
0
 internal abstract bool TryResolveSourceColumnType(BatchOutputColumnTypeResolver batchResolver, string sourceColumnName, out SourceColumnType columnType);
Пример #27
0
 protected abstract bool IQueryModel_TryGetQueryOutputColumnAt(BatchOutputColumnTypeResolver batchResolver, int outputColumnIndex, out QueryColumnBase outputColumn);
Пример #28
0
 internal override bool TryResolveSourceColumnType(BatchOutputColumnTypeResolver batchResolver, string sourceColumnName, out SourceColumnType columnType)
 {
     return(Cte.TryResolveSourceColumnType(batchResolver, sourceColumnName, out columnType));
 }
Пример #29
0
 protected abstract bool IQueryModel_TryGetQuerySingleOutputColumn(BatchOutputColumnTypeResolver batchResolver, out QueryColumnBase outputColumn);
 public StatementOutputColumnTypeResolverV1(BatchOutputColumnTypeResolver batchResolver, StatementWithCtesAndXmlNamespaces statement)
 {
     SchemaMetadata     = batchResolver.SchemaMetadata;
     this.batchResolver = batchResolver;
     this.statement     = statement;
 }