internal void AddOutputColumn(QueryColumnBase column)
        {
            int index = _outputColumnIndex.Count;

            _outputColumns.Add(column.OutputColumnName, column);
            _outputColumnIndex.Add(index, column.OutputColumnName);
        }
        private QueryColumnBase AddResolveOutputColumn(QueryColumnBase resolved_column)
        {
            int index = resolved_OutputColumnIndexes.Count;

            resolved_OutputColumns.Add(resolved_column.OutputColumnName, resolved_column);
            resolved_OutputColumnIndexes.Add(index, resolved_column.OutputColumnName);
            return(resolved_column);
        }
        internal QueryColumnBase AddOutputColumn(QueryColumnBase outputColumn)
        {
            if (!IsOutputColumnResolved(outputColumn.OutputColumnName, out QueryColumnBase col))
            {
                QueryColumnSourceBase source = ContainsSourceId(outputColumn.SourceId);
                if (source != null)
                {
                    col = AddResolveOutputColumn(new QueryColumnE(source, outputColumn.OutputColumnName, outputColumn.SourceColumnName, outputColumn.ColumnDbType, outputColumn.AllowNull));
                }
                else
                {
                    if (outputColumn.Source is QuerySourceOnNull)
                    {
                        return(AddResolveOutputColumn(outputColumn));
                    }
                    else if (outputColumn.Source is QuerySourceOnConstant)
                    {
                        return(AddResolveOutputColumn(outputColumn));
                    }
                    else if (outputColumn.Source is QuerySourceOnVariable)
                    {
                        return(AddResolveOutputColumn(outputColumn));
                    }
                    else
                    {
                        // APPLY ( SELECT ... => the source is not in this query specification!!
                        //throw new NotSupportedException("Output column not registered.");
                        return(AddResolveOutputColumn(outputColumn));
                    }
                }
            }


            if (!col.ColumnDbType.HasValue)
            {
                if (outputColumn.ColumnDbType.HasValue)
                {
                    col.SetColumnDbType(outputColumn.ColumnDbType.Value); // mismatched output queries?!?!
                }
                else
                {
                    // Output column type not resolved!
                }
            }

            if (!outputColumn.ColumnDbType.HasValue)
            {
                //                throw new ArgumentException("Output column type not resolved.", nameof(outputColumn));
            }

            return(outputColumn);
        }
        internal void SetAsOutputResolved()
        {
            if (IsQueryOutputResolved)
            {
                throw new NotImplementedException("query already resolved.");
            }

            if (QrySpec.SelectElements.Count != resolved_OutputColumns.Count)
            {
                throw new NotImplementedException("Not all selected output column has been resolved. Selected:" + QrySpec.SelectElements.Count + ", Resolved:" + resolved_OutputColumns.Count);
            }

            QueryColumnBase resolvedOutputColumnWithoutType = HasResolvedOutputColumnWithoutType();

            if (resolvedOutputColumnWithoutType != null)
            {
                throw new NotImplementedException("A selected output column without type. Name:" + resolvedOutputColumnWithoutType.OutputColumnName);
            }

            MarkAsOutputResolved();
        }
 protected abstract bool IQueryModel_TryGetQueryOutputColumnByName(BatchOutputColumnTypeResolver batchResolver, string outputColumnName, out QueryColumnBase outputColumn);
 protected override bool IQueryModel_TryGetQuerySingleOutputColumn(BatchOutputColumnTypeResolver batchResolver, out QueryColumnBase outputColumn)
 {
     outputColumn = _outputColumns.Values.Single();
     return(true);
 }
 protected override bool IQueryModel_TryGetQueryOutputColumnByName(BatchOutputColumnTypeResolver batchResolver, string outputColumnName, out QueryColumnBase outputColumn)
 {
     if (_outputColumns.TryGetValue(outputColumnName, out outputColumn))
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
        protected override bool IQueryModel_TryGetQueryOutputColumnAt(BatchOutputColumnTypeResolver batchResolver, int outputColumnIndex, out QueryColumnBase outputColumn)
        {
            string outputColumnName = _outputColumnIndex[outputColumnIndex];

            return(IQueryModel_TryGetQueryOutputColumnByName(batchResolver, outputColumnName, out outputColumn));
        }
 private static OutputColumnDescriptor ColumnModelToDescriptor(QueryColumnBase column)
 {
     return((column.ColumnDbType.HasValue)
         ? new OutputColumnDescriptor(column.OutputColumnName, new ColumnTypeMetadata(column.ColumnDbType.Value, column.AllowNull.GetValueOrDefault(true)))
         : new OutputColumnDescriptor(column.OutputColumnName));
 }
 protected abstract bool IQueryModel_TryGetQuerySingleOutputColumn(BatchOutputColumnTypeResolver batchResolver, out QueryColumnBase outputColumn);
 protected override bool IQueryModel_TryGetQueryOutputColumnAt(BatchOutputColumnTypeResolver batchResolver, int outputColumnIndex, out QueryColumnBase outputColumn)
 {
     throw new NotImplementedException("outputColumnIndex:" + outputColumnIndex);
 }
 bool IQueryModel.TryGetQueryOutputColumnByName(BatchOutputColumnTypeResolver batchResolver, string outputColumnName, out QueryColumnBase outputColumn)
 {
     return(IQueryModel_TryGetQueryOutputColumnByName(batchResolver, outputColumnName, out outputColumn));
 }
 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 abstract bool IQueryModel_TryGetQueryOutputColumnAt(BatchOutputColumnTypeResolver batchResolver, int outputColumnIndex, out QueryColumnBase outputColumn);
        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?!?!
        }
 bool IQueryModel.TryGetQuerySingleOutputColumn(BatchOutputColumnTypeResolver batchResolver, out QueryColumnBase outputColumn)
 {
     return(IQueryModel_TryGetQuerySingleOutputColumn(batchResolver, out outputColumn));
 }
 bool IQueryModel.TryGetQueryOutputColumnAt(BatchOutputColumnTypeResolver batchResolver, int outputColumnIndex, out QueryColumnBase outputColumn)
 {
     return(IQueryModel_TryGetQueryOutputColumnAt(batchResolver, outputColumnIndex, out outputColumn));
 }
 internal bool IsOutputColumnResolved(string outputColumnName, out QueryColumnBase col)
 {
     return(resolved_OutputColumns.TryGetValue(outputColumnName, out col));
 }
        private bool TryColumnReference(IQueryModel model, ColumnReferenceExpression node, out QueryColumnBase col)
        {
            if (node.ColumnType != ColumnType.Regular)
            {
                throw new NotImplementedException(node.AsText());
            }

            if (node.MultiPartIdentifier.Count == 2)
            {
                // source (table/view) name without schema or alias
                string sourceNameOrAlias = node.MultiPartIdentifier[0].Dequote();
                string columnName        = node.MultiPartIdentifier[1].Dequote();

                if (model.TryGetQueryOutputColumnByName(this.batchResolver, columnName, out col))
                {
                    return(true);
                }
                else
                {
                    throw new NotImplementedException(node.WhatIsThis()); // not resolved?
                }
            }
            else if (node.MultiPartIdentifier.Count == 1)
            {
                // no source only column name => traverse all source and find t
                string columnName = node.MultiPartIdentifier[0].Dequote();
                if (model.TryGetQueryOutputColumnByName(this.batchResolver, columnName, out col))
                {
                    return(true);
                }
                else
                {
                    throw new NotImplementedException(node.WhatIsThis()); // not resolved?
                }
            }
            else
            {
                // 3 or 4
                throw new NotImplementedException(node.AsText() + "   ## " + statement.WhatIsThis());
            }
        }