Esempio n. 1
0
        List <FoundEquality> SearchForFields(SelectQuery.TableSource manySource, SelectQuery.JoinedTable join)
        {
            var key = Tuple.Create(manySource, join.Table);
            List <FoundEquality> found = null;

            if (_fieldPairCache != null && _fieldPairCache.TryGetValue(key, out found))
            {
                return(found);
            }

            for (var i1 = 0; i1 < join.Condition.Conditions.Count; i1++)
            {
                var c = join.Condition.Conditions[i1];

                if (c.IsOr)
                {
                    found = null;
                    break;
                }

                if (c.ElementType != QueryElementType.Condition ||
                    c.Predicate.ElementType != QueryElementType.ExprExprPredicate ||
                    ((SelectQuery.Predicate.ExprExpr)c.Predicate).Operator != SelectQuery.Predicate.Operator.Equal)
                {
                    continue;
                }

                var predicate = (SelectQuery.Predicate.ExprExpr)c.Predicate;
                var equality  = new FoundEquality();

                if (!MatchFields(manySource, join.Table,
                                 GetUnderlayingField(predicate.Expr1),
                                 GetUnderlayingField(predicate.Expr2),
                                 equality))
                {
                    continue;
                }

                equality.OneCondition = c;

                if (found == null)
                {
                    found = new List <FoundEquality>();
                }

                found.Add(equality);
            }

            if (_fieldPairCache == null)
            {
                _fieldPairCache = new Dictionary <Tuple <SelectQuery.TableSource, SelectQuery.TableSource>, List <FoundEquality> >();
            }

            _fieldPairCache.Add(key, found);

            return(found);
        }
Esempio n. 2
0
        bool MatchFields(SelectQuery.TableSource manySource, SelectQuery.TableSource oneSource, VirtualField field1, VirtualField field2, FoundEquality equality)
        {
            if (field1 == null || field2 == null)
            {
                return(false);
            }

            DetectField(manySource, oneSource, field1, equality);
            DetectField(manySource, oneSource, field2, equality);

            return(equality.OneField != null && equality.ManyField != null);
        }
Esempio n. 3
0
        void DetectField(SelectQuery.TableSource manySource, SelectQuery.TableSource oneSource, VirtualField field, FoundEquality equality)
        {
            field = GetNewField(field);

            if (oneSource.Source.SourceID == field.SourceID)
            {
                equality.OneField = field;
            }
            else if (manySource.Source.SourceID == field.SourceID)
            {
                equality.ManyField = field;
            }
            else
            {
                equality.ManyField = MapToSource(manySource, field, manySource.Source.SourceID);
            }
        }
Esempio n. 4
0
        void DetectField(SqlTableSource?manySource, SqlTableSource oneSource, VirtualField field, FoundEquality equality)
        {
            field = GetNewField(field);

            if (oneSource.Source.SourceID == field.SourceID)
            {
                equality.OneField = field;
            }
            else if (oneSource.Source is SelectQuery select && select.Select.From.Tables.Count == 1 && select.Select.From.Tables[0].SourceID == field.SourceID)
            {
                equality.OneField = field;
            }