示例#1
0
        private string GetInitialDerivedTableJoin(JoinDescription joinDescription)
        {
            var derivedTableAlias = DerivedTableWrapperNameResolver.GetWrapperName(GetLeftTableAlias(joinDescription));
            var joinPrefix        = GetJoinPrefix(joinDescription);
            var secondaryJoins    = Joins
                                    .Where(a => a.Id != joinDescription.Id)
                                    .Where(a =>
            {
                var sameOuterTable   = a.LeftTable.Equals(joinDescription.RightTable, StringComparison.InvariantCultureIgnoreCase);
                var hasDerivedTable  = !string.IsNullOrEmpty(a.ExplicitRightTableAlias);
                var sameDerivedTable = hasDerivedTable && a.ExplicitRightTableAlias.Equals(derivedTableAlias, StringComparison.InvariantCultureIgnoreCase);
                return(sameOuterTable && sameDerivedTable);
            }).ToList();

            var rightTableAlias = QBuilder.TableNameAliaser.GetTableAlias(joinDescription.RightTable);
            var line            = $"{joinPrefix} join ({joinDescription.DerivedTable}) as {derivedTableAlias} on {derivedTableAlias}.{joinDescription.LeftField} = {rightTableAlias}.{joinDescription.RightField}";

            line += Environment.NewLine;
            foreach (var secJoin in secondaryJoins)
            {
                secJoin.Consumed = true;
                line            += $" and {rightTableAlias}.{secJoin.LeftField} = {secJoin.ExplicitRightTableAlias}.{secJoin.RightField}";
            }

            return(line);
        }
        private RelationshipClass MakeJoin(RelationshipClass relationshipClass, Table leftTable, Table rightTable)
        {
            var virtualRelationshipClassDescription = new VirtualRelationshipClassDescription(_leftField, _rightField,
                                                                                              SelectedCardinality.RelationshipCardinality);

            relationshipClass = leftTable.RelateTo(rightTable, virtualRelationshipClassDescription);
            var joinDescription = new JoinDescription(relationshipClass)
            {
                JoinDirection = JoinDirection.Forward
            };

            joinDescription.JoinType = IsLeftOuterJoin ? JoinType.LeftOuterJoin : JoinType.InnerJoin;
            if (LeftFields.Count > 1)
            {
                joinDescription.TargetFields = LeftFields.Select(item => item.Field).ToList();
            }
            var join        = new Join(joinDescription);
            var joinedTable = @join.GetJoinedTable();

            if (joinedTable is FeatureClass)
            {
                LayerFactory.Instance.CreateFeatureLayer(joinedTable as FeatureClass, MapView.Active.Map, 0, LayerName);
            }
            return(relationshipClass);
        }
示例#3
0
        private void FlipTablesIfLeftTableAlreadyAliased(JoinDescription joinDescription)
        {
            var searchResult            = _alreadyAliasedTables.FirstOrDefault(a => a.Equals(joinDescription.LeftTable, StringComparison.InvariantCultureIgnoreCase));
            var leftTableAlreadyAliased = searchResult != null;

            if (leftTableAlreadyAliased)
            {
                new JoinDescriptionFlipper().Flip(joinDescription);
            }
        }
示例#4
0
        private string GetNonDerivedTableJoinLine(JoinDescription joinDescription)
        {
            FlipTablesIfLeftTableAlreadyAliased(joinDescription);
            var joinPrefix      = GetJoinPrefix(joinDescription);
            var rightTableAlias = QBuilder.TableNameAliaser.GetTableAlias(joinDescription.RightTable);
            var line            = $"{joinPrefix}join {joinDescription.LeftTable} {QBuilder.TableNameAliaser.GetTableAlias(joinDescription.LeftTable)} on {QBuilder.TableNameAliaser.GetTableAlias(joinDescription.LeftTable)}.{joinDescription.LeftField}";

            line += $" = {rightTableAlias}.{joinDescription.RightField}{Environment.NewLine}";
            return(line);
        }
示例#5
0
        private string GetLeftTableAlias(JoinDescription joinDescription)
        {
            var leftTableAlias = joinDescription.ExplicitLeftTableAlias;

            if (string.IsNullOrEmpty(leftTableAlias))
            {
                leftTableAlias = QBuilder.TableNameAliaser.GetTableAlias(joinDescription.LeftTable);
            }

            return(leftTableAlias);
        }
示例#6
0
        internal void SecondaryDerivedTableJoin(string rightField, string rightTable, QBuilder derivedTable, string derivedFieldName, string joinType)
        {
            var joinDescription = new JoinDescription
            {
                LeftTable = rightTable,
                LeftField = rightField,
                ExplicitRightTableAlias = DerivedTableWrapperNameResolver.GetWrapperName(derivedTable.DerivedTableName),
                RightField = derivedFieldName,
                JoinType   = joinType,
            };

            Joins.Add(joinDescription);
        }
示例#7
0
        private void TranslateToJoinDescription(DerivedTableJoinDescription derivedTableJoinDescription)
        {
            var joinDescription = new JoinDescription
            {
                JoinType               = derivedTableJoinDescription.JoinType,
                RightField             = derivedTableJoinDescription.RightField,
                RightTable             = derivedTableJoinDescription.RightTable,
                LeftField              = derivedTableJoinDescription.LeftField,
                ExplicitLeftTableAlias = derivedTableJoinDescription.QBuilder.DerivedTableName,
                DerivedTable           = derivedTableJoinDescription.QBuilder.Build(),
            };

            Joins.Add(joinDescription);
        }
示例#8
0
        public void Flip(JoinDescription joinDescription)
        {
            var flippedVersion = new JoinDescription
            {
                LeftField  = joinDescription.RightField,
                LeftTable  = joinDescription.RightTable,
                RightTable = joinDescription.LeftTable,
                RightField = joinDescription.LeftField,
            };

            joinDescription.LeftField  = flippedVersion.LeftField;
            joinDescription.LeftTable  = flippedVersion.LeftTable;
            joinDescription.RightField = flippedVersion.RightField;
            joinDescription.RightTable = flippedVersion.RightTable;
        }
示例#9
0
        internal bool TableFoundInJoin(string table, JoinDescription joinDescription)
        {
            var leftTable  = string.Empty;
            var rightTable = joinDescription.RightTable;

            if (joinDescription.IsInitialDerivedTableJoin)
            {
                leftTable = DerivedTableWrapperNameResolver.GetWrapperName(joinDescription.ExplicitLeftTableAlias);
            }
            else
            {
                leftTable = joinDescription.LeftTable;
            }

            return(leftTable.Equals(table, StringComparison.CurrentCultureIgnoreCase) ||
                   rightTable.Equals(table, StringComparison.CurrentCultureIgnoreCase));
        }
示例#10
0
 private string GetJoinLine(JoinDescription joinDescription)
 {
     if (joinDescription.IsInitialDerivedTableJoin)
     {
         return(GetInitialDerivedTableJoin(joinDescription));
     }
     else if (joinDescription.IsSecondaryDerivedTableJoin)
     {
         if (joinDescription.Consumed == false)
         {
             return(GetSecondaryDerivedTableJoin(joinDescription));
         }
         else
         {
             return(string.Empty);
         }
     }
     else
     {
         return(GetNonDerivedTableJoinLine(joinDescription));
     }
 }
示例#11
0
        public void JoinDescriptionFlipIsDoneCorrectly()
        {
            const string leftTable  = "leftTable";
            const string rightTable = "RightTable";
            const string leftField  = "leftField";
            const string rightField = "rightField";

            var joinDescription = new JoinDescription
            {
                LeftField  = rightField,
                LeftTable  = rightTable,
                RightField = leftField,
                RightTable = leftTable
            };

            new JoinDescriptionFlipper().Flip(joinDescription);

            Assert.Equal(leftTable, joinDescription.LeftTable);
            Assert.Equal(leftField, joinDescription.LeftField);
            Assert.Equal(rightField, joinDescription.RightField);
            Assert.Equal(rightTable, joinDescription.RightTable);
        }
示例#12
0
        private string GetJoinPrefix(JoinDescription joinDescription)
        {
            switch (joinDescription.JoinType)
            {
            default:
                var joinTypeIsUnsupported = true;
                DataValidator.EvaluateImmediate(joinTypeIsUnsupported, $"Unsupported join type '{joinDescription.JoinType}'");
                break;

            case JoinTypes.Full:
                return("Full Outer ");

            case JoinTypes.Inner:
                return(string.Empty);

            case JoinTypes.RightJoin:
                return("Right ");

            case JoinTypes.LeftJoin:
                return("Left ");
            }
            return(string.Empty);
        }