Beispiel #1
0
        /// <summary>
        /// Draw join between given connectors.
        /// </summary>
        /// <param name="from">Source connector.</param>
        /// <param name="to">Target connector.</param>
        /// <returns>Drawn join.</returns>
        public JoinDefinition DrawJoin(ConnectorDefinition from, ConnectorDefinition to)
        {
            var join = new JoinDefinition(from, to);

            Instance.Context.DrawJoin(join);

            return(join);
        }
Beispiel #2
0
        /// <summary>
        /// Creates the join according to given definition.
        /// </summary>
        /// <param name="definition">The definition of join.</param>
        /// <param name="context">The context of <see cref="DiagramDefinition" /> where join will be displayed.</param>
        /// <returns>Join drawing.</returns>
        public override JoinDrawing CreateJoin(JoinDefinition definition, DiagramContext context)
        {
            if (_joinFactory == null)
            {
                return(null);
            }

            return(_joinFactory(definition));
        }
Beispiel #3
0
 public IWhere <TComplete> RightJoin(string joinedColumn, string table, string column)
 {
     JoinDef = new JoinDefinition
     {
         JoinType     = Joins.RightJoin,
         JoinedTable  = TableName,
         JoinedColumn = joinedColumn,
         Table        = table,
         Column       = column
     };
     return((IWhere <TComplete>)(object) this);
 }
Beispiel #4
0
        private string GetJoinCommand(JoinDefinition joinDef)
        {
            StringBuilder stringBuilder = new StringBuilder();

            switch (joinDef.JoinType)
            {
            case Joins.InnerJoin:
                stringBuilder.Append($"INNER JOIN {joinDef.Table} ON {joinDef.JoinedTable}.{joinDef.JoinedColumn}={joinDef.Table}.{joinDef.Column}");
                break;

            case Joins.LeftJoin:
                stringBuilder.Append($"LEFT JOIN {joinDef.Table} ON {joinDef.JoinedTable}.{joinDef.JoinedColumn}={joinDef.Table}.{joinDef.Column}");
                break;

            case Joins.RightJoin:
                stringBuilder.Append($"RIGHT JOIN {joinDef.Table} ON {joinDef.JoinedTable}.{joinDef.JoinedColumn}={joinDef.Table}.{joinDef.Column}");
                break;
            }
            return(stringBuilder.ToString());
        }
        private static List <KeyValuePair <string, IReadOnlyDictionary <string, object> > > JoinResults(
            this JoinDefinition joinDefinition,
            IReadOnlyDictionary <string, IReadOnlyDictionary <string, object> > leftEntities,
            IReadOnlyDictionary <string, IReadOnlyDictionary <string, object> > rightEntities,
            Func <KeyValuePair <string, IReadOnlyDictionary <string, object> >,
                  KeyValuePair <string, IReadOnlyDictionary <string, object> >,
                  KeyValuePair <string, IReadOnlyDictionary <string, object> > > mapFunc = null)
        {
            switch (joinDefinition.Type)
            {
            case JoinType.Inner:
                var innerJoin = from lefts in leftEntities
                                join rights in rightEntities on lefts.Value[joinDefinition.Left.JoinedFieldName] equals
                                rights.Value[joinDefinition.Right.JoinedFieldName]
                                into joined
                                from result in joined
                                select mapFunc?.Invoke(lefts, result) ?? lefts;

                return(innerJoin
                       .Select(join =>
                               new KeyValuePair <string, IReadOnlyDictionary <string, object> >(join.Key, join.Value))
                       .ToList());

            case JoinType.Left:
                var leftJoin = from lefts in leftEntities
                               join rights in rightEntities on lefts.Value[joinDefinition.Left.JoinedFieldName] equals
                               rights.Value[joinDefinition.Right.JoinedFieldName]
                               into joined
                               from result in joined.DefaultIfEmpty()
                               select mapFunc?.Invoke(lefts, result) ?? lefts;

                return(leftJoin
                       .Select(join =>
                               new KeyValuePair <string, IReadOnlyDictionary <string, object> >(join.Key, join.Value))
                       .ToList());

            default:
                throw new ArgumentOutOfRangeException(nameof(JoinType));
            }
        }
