コード例 #1
0
        //TODO: add locale,and format options
        public IDictionary <string, BaseAssociationUpdateResult> BuildAssociationOptions(AttributeHolder dataMap, ApplicationMetadata application, IAssociationPrefetcherRequest request)
        {
            var associationsToFetch = AssociationHelper.BuildAssociationsToPrefetch(request, application.Schema);

            if (associationsToFetch.IsNone)
            {
                return(new Dictionary <string, BaseAssociationUpdateResult>());
            }


            IDictionary <string, BaseAssociationUpdateResult> associationOptionsDictionary = new ConcurrentDictionary <string, BaseAssociationUpdateResult>();
            var before = LoggingUtil.StartMeasuring(Log, "starting association options fetching for application {0} schema {1}", application.Name, application.Schema.Name);

            var associations = application.Schema.Associations;
            var tasks        = new List <Task>();
            var ctx          = ContextLookuper.LookupContext();

            #region associations

            foreach (var applicationAssociation in associations)
            {
                if (!associationsToFetch.ShouldResolve(applicationAssociation.AssociationKey))
                {
                    Log.Debug("ignoring association fetching: {0}".Fmt(applicationAssociation.AssociationKey));
                    continue;
                }

                //only resolve the association options for non lazy associations or lazy loaded with value set.
                SearchRequestDto search;
                if (!applicationAssociation.IsLazyLoaded())
                {
                    search = new SearchRequestDto();
                }
                else if (dataMap != null && dataMap.GetAttribute(applicationAssociation.Target) != null)
                {
                    //if the field has a value, fetch only this single element, for showing eventual extra label fields... ==> lookup with a selected value
                    search = new SearchRequestDto();
                    var toAttribute    = applicationAssociation.EntityAssociation.PrimaryAttribute().To;
                    var prefilledValue = dataMap.GetAttribute(applicationAssociation.Target).ToString();
                    search.AppendSearchEntry(toAttribute, prefilledValue);
                }
                else
                {
                    //lazy association with no default value
                    continue;
                }
                var association = applicationAssociation;

                tasks.Add(Task.Factory.NewThread(c => {
                    //this will avoid that one thread impacts any other, for ex: changing metadataid of the query
                    var perThreadContext = ctx.ShallowCopy();
                    Quartz.Util.LogicalThreadContext.SetData("context", perThreadContext);
                    var associationOptions = _associationOptionResolver.ResolveOptions(application, dataMap, association, search);
                    associationOptionsDictionary.Add(association.AssociationKey, new BaseAssociationUpdateResult(associationOptions));
                }, ctx));
            }
            #endregion

            #region optionfields
            foreach (var optionField in application.Schema.OptionFields)
            {
                if (!associationsToFetch.ShouldResolve(optionField.AssociationKey))
                {
                    Log.Debug("ignoring association fetching: {0}".Fmt(optionField.AssociationKey));
                    continue;
                }

                if (optionField.ProviderAttribute == null)
                {
                    //if there´s no provider, there´s nothing to do --> static list
                    continue;
                }
                var field = optionField;
                tasks.Add(Task.Factory.NewThread(c => {
                    Quartz.Util.LogicalThreadContext.SetData("context", c);
                    var associationOptions = _dynamicOptionFieldResolver.ResolveOptions(application, field, dataMap);
                    if (associationOptionsDictionary.ContainsKey(field.AssociationKey))
                    {
                        associationOptionsDictionary.Remove(field.AssociationKey);
                    }
                    associationOptionsDictionary.Add(field.AssociationKey, new BaseAssociationUpdateResult(associationOptions));
                }, ctx));
            }
            #endregion

            Task.WaitAll(tasks.ToArray());
            if (Log.IsDebugEnabled)
            {
                var keys = String.Join(",", associationOptionsDictionary.Keys.Where(k => associationOptionsDictionary[k].AssociationData != null));
                Log.Debug(LoggingUtil.BaseDurationMessageFormat(before, "Finished execution of options fetching. Resolved collections: {0}", keys));
            }


            return(associationOptionsDictionary);
        }
コード例 #2
0
        protected IEnumerable <AttributeHolder> FetchNew(long rowstamp, string entityName, SearchRequestDto searchDto = null)
        {
            var entityMetadata = MetadataProvider.Entity(entityName);
            var result         = EntityRepository.Get(entityMetadata, rowstamp, searchDto);

            return(result);
        }
コード例 #3
0
 public Task <PaginatedFullStudies> SearchAsync([FromQuery] SearchRequestDto searchRequest)
 {
     return(_searchFullStudiesUseCase.GetPaginatedFullStudiesAsync(searchRequest));
 }
コード例 #4
0
        protected List <SearchParameterUtils> GetSearchParameterUtilsList(EntityMetadata entityMetadata, SearchRequestDto searchRequestDto)
        {
            var searchParameterUtilsList = new List <SearchParameterUtils>();

            if (searchRequestDto.ValuesDictionary != null)
            {
                var entityAttributes = entityMetadata.Schema.Attributes;

                foreach (var param in searchRequestDto.ValuesDictionary)
                {
                    foreach (var entityAttribute in entityAttributes)
                    {
                        if (param.Key.StartsWith(entityAttribute.Name))
                        {
                            searchParameterUtilsList.Add(new SearchParameterUtils(param.Key, param.Value.Value, entityAttribute.Type));
                        }
                    }
                }
            }
            return(searchParameterUtilsList);
        }
コード例 #5
0
 public BindedEntityQuery CountRows(EntityMetadata entityMetadata, SearchRequestDto searchDto)
 {
     return(TemplateQueryBuild(entityMetadata, new InternalQueryRequest {
         SearchDTO = searchDto
     }, QueryCacheKey.QueryMode.Count));
 }
コード例 #6
0
        public string BuildWhereClause(string entityName, QueryCacheKey.QueryMode queryMode, SearchRequestDto searchDto = null)
        {
            var baseWhereClause = DoBuildBaseWhereClause(entityName, searchDto);

//            if (queryMode.Equals(QueryCacheKey.QueryMode.Detail)) {
//                return ApplySpecificDetailClauses(entityName, baseWhereClause);
//            }
            return(baseWhereClause);
        }
コード例 #7
0
        private IEnumerable <dynamic> Query(EntityMetadata entityMetadata, BindedEntityQuery query, SearchRequestDto searchDTO)
        {
            //TODO: hack to avoid garbage data and limit size of list queries.
            var paginationData = PaginationData.GetInstance(searchDTO, entityMetadata);
            var rows           = GetDao(entityMetadata).FindByNativeQuery(query.Sql, query.Parameters, paginationData, searchDTO.QueryAlias);

            return(rows);
        }
コード例 #8
0
        public static string RowstampWhereCondition(EntityMetadata entityMetadata, long rowstamp, SearchRequestDto searchDto)
        {
            var extraRowstamps = entityMetadata.Schema.Attributes.Where(s => s.Name.StartsWith("rowstamp") && !s.Name.Equals("rowstamp"));
            var sb             = new StringBuilder(entityMetadata.Name + ".rowstamp > " + rowstamp);

            foreach (var extraRowstamp in extraRowstamps)
            {
                sb.Append(" or ").Append(entityMetadata.Name).Append("." + extraRowstamp.Name + " > ").Append(rowstamp);
            }
            foreach (var association in entityMetadata.Associations)
            {
                if (searchDto == null || searchDto.ProjectionFields == null || HasProjection(searchDto.ProjectionFields, association))
                {
                    sb.Append(" or ").Append(association.Qualifier).Append(".rowstamp > ").Append(rowstamp);
                }
            }
            return(sb.ToString());
        }
コード例 #9
0
        public static string BuildSelectAttributesClause(EntityMetadata entityMetadata, QueryCacheKey.QueryMode queryMode
                                                         , SearchRequestDto dto = null)
        {
            var buffer = new StringBuilder();

            if (queryMode == QueryCacheKey.QueryMode.Count)
            {
                return(CountClause);
            }

            buffer.AppendFormat("select ");
            if (entityMetadata.FetchLimit() != null && queryMode == QueryCacheKey.QueryMode.Sync)
            {
                buffer.Append(string.Format(" top({0}) ", entityMetadata.FetchLimit()));
            }

            var attributes = entityMetadata.Attributes(NoCollections) as IList <EntityAttribute>
                             ?? entityMetadata.Attributes(NoCollections).ToList();

            var hasProjection = dto != null && dto.ProjectionFields.Count > 0;

            if (hasProjection)
            {
                foreach (ProjectionField field in dto.ProjectionFields)
                {
                    if (field.Name.StartsWith("#"))
                    {
                        if (field.Name.StartsWith("#null"))
                        {
                            //this way we can map null attributes, that can be used for unions
                            //see changeunionschema of hapag´s metadata.xml
                            buffer.AppendFormat("null" + SelectSeparator);
                        }
                        //this is an unmapped attribute
                        continue;
                    }
                    var result = LocateAttribute(entityMetadata, attributes, field);
                    if (!field.Name.Contains('.') && result == null)
                    {
                        //this field is not mapped
                        continue;
                    }
                    string aliasAttribute;
                    if (result != null && result.Item1.Query != null)
                    {
                        aliasAttribute = AliasAttribute(entityMetadata, field.Alias, result.Item1, result.Item2);
                    }
                    else
                    {
                        aliasAttribute = AliasAttribute(entityMetadata, field);
                    }
                    buffer.AppendFormat(aliasAttribute + SelectSeparator);
                }
            }
            else
            {
                for (var i = 0; i < attributes.Count; i++)
                {
                    var entityAttribute = attributes[i];
                    if (entityAttribute.Name.StartsWith("#null"))
                    {
                        //this way we can map null attributes, that can be used for unions
                        //see changeunionschema of hapag´s metadata.xml
                        buffer.AppendFormat("null" + SelectSeparator);
                    }
                    else
                    {
                        var aliasAttribute = AliasAttribute(entityMetadata, entityAttribute);
                        buffer.AppendFormat(aliasAttribute + SelectSeparator);
                    }
                }
            }
            return(buffer.ToString().Substring(0, buffer.Length - SelectSeparator.Count()) + " ");
        }
コード例 #10
0
        //needed to avoid "Fields" nesting in collectionData
        public SearchEntityResult GetAsRawDictionary([NotNull] EntityMetadata entityMetadata, [NotNull] SearchRequestDto searchDto, Boolean fetchMaxRowstamp = false)
        {
            if (entityMetadata == null)
            {
                throw new ArgumentNullException("entityMetadata");
            }
            if (searchDto == null)
            {
                throw new ArgumentNullException("searchDto");
            }
            var query      = new EntityQueryBuilder().AllRows(entityMetadata, searchDto);
            var rows       = Query(entityMetadata, query, searchDto);
            var enumerable = rows as dynamic[] ?? rows.ToArray();

            Log.DebugFormat("returning {0} rows", enumerable.Count());
            long?maxRowstamp = 0;

            IList <Dictionary <string, object> > list = new List <Dictionary <string, object> >();

            foreach (var row in enumerable)
            {
                var dict = (IDictionary <string, object>)row;
                var item = new Dictionary <string, object>();
                if (fetchMaxRowstamp)
                {
                    if (dict.ContainsKey(RowStampUtil.RowstampColumnName))
                    {
                        var rowstamp = RowStampUtil.Convert(dict[RowStampUtil.RowstampColumnName]);
                        if (rowstamp > maxRowstamp)
                        {
                            maxRowstamp = rowstamp;
                        }
                    }
                }

                foreach (var column in dict)
                {
                    item[FixKey(column.Key, entityMetadata)] = column.Value;
                }
                if (entityMetadata.Name == "relatedrecord")
                {
                    item["hmachash"] = AuthUtils.HmacShaEncode(item["relatedreckey"].ToString());
                }
                else if (entityMetadata.Name == "ticket" || entityMetadata.Name == "imac")
                {
                    item["hmachash"] = AuthUtils.HmacShaEncode(item["ticketid"].ToString());
                }
                else if (entityMetadata.IdFieldName != null && item.ContainsKey(entityMetadata.IdFieldName))
                {
                    //for compositions in general
                    item["hmachash"] = AuthUtils.HmacShaEncode(item[entityMetadata.IdFieldName].ToString());
                }

                list.Add(item);
            }

            return(new SearchEntityResult {
                MaxRowstampReturned = maxRowstamp == 0 ? null : maxRowstamp,
                ResultList = list,
                IdFieldName = entityMetadata.IdFieldName
            });
        }
コード例 #11
0
        public IActionResult Search([FromBody] SearchRequestDto searchRequest)
        {
            var delay = searchRequest.Delay;

            return(Ok(_searchService.Search(searchRequest, delay)));
        }
コード例 #12
0
        public string BuildWhereClause(string entityName, QueryCacheKey.QueryMode queryMode, SearchRequestDto searchDto = null)
        {
            var entityMetadata = MetadataProvider.Entity(entityName);

            //double check
            return(entityMetadata.HasWhereClause ? entityMetadata.Schema.WhereClause : null);
        }
コード例 #13
0
 public CompositionPreFilterFunctionParameters(ApplicationSchemaDefinition appSchema, SearchRequestDto baseDto, AttributeHolder originalEntity, ApplicationCompositionCollectionSchema composition)
     : base(baseDto, composition, originalEntity)
 {
     _appSchema = appSchema;
 }
コード例 #14
0
        public IActionResult Index(SearchRequestDto searchRequestDto) //
        {
            var result = _searchService.Search(searchRequestDto);

            return(View(result.Data));
        }
コード例 #15
0
        private IEnumerable <dynamic> Query(EntityMetadata entityMetadata, BindedEntityQuery query, long rowstamp, SearchRequestDto searchDto)
        {
            var sqlAux = query.Sql.Replace("1=1", RowStampUtil.RowstampWhereCondition(entityMetadata, rowstamp, searchDto));
            var rows   = GetDao(entityMetadata).FindByNativeQuery(sqlAux, query.Parameters, null, searchDto.QueryAlias);

            return(rows);
        }
コード例 #16
0
 public AssociationPreFilterFunctionParameters(ApplicationMetadata metadata, SearchRequestDto baseDto,
                                               ApplicationAssociationDefinition association, AttributeHolder originalEntity)
     : base(baseDto, association, originalEntity)
 {
     _metadata = metadata;
 }
コード例 #17
0
        public IReadOnlyList <AttributeHolder> Get([NotNull] EntityMetadata entityMetadata, long rowstamp, SearchRequestDto searchDto = null)
        {
            if (entityMetadata == null)
            {
                throw new ArgumentNullException("entityMetadata");
            }
            if (searchDto == null)
            {
                searchDto = new SearchRequestDto();
            }
            var query = new EntityQueryBuilder().AllRows(entityMetadata, searchDto);

            if (searchDto.QueryGeneratorService != null && entityMetadata is SlicedEntityMetadata)
            {
                var sliced      = (SlicedEntityMetadata)entityMetadata;
                var customQuery = GenericSwMethodInvoker.Invoke <string>(sliced.AppSchema, searchDto.QueryGeneratorService, entityMetadata,
                                                                         searchDto);
                if (customQuery != null)
                {
                    query.Sql = customQuery;
                }
            }

            var rows = Query(entityMetadata, query, rowstamp, searchDto);

            return(rows.Cast <IEnumerable <KeyValuePair <string, object> > >()
                   .Select(r => BuildDataMap(entityMetadata, r))
                   .ToList());
        }
コード例 #18
0
        public string BuildWhereClause(string entityName, QueryCacheKey.QueryMode queryMode, SearchRequestDto searchDto = null)
        {
            if (_rowstamps.CurrentMode() == Rowstamps.RowstampMode.None)
            {
                return(null);
            }
            IDictionary <string, object> parameters = _rowstamps.GetParameters();
            string sql = null;

            switch (_rowstamps.CurrentMode())
            {
            case Rowstamps.RowstampMode.Both:
                sql = Both;
                break;

            case Rowstamps.RowstampMode.Lower:
                sql = Lower;
                break;

            case Rowstamps.RowstampMode.Upper:
                sql = Upper;
                break;
            }
            return(sql);
        }
コード例 #19
0
 /// <summary>
 /// Returns list of scale answer sets matches to search criteria.
 /// </summary>
 /// <param name="searchRequest"></param>
 /// <param name="token"></param>
 /// <returns></returns>
 public async Task <IList <ScaleAnswerSetResponseDto> > FindScaleAnswerSets(SearchRequestDto searchRequest, string token)
 {
     return(await this.healthLibraryDataProvider.FindScaleAnswerSets(searchRequest, token));
 }
コード例 #20
0
 /// <summary>
 /// <see cref="ISearchService.Search(SearchRequestDto)"/>
 /// </summary>
 public object Search(SearchRequestDto searchRequest, bool delay)
 {
     return(_elasticSearchRepository.Search(searchRequest, delay));
 }
コード例 #21
0
 /// <summary>
 /// Returns list of text media elements which matches to specified search criteria.
 /// </summary>
 /// <param name="searchRequest"></param>
 /// <param name="token"></param>
 /// <returns></returns>
 public async Task <IEnumerable <TextMediaElementResponseDto> > FindTextMediaElements(
     SearchRequestDto searchRequest, string token)
 {
     return(await this.healthLibraryDataProvider.FindTextMediaElements(searchRequest, token));
 }
コード例 #22
0
 public string BuildWhereClause(string entityName, QueryCacheKey.QueryMode queryMode, SearchRequestDto searchDto = null)
 {
     if (searchDto != null && searchDto.FilterFixedWhereClause != null)
     {
         return(searchDto.FilterFixedWhereClause);
     }
     return(null);
 }
コード例 #23
0
 /// <summary>
 /// Returns list of scale answer sets matches to search criteria.
 /// </summary>
 /// <param name="searchRequest"></param>
 /// <param name="token"></param>
 /// <returns></returns>
 public async Task <IList <QuestionElementResponseDto> > FindQuestionElements(SearchRequestDto searchRequest, string token)
 {
     return(await this.healthLibraryDataProvider.FindQuestionElements(searchRequest, token));
 }
コード例 #24
0
        public string BuildWhereClause(string entityName, QueryCacheKey.QueryMode queryMode, SearchRequestDto searchDto = null)
        {
            var entity = MetadataProvider.Entity(entityName);

            if (!entity.Schema.Attributes.Any(a => a.Name.Equals("pluspcustomer")))
            {
                return(null);
            }
            var property = MetadataProvider.GlobalProperty("multitenantprefix");

            if (property == null)
            {
                return(null);
            }
            return(String.Format("{0}.pluspcustomer like '{1}'", entityName, property));
        }
コード例 #25
0
 /// <summary>
 /// <see cref="ISearchService.Search(SearchRequestDto)"/>
 /// </summary>
 public object Search(SearchRequestDto searchRequest)
 {
     return(_elasticSearchRepository.Search(searchRequest));
 }