Exemplo n.º 1
0
        private static string DoBuildQueryString(EntityMetadata entityMetadata, InternalQueryRequest queryParameter,
                                                 QueryCacheKey.QueryMode queryMode, IWhereBuilder compositeWhereBuilder, QueryCacheKey cacheKey)
        {
            var buffer            = new StringBuilder(InitialStringBuilderCapacity);
            var projectionBuilder = new StringBuilder(InitialStringBuilderCapacity);

            projectionBuilder.Append(QuerySelectBuilder.BuildSelectAttributesClause(entityMetadata, queryMode, queryParameter.SearchDTO));
            projectionBuilder.Append(QueryFromBuilder.Build(entityMetadata, queryParameter.SearchDTO));
            buffer.Append(projectionBuilder);
            buffer.Append(compositeWhereBuilder.BuildWhereClause(entityMetadata.Name, queryMode, queryParameter.SearchDTO));

            var hasUnionWhereClauses = queryParameter.SearchDTO != null && queryParameter.SearchDTO.UnionWhereClauses != null;
            var isUnion = entityMetadata.HasUnion() || queryMode == QueryCacheKey.QueryMode.Union || hasUnionWhereClauses;

            if (queryMode != QueryCacheKey.QueryMode.Count && queryMode != QueryCacheKey.QueryMode.Detail && !isUnion)
            {
                buffer.Append(QuerySearchSortBuilder.BuildSearchSort(entityMetadata, queryParameter.SearchDTO));
            }

            if (hasUnionWhereClauses)
            {
                foreach (var unionWC in queryParameter.SearchDTO.UnionWhereClauses)
                {
                    buffer.Append(" union all ").Append(projectionBuilder).Append(" where (").Append(unionWC).Append(")");
                }
                buffer.Append(" order by 1 desc");
            }
            var queryString = buffer.ToString();

            return(queryString);
        }
Exemplo n.º 2
0
        protected IWhereBuilder GetCompositeBuilder(EntityMetadata entityMetadata, InternalQueryRequest queryParameter)
        {
            IList <IWhereBuilder> whereBuilders = new List <IWhereBuilder>();



            if (queryParameter.Id != null)
            {
                //TODO: make some kind of hash to determine if this is needed...
                whereBuilders.Add(new ByIdWhereBuilder(entityMetadata, queryParameter.Id));
                whereBuilders.Add(new MultiTenantCustomerWhereBuilder());
                return(new CompositeWhereBuilder(whereBuilders));
            }
            //not needed to avoid extra useless conditions, such as the sr out of changes
            whereBuilders.Add(new EntityWhereClauseBuilder());
            if (queryParameter.SearchDTO != null)
            {
                var searchParameterUtilsList = GetSearchParameterUtilsList(entityMetadata, queryParameter.SearchDTO);
                whereBuilders.Add(searchParameterUtilsList.Count == 0
                    ? new SearchUtils(queryParameter.SearchDTO, entityMetadata.Name, entityMetadata.GetTableName())
                    : new SearchUtils(queryParameter.SearchDTO, entityMetadata.Name, entityMetadata.GetTableName(), searchParameterUtilsList));
            }

            whereBuilders.Add(new FixedSearchWhereClauseBuilder());

            if (queryParameter.Rowstamps != null)
            {
                whereBuilders.Add(new RowstampQueryBuilder(queryParameter.Rowstamps));
            }
            if (!ApplicationConfiguration.IsUnitTest)
            {
                var contextLookuper = SimpleInjectorGenericFactory.Instance.GetObject <IContextLookuper>(typeof(IContextLookuper));
                var context         = contextLookuper.LookupContext();
                if (queryParameter.Id == null || !context.InternalQueryExecution)
                {
                    whereBuilders.Add(
                        SimpleInjectorGenericFactory.Instance.GetObject <DataConstraintsWhereBuilder>(
                            typeof(DataConstraintsWhereBuilder)));
                }
            }
            whereBuilders.Add(new MultiTenantCustomerWhereBuilder());
            return(new CompositeWhereBuilder(whereBuilders));
        }
Exemplo n.º 3
0
        private BindedEntityQuery HandleUnion(SlicedEntityMetadata slicedEntityMetadata, InternalQueryRequest queryParameter, string queryString, QueryCacheKey.QueryMode queryMode,
                                              IEnumerable <KeyValuePair <string, object> > parameters)
        {
            var queryModeToPropagate = queryMode == QueryCacheKey.QueryMode.Count
                ? QueryCacheKey.QueryMode.Count
                : QueryCacheKey.QueryMode.Union;


            var unionQuery = TemplateQueryBuild(slicedEntityMetadata.UnionSchema, new InternalQueryRequest()
            {
                SearchDTO = queryParameter.SearchDTO.unionDTO
            }, queryModeToPropagate);

            queryString += (" union all " + unionQuery.Sql + " ");
            if (queryMode == QueryCacheKey.QueryMode.Count)
            {
                queryString = "select sum(cnt) from (" + queryString + ")";
                return(new BindedEntityQuery(queryString, parameters.Union(unionQuery.Parameters)));
            }
            //for unions, we need to do the order by in the end
            queryString += QuerySearchSortBuilder.BuildSearchSort(slicedEntityMetadata, queryParameter.SearchDTO);

            return(new BindedEntityQuery(queryString, parameters.Union(unionQuery.Parameters)));
        }
Exemplo n.º 4
0
        protected BindedEntityQuery TemplateQueryBuild(EntityMetadata entityMetadata, InternalQueryRequest queryParameter, QueryCacheKey.QueryMode queryMode)
        {
            string queryString;
            var    before = Stopwatch.StartNew();
            var    compositeWhereBuilder = GetCompositeBuilder(entityMetadata, queryParameter);
            var    cacheKey = GetCacheKey(queryParameter, queryMode);

            if (!entityMetadata.QueryStringCache.TryGetValue(cacheKey, out queryString) || !queryParameter.Cacheable())
            {
                queryString = DoBuildQueryString(entityMetadata, queryParameter, queryMode, compositeWhereBuilder,
                                                 cacheKey);
            }
            else
            {
                //where clauses should always be rebuild independent of cache, due to context variation, like modules, profiles, etc...
                var whereBuilder    = SimpleInjectorGenericFactory.Instance.GetObject <DataConstraintsWhereBuilder>(typeof(DataConstraintsWhereBuilder));
                var whereConstraint = whereBuilder.BuildWhereClause(entityMetadata.Name, queryMode, queryParameter.SearchDTO);
                queryString = String.Format(queryString, whereConstraint);
            }
            if (entityMetadata.HasUnion())
            {
                return(HandleUnion(entityMetadata as SlicedEntityMetadata, queryParameter, queryString, queryMode, compositeWhereBuilder.GetParameters()));
            }

            Log.Debug(LoggingUtil.BaseDurationMessageFormat(before, "query for {0}:{1} built", entityMetadata.Name, queryMode.ToString()));

            return(new BindedEntityQuery(queryString, compositeWhereBuilder.GetParameters()));
        }