예제 #1
0
 public StraightJoin(ITableReference leftTableRef, ITableReference rightTableRef, IExpression onCondition)
     : base()
 {
     this.LeftTableRef  = leftTableRef;
     this.RightTableRef = rightTableRef;
     this.OnCondition   = onCondition;
 }
예제 #2
0
 public NaturalJoin(bool isOuter, bool isLeft, ITableReference leftTableRef, ITableReference rightTableRef)
 {
     this.IsOuter       = isOuter;
     this.IsLeft        = isLeft;
     this.LeftTableRef  = leftTableRef;
     this.RightTableRef = rightTableRef;
 }
예제 #3
0
 public InnerJoin(ITableReference leftTableRef, ITableReference rightTableRef,
                  IExpression onCondition, IList <string> usings)
     : base()
 {
     this.LeftTableRef  = leftTableRef;
     this.RightTableRef = rightTableRef;
     this.OnCondition   = onCondition;
     this.Usings        = usings;
 }
        public ImmutableTableReference(int id, T reference)
        {
            Identifier = id;

            _reference = reference ?? throw new ArgumentNullException(nameof(reference),
                                                                      "If a null TableReference is desired, use null instead.");
            _referenceBuilder = null;
            _database         = null;
        }
예제 #5
0
 public OuterJoin(bool isLeftJoin, ITableReference leftTableRef, ITableReference rightTableRef,
                  IExpression onCondition, IList <string> usings)
 {
     this.IsLeftJoin    = isLeftJoin;
     this.LeftTableRef  = leftTableRef;
     this.RightTableRef = rightTableRef;
     this.OnCondition   = onCondition;
     this.Usings        = usings;
 }
예제 #6
0
 private ITableReference BuildTableReference(ITableReference reference)
 {
     while (true)
     {
         IExpression on;
         List<string> usage;
         ITableReference temp;
         bool isOut = false, isLeft = true;
         switch (lexer.Token())
         {
             case MySQLToken.KW_INNER:
             case MySQLToken.KW_CROSS:
                 lexer.NextToken();
                 goto case MySQLToken.KW_JOIN;
             case MySQLToken.KW_JOIN:
                 lexer.NextToken();
                 temp = TableFactor();
         }
     }
 }
예제 #7
0
 private static Type FigureOutTypeFor(string name, ITableReference tref)
 {
     return(tref.Table.GetProperties().First(p => p.Name == name).PropertyType);
 }
예제 #8
0
 public StraightJoin(ITableReference leftTableRef, ITableReference rightTableRef)
     : this(leftTableRef, rightTableRef, null)
 {
 }
예제 #9
0
        /// <summary>
        /// Resolves a table reference to a table listed in SourceTableReferences
        /// </summary>
        /// <param name="qs"></param>
        /// <param name="tr"></param>
        private void ResolveTableReference(QuerySpecification qs, ITableReference node)
        {
            // Try to resolve the table alias part of a table reference
            // If and alias or table name is specified, this can be done based on
            // the already collected table sources.
            // If no table or alias is specified and the current node is a column reference,
            // where the column is not a complex expression, resolution might be successful by
            // column name only.

            if (!node.TableReference.IsUndefined)
            {
                TableReference ntr = null;
                string alias = null;

                if (node.TableReference.Alias != null)
                {
                    // if table alias found explicitly
                    alias = node.TableReference.Alias;
                }
                else if (node.TableReference.DatasetName == null &&
                        node.TableReference.DatabaseName == null &&
                        node.TableReference.SchemaName == null &&
                        node.TableReference.DatabaseObjectName != null &&
                        qs.SourceTableReferences.ContainsKey(node.TableReference.DatabaseObjectName))
                {
                    // if only table name found and that's an alias
                    alias = node.TableReference.DatabaseObjectName;
                }

                if (alias != null)
                {
                    ntr = qs.SourceTableReferences[alias];
                }
                else
                {
                    // Check if dataset specified and make sure it's valid
                    if (node.TableReference.DatasetName != null)
                    {
                        if (!schemaManager.Datasets.ContainsKey(node.TableReference.DatasetName))
                        {
                            throw CreateException(ExceptionMessages.UnresolvableDatasetReference, null, node.TableReference.DatasetName, (Node)node);
                        }
                    }

                    // if only a table name found and that's not an alias -> must be a table
                    int q = 0;
                    foreach (var key in qs.SourceTableReferences.Keys)
                    {
                        var tr = qs.SourceTableReferences[key];

                        if (tr.Compare(node.TableReference))
                        {
                            if (q != 0)
                            {
                                throw CreateException(ExceptionMessages.AmbigousTableReference, null, node.TableReference.DatabaseObjectName, (Node)node);
                            }

                            ntr = tr;
                            q++;
                        }
                    }
                }

                if (ntr == null)
                {
                    throw CreateException(ExceptionMessages.UnresolvableTableReference, null, node.TableReference.DatabaseObjectName, (Node)node);
                }

                node.TableReference = ntr;
            }
        }