Beispiel #6
0
        public static List <QueryEntity> JoinResults(this JoinDefinition joinDefinition,
                                                     IReadOnlyDictionary <string, IReadOnlyDictionary <string, object> > leftEntities,
                                                     IReadOnlyDictionary <string, IReadOnlyDictionary <string, object> > rightEntities,
                                                     RepositoryEntityMetadata metadata,
                                                     Func <KeyValuePair <string, IReadOnlyDictionary <string, object> >,
                                                           KeyValuePair <string, IReadOnlyDictionary <string, object> >,
                                                           KeyValuePair <string, IReadOnlyDictionary <string, object> > > mapFunc = null)
        {
            switch (joinDefinition.Type)
            {
            case JoinType.Inner:
                var innerJoin = from lefts in leftEntities
                                join rights in rightEntities on lefts.Value[joinDefinition.Left.JoinedFieldName] equals
                                rights.Value[joinDefinition.Right.JoinedFieldName]
                                into joined
                                from result in joined
                                select mapFunc?.Invoke(lefts, result) ?? lefts;

                return(innerJoin
                       .Select(e => EntityFromContainerProperties(e.Value, metadata))
                       .ToList());

            case JoinType.Left:
                var leftJoin = from lefts in leftEntities
                               join rights in rightEntities on lefts.Value[joinDefinition.Left.JoinedFieldName] equals
                               rights.Value[joinDefinition.Right.JoinedFieldName]
                               into joined
                               from result in joined.DefaultIfEmpty()
                               select mapFunc?.Invoke(lefts, result) ?? lefts;

                return(leftJoin
                       .Select(e => EntityFromContainerProperties(e.Value, metadata))
                       .ToList());

            default:
                throw new ArgumentOutOfRangeException(nameof(JoinType));
            }
        }
Beispiel #7
0
 /// <summary>
 /// Creates the join according to given definition.
 /// </summary>
 /// <param name="definition">The definition of join.</param>
 /// <param name="context">The context of <see cref="DiagramDefinition" /> where join will be displayed.</param>
 /// <returns>Join drawing.</returns>
 /// <exception cref="System.NotImplementedException"></exception>
 public override JoinDrawing CreateJoin(JoinDefinition definition, DiagramContext context)
 {
     throw new NotImplementedException();
 }
        public IQueryBuilder GenerateJoinQuery(JoinDefinition inputJoin, IQueryBuilder conditions, int?skip = null, int?take = null, MemberInfo orderingMember = null, OrderingType otype = OrderingType.Asc, IQueryBuilder rootConditions = null)
        {
            if (rootConditions == null)
            {
                rootConditions = new QbFmt("true");
            }
            if (inputJoin.Joins.Count < 1)
            {
                throw new BDadosException("This join needs 1 or more tables.");
            }

            List <Type>           tables     = (from a in inputJoin.Joins select a.ValueObject).ToList();
            List <String>         tableNames = (from a in inputJoin.Joins select a.ValueObject.Name).ToList();
            List <String>         prefixes   = (from a in inputJoin.Joins select a.Prefix).ToList();
            List <String>         aliases    = (from a in inputJoin.Joins select a.Alias).ToList();
            List <String>         onclauses  = (from a in inputJoin.Joins select a.Args).ToList();
            List <List <String> > columns    = (from a in inputJoin.Joins select a.Columns).ToList();
            List <JoinType>       joinTypes  = (from a in inputJoin.Joins select a.Type).ToList();

            var isLinedAggregateJoin = false; // && conditions.GetCommandText() == rootConditions.GetCommandText() && conditions.GetParameters().SequenceEqual(rootConditions.GetParameters());

            QueryBuilder Query = new QueryBuilder();

            if (!AutoJoinCache.ContainsKey(inputJoin))
            {
                lock (AutoJoinCache) {
                    if (!AutoJoinCache.ContainsKey(inputJoin))
                    {
                        // By caching this heavy process I might gain loads of performance
                        // When redoing the same queries.
                        QueryBuilder autoJoinMain = new QbFmt("SELECT sub.*\n");
                        autoJoinMain.Append($"\t FROM (SELECT\n");
                        for (int i = 0; i < tables.Count; i++)
                        {
                            autoJoinMain.Append($"\t\t-- Table {tableNames[i]}\n");
                            var ridF = FiTechBDadosExtensions.RidColumnOf[tables[i]];
                            if (!columns[i].Any(c => c.ToUpper() == ridF.ToUpper()))
                            {
                                columns[i].Add(ridF);
                            }
                            var nonexcl = columns[i];
                            for (int j = 0; j < nonexcl.Count; j++)
                            {
                                autoJoinMain.Append($"\t\t{prefixes[i]}.{nonexcl[j]} AS {prefixes[i]}_{nonexcl[j]},\n");
                            }
                            autoJoinMain.Append("\n");
                        }

                        autoJoinMain.Append($"\t\t1 FROM (SELECT * FROM {tableNames[0]}");

                        if (isLinedAggregateJoin)
                        {
                            if (rootConditions != null)
                            {
                                autoJoinMain.Append("WHERE ");
                                autoJoinMain.Append(rootConditions);
                            }
                            if (orderingMember != null)
                            {
                                autoJoinMain.Append($"ORDER BY {orderingMember.Name} {otype.ToString().ToUpper()}");
                            }
                            if (skip != null || take != null)
                            {
                                autoJoinMain.Append("LIMIT ");
                                autoJoinMain.Append(
                                    skip != null ? $"{skip},{take ?? Int32.MaxValue}" : $"{take ?? Int32.MaxValue}"
                                    );
                            }
                            autoJoinMain.Append($"");
                        }
                        autoJoinMain.Append($") AS {prefixes[0]}\n");

                        for (int i = 1; i < tables.Count; i++)
                        {
                            autoJoinMain.Append($"\t\t{"LEFT"} JOIN {tableNames[i]} AS {prefixes[i]} ON {onclauses[i]}\n");
                        }
                        AutoJoinCache[inputJoin] = (autoJoinMain);
                    }
                }
            }
            Query.Append(AutoJoinCache[inputJoin]);

            if (!isLinedAggregateJoin)
            {
                if (conditions != null && !conditions.IsEmpty)
                {
                    Query.Append("\tWHERE");
                    Query.Append(conditions);
                }
                if (orderingMember != null)
                {
                    Query.Append($"ORDER BY {prefixes[0]}.{orderingMember.Name} {otype.ToString().ToUpper()}");
                }
                if (skip != null || take != null)
                {
                    Query.Append("LIMIT ");
                    Query.Append(
                        skip != null ? $"{skip},{take ?? Int32.MaxValue}" : $"{take ?? Int32.MaxValue}"
                        );
                }
            }


            Query.Append(") AS sub\n");

            return(Query);
        }
Beispiel #9
0
 public override JoinDrawing CreateJoin(JoinDefinition definition, DiagramContext context)
 {
     return(new CompositionJoin(definition));
 }
 internal JoinConfigureHelper(JoinDefinition _join, int _index)
 {
     this._join  = _join;
     this._index = _index;
 }
Beispiel #11
0
        public IQueryBuilder GenerateJoinQuery(JoinDefinition inputJoin, IQueryBuilder conditions, int?skip = null, int?limit = null, MemberInfo orderingMember = null, OrderingType otype = OrderingType.Asc, IQueryBuilder rootConditions = null)
        {
            if (rootConditions == null)
            {
                rootConditions = new QbFmt("true");
            }
            if (inputJoin.Joins.Count < 1)
            {
                throw new BDadosException("This join needs 1 or more tables.");
            }

            List <Type>           tables     = (from a in inputJoin.Joins select a.ValueObject).ToList();
            List <String>         tableNames = (from a in inputJoin.Joins select a.ValueObject.Name).ToList();
            List <String>         prefixes   = (from a in inputJoin.Joins select a.Prefix).ToList();
            List <String>         aliases    = (from a in inputJoin.Joins select a.Alias).ToList();
            List <String>         onclauses  = (from a in inputJoin.Joins select a.Args).ToList();
            List <List <String> > columns    = (from a in inputJoin.Joins select a.Columns).ToList();
            List <JoinType>       joinTypes  = (from a in inputJoin.Joins select a.Type).ToList();

            QueryBuilder Query = new QbFmt("SELECT sub.*\n");

            Query.Append($"\t FROM (SELECT\n");
            for (int i = 0; i < tables.Count; i++)
            {
                Query.Append($"\t\t-- Table {tableNames[i]}\n");
                var fields = ReflectionTool.FieldsAndPropertiesOf(
                    tables[i])
                             .Where((a) => a.GetCustomAttribute(typeof(FieldAttribute)) != null)
                             .ToArray();
                if (!columns[i].Contains("RID"))
                {
                    columns[i].Add("RID");
                }
                var nonexcl = columns[i];
                for (int j = 0; j < nonexcl.Count; j++)
                {
                    Query.Append($"\t\t{prefixes[i]}.{nonexcl[j]} AS {prefixes[i]}_{nonexcl[j]}");
                    if (true || j < nonexcl.Count - 1 || i < tables.Count - 1)
                    {
                        Query.Append(",");
                    }
                    Query.Append("\n");
                }
                Query.Append("\n");
            }

            Query.Append($"\t\t1 FROM (SELECT * FROM {tableNames[0]}");
            if (rootConditions != null)
            {
                Query.Append("WHERE ");
                Query.Append(rootConditions);
            }
            if (orderingMember != null)
            {
                Query.Append($"ORDER BY {orderingMember.Name} {otype.ToString().ToUpper()}");
            }
            if (limit != null)
            {
                Query.Append($"LIMIT");
                if (skip != null)
                {
                    Query.Append($"{skip},");
                }
                Query.Append($"{limit}");
            }
            Query.Append($"");
            Query.Append($") AS {prefixes[0]}\n");

            for (int i = 1; i < tables.Count; i++)
            {
                Query.Append($"\t\t{"LEFT"} JOIN {tableNames[i]} AS {prefixes[i]} ON {onclauses[i]}\n");
            }

            if (conditions != null && !conditions.IsEmpty)
            {
                Query.Append("\tWHERE");
                Query.Append(conditions);
            }
            if (orderingMember != null)
            {
                Query.Append($"ORDER BY {prefixes[0]}.{orderingMember.Name} {otype.ToString().ToUpper()}");
            }
            if (limit != null)
            {
                Query.Append($"LIMIT");
                if ((skip ?? 0) > 0)
                {
                    Query.Append($"{skip}, ");
                }
                Query.Append($"{limit}");
            }
            Query.Append(") AS sub\n");

            return(Query);
        }
Beispiel #12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="CompositionJoin"/> class.
 /// </summary>
 /// <param name="definition">The join definition.</param>
 public CompositionJoin(JoinDefinition definition) :
     base(definition)
 {
     this.AllowDrop = false;
 }