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); }
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); }
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); } }
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; }