예제 #10
0
        /// <summary>
        /// Resolves a table reference to a table listed in SourceTableReferences
        /// </summary>
        /// <param name="qs"></param>
        /// <param name="tr"></param>
        private void ResolveTableReference(QuerySpecification qs, ITableReference node)
        {
            // Try to resolve the table alias part of a table reference
            // If and alias or table name is specified, this can be done based on
            // the already collected table sources.
            // If no table or alias is specified and the current node is a column reference,
            // where the column is not a complex expression, resolution might be successful by
            // column name only.

            if (!node.TableReference.IsUndefined)
            {
                TableReference ntr   = null;
                string         alias = null;

                if (node.TableReference.Alias != null)
                {
                    // if table alias found explicitly
                    alias = node.TableReference.Alias;
                }
                else if (node.TableReference.DatasetName == null &&
                         node.TableReference.DatabaseName == null &&
                         node.TableReference.SchemaName == null &&
                         node.TableReference.DatabaseObjectName != null &&
                         qs.SourceTableReferences.ContainsKey(node.TableReference.DatabaseObjectName))
                {
                    // if only table name found and that's an alias
                    alias = node.TableReference.DatabaseObjectName;
                }

                if (alias != null)
                {
                    ntr = qs.SourceTableReferences[alias];
                }
                else
                {
                    // Check if dataset specified and make sure it's valid
                    if (node.TableReference.DatasetName != null)
                    {
                        if (!schemaManager.Datasets.ContainsKey(node.TableReference.DatasetName))
                        {
                            throw CreateException(ExceptionMessages.UnresolvableDatasetReference, null, node.TableReference.DatasetName, (Node)node);
                        }
                    }

                    // if only a table name found and that's not an alias -> must be a table
                    int q = 0;
                    foreach (var tr in qs.SourceTableReferences.Values)
                    {
                        if (tr.Compare(node.TableReference))
                        {
                            if (q != 0)
                            {
                                throw CreateException(ExceptionMessages.AmbigousTableReference, null, node.TableReference.DatabaseObjectName, (Node)node);
                            }

                            ntr = tr;
                            q++;
                        }
                    }
                }

                if (ntr == null)
                {
                    throw CreateException(ExceptionMessages.UnresolvableTableReference, null, node.TableReference.DatabaseObjectName, (Node)node);
                }

                node.TableReference = ntr;
            }
        }
예제 #11
0
 public OuterJoin(bool isLeftJoin, ITableReference leftTableRef, ITableReference rightTableRef,
                  IList <string> usings)
     : this(isLeftJoin, leftTableRef, rightTableRef, null, usings)
 {
 }
예제 #12
0
 public OuterJoin(bool isLeftJoin, ITableReference leftTableRef, ITableReference rightTableRef,
                  IExpression onCondition)
     : this(isLeftJoin, leftTableRef, rightTableRef, onCondition, null)
 {
 }
예제 #13
0
 public EmployeeRepository(ITableReference<Employee> tableReference)
 {
     _tableReference = tableReference;
 }
 public ImmutableTableReference(ITableReference <T> .ReferenceBuilder builder, int id, DatabaseConnection database)
 {
     Identifier        = id;
     _referenceBuilder = builder ?? throw new ArgumentNullException(nameof(builder));
     _database         = database ?? throw new ArgumentNullException(nameof(database));
 }
예제 #15
0
 public InnerJoin(ITableReference leftTableRef, ITableReference rightTableRef, IList <string> usings)
     : this(leftTableRef, rightTableRef, null, usings)
 {
 }
예제 #16
0
 public InnerJoin(ITableReference leftTableRef, ITableReference rightTableRef, IExpression onCondition)
     : this(leftTableRef, rightTableRef, onCondition, null)
 {
 }
예제 #17
0
 public InnerJoin(ITableReference leftTableRef, ITableReference rightTableRef)
     : this(leftTableRef, rightTableRef, null, null)
 {
 }
예제 #18
0
 public PunchRepository(ITableReference<Punch> tableReference)
 {
     _tableReference = tableReference;
 }
예제 #19
0
 public static ValueNode Col(ITableReference r, string colDef)
 {
     return(ValueNode.NewColumn(new Tuple <string, Type, ITableReference>(colDef, FigureOutTypeFor(colDef, r), r)));
 }