public IQueryBuilder GenerateSelect <T>(IQueryBuilder condicoes = null, int?skip = null, int?limit = null, MemberInfo orderingMember = null, OrderingType ordering = OrderingType.Asc) where T : IDataObject, new()
        {
            var          alias = "tba";
            QueryBuilder Query = new QueryBuilder();

            lock (LocksAutoSelectCache[$"MYSQL_SELECTS_{typeof(T).Name}"]) {
                if (!AutoSelectCache.ContainsKey(typeof(T)))
                {
                    Fi.Tech.WriteLine($"Generating SELECT {condicoes} {skip} {limit} {orderingMember?.Name} {ordering}");
                    QueryBuilder baseSelect = new QbFmt("SELECT ");
                    baseSelect.Append(GenerateFieldsString(typeof(T), false));
                    baseSelect.Append(String.Format($"FROM {typeof(T).Name} AS { alias }"));
                    AutoSelectCache[typeof(T)] = baseSelect;
                }

                Query.Append(AutoSelectCache[typeof(T)]);
            }


            if (condicoes != null && !condicoes.IsEmpty)
            {
                Query.Append("WHERE");
                Query.Append(condicoes);
            }
            if (orderingMember != null)
            {
                Query.Append($"ORDER BY {alias}.{orderingMember.Name} {ordering.ToString().ToUpper()}");
            }
            if (limit != null || skip != null)
            {
                Query.Append($"LIMIT {(skip != null ? $"{skip}," : "")} {limit ?? Int32.MaxValue}");
            }
            Query.Append(";");
            return(Query);
        }
Exemple #2
0
        public IQueryBuilder GenerateSelect <T>(IQueryBuilder condicoes = null, int?skip = null, int?limit = null, MemberInfo orderingMember = null, OrderingType ordering = OrderingType.Asc) where T : IDataObject, new()
        {
            var type  = typeof(T);
            var alias = new PrefixMaker().GetAliasFor("root", typeof(T).Name, String.Empty);

            Fi.Tech.WriteLine($"Generating SELECT {condicoes} {skip} {limit} {orderingMember?.Name} {ordering}");
            QueryBuilder Query = new QbFmt("SELECT ");

            Query.Append(GenerateFieldsString(type, false));
            Query.Append(String.Format($"FROM {type.Name} AS { alias }"));
            if (condicoes != null && !condicoes.IsEmpty)
            {
                Query.Append("WHERE");
                Query.Append(condicoes);
            }
            if (orderingMember != null)
            {
                Query.Append($"ORDER BY {alias}.{orderingMember.Name} {ordering.ToString().ToUpper()}");
            }
            if (limit != null || skip != null)
            {
                Query.Append($"LIMIT {(skip != null ? $"{skip}," : "")} {limit ?? Int32.MaxValue}");
            }
            Query.Append(";");
            return(Query);
        }
        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);
        }
Exemple #4
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);
        }