Exemple #1
0
        public static QueryExpression ExtractQueryInputFromContext(ICDSExecutionContext executionContext)
        {
            _ = executionContext ?? throw new ArgumentNullException(nameof(executionContext));

            var inputParameters = executionContext.InputParameters;

            if (!inputParameters.Contains("Query") || inputParameters["Query"] == null)
            {
                throw new ArgumentException("Context does not contain a valid query input argument.");
            }

            if (inputParameters["Query"] is QueryExpression)
            {
                return(inputParameters["Query"] as QueryExpression);
            }


            if (inputParameters["Query"] is FetchExpression)
            {
                var fetchExpression = inputParameters["Query"] as FetchExpression;

                var conversionRequest = new FetchXmlToQueryExpressionRequest
                {
                    FetchXml = fetchExpression.Query
                };

                var conversionResponse = (FetchXmlToQueryExpressionResponse)executionContext.OrganizationService.Execute(conversionRequest);

                return(conversionResponse.Query);
            }

            throw new Exception("Could not extract a valid query expression from the execution context input parameters.");
        }
        private IServiceConfiguration LoadConfiguration(ICDSExecutionContext executionContext, bool disableCache)
        {
            var settings = SettingsFactory.Create(executionContext);

            if (!disableCache && executionContext.Cache.Exists(CACHE_KEY))
            {
                return(executionContext.Cache.Get <IServiceConfiguration>(CACHE_KEY));
            }

            IServiceConfiguration config = new ServiceConfiguration();

            //get all XML data configuration files located in the virtual configuration path.
            var qry = new QueryExpression
            {
                EntityName = "webresource",
                ColumnSet  = new ColumnSet("name"),
                Criteria   = new FilterExpression
                {
                    Conditions =
                    {
                        new ConditionExpression
                        {
                            AttributeName = "name",
                            Operator      = ConditionOperator.BeginsWith,
                            Values        = { settings.ConfigurationDataPath }
                        }
                    }
                }
            };

            var xmlDataResources = executionContext.OrganizationService.RetrieveMultiple(qry).Entities;

            executionContext.Trace(string.Format("Retrieved {0} XML Data resource records.", xmlDataResources.Count));

            // Process each named XML configuration resource to build out the field level configuration service configuration.
            foreach (var resource in xmlDataResources)
            {
                var name = resource.GetAttributeValue <string>("name");
                try
                {
                    var xmlConfigData = executionContext.XmlConfigurationResources.Get(name, false);
                    config.AddConfiguration(xmlConfigData);
                }
                catch (Exception ex)
                {
                    executionContext.Trace(Core.eSeverityLevel.Error, "Error processing entity file {0} - {1}", name, ex.Message);
                }
            }

            if (!disableCache && executionContext.Cache != null && settings.CacheTimeout != null)
            {
                executionContext.Cache.Add <IServiceConfiguration>(CACHE_KEY, config, settings.CacheTimeout.Value);
            }

            return(config);
        }
Exemple #3
0
        /// <summary>
        /// Builder to enhance the passed in search filter by simulating a union with the results of additional
        /// queries defined in the builder.
        /// </summary>
        /// <param name="executionContext"></param>
        /// <param name="sourceQueryExpression">The source query</param>
        /// <param name="useElevatedAccess">Will execute the additional defined queries as system user.</param>
        public QuickFindQueryBuilder(ICDSExecutionContext executionContext, QueryExpression sourceQueryExpression, bool useElevatedAccess = false)
        {
            this.executionContext     = executionContext ?? throw new ArgumentNullException(nameof(executionContext));
            this.sourceQueryExpresion = sourceQueryExpression ?? throw new ArgumentNullException(nameof(sourceQueryExpression));

            this.targetEntityLogicalName = new TEntity().LogicalName;
            this.targetEntityIdField     = this.targetEntityLogicalName + "id";

            this.linkedEntities   = new List <IQuickFindLinkedEntity>();
            this.searchSignatures = new List <ISearchQuerySignature>();

            this.useElevatedAccess = useElevatedAccess;
            this.searchInFilter    = false;
        }
        /// <summary>
        /// Supports the Aliased Search Pattern. Examines query supplied in the plugin context query input.
        /// If query runs against an entity of type <typeparamref name="TParent"/> the generator will
        /// modify the query to include any matching records found in the related alias table
        /// defined by <typeparamref name="TAlias"/>.
        /// </summary>
        public AliasedSearchQueryBuilder(ICDSExecutionContext executionContext)
        {
            ExecutionContext = executionContext;

            TParent parent = new TParent();

            parentEntityName      = parent.LogicalName;
            parentIdAttributeName = parent.LogicalName + "id";

            TAlias alias = new TAlias();

            aliasEntityName = alias.LogicalName;

            linkingAttributeName = parentIdAttributeName;
        }
Exemple #5
0
            public Guid[] GetLinkedIds(ICDSExecutionContext executionContext, string searchTerm, bool useElevatedAccess)
            {
                var processName = $"{nameof(QuickFindQueryExpressionBuilder<TTarget>)}.{nameof(GetLinkedIds)}";

                executionContext.Trace($"Entered {processName}");

                var qry = QueryExpressionBuilder
                          .WithSearchValue(searchTerm)
                          .Build();

                // execute the query and return a list of target ids found.
                var orgService = useElevatedAccess ? executionContext.ElevatedOrganizationService : executionContext.OrganizationService;
                var ids        = orgService.RetrieveMultiple(qry).Entities.Select(e => e.Id).ToArray();

                executionContext.Trace($"Exiting {processName} - Returning {ids.Length} record ids.");
                return(ids);
            }
        private void workingWithSerialization(ICDSExecutionContext executionContext, Entity target)
        {
            //Get upto 50 account records.
            var records = executionContext.OrganizationService.Query <Account>().SelectAll().With.RecordLimit(50).RetrieveAll();

            Model.Registrations registrations = new Model.Registrations();

            foreach (var record in records)
            {
                registrations.Add(new Model.RegistrationData {
                    Id = record.Id, CreatedOn = record.CreatedOn.Value
                });
            }

            var serializer = Container.Resolve <IJSONContractSerializer>();

            var serializedData = registrations.ToString(serializer);
        }
Exemple #7
0
            public Guid[] GetLinkedIds(ICDSExecutionContext executionContext, string searchTerm, bool useElevatedAccess)
            {
                var processName = $"{nameof(QuickFindParentEntity<TTarget, TParent>)}.{nameof(GetLinkedIds)}";

                executionContext.Trace($"Entered {processName}");

                if (linkingAttribute.Length == 0 || searchFields.Count == 0)
                {
                    executionContext.Trace($"Exiting {processName} - No search fields or linking attribute.");
                    return(Array.Empty <Guid>());
                }

                var targetLogicalName = new TTarget().LogicalName;
                var targetIdField     = targetLogicalName + "id";
                var parentLogicalName = new TParent().LogicalName;
                var parentIdField     = parentLogicalName + "id";

                // create a query that returns ids for the target entity that are joined to
                // the parent entity via the identified linking attribute where the parent entity
                // matches any of the search fields.
                var qry = new QueryExpression
                {
                    EntityName   = targetLogicalName,
                    ColumnSet    = new ColumnSet(targetIdField),
                    Distinct     = true,
                    NoLock       = true,
                    TopCount     = topCount,
                    LinkEntities =
                    {
                        new LinkEntity
                        {
                            JoinOperator          = JoinOperator.Inner,
                            LinkFromEntityName    = targetLogicalName,
                            LinkFromAttributeName = linkingAttribute,
                            LinkToEntityName      = parentLogicalName,
                            LinkToAttributeName   = parentIdField,
                            LinkCriteria          = new FilterExpression
                            {
                                FilterOperator = LogicalOperator.And,
                                Conditions     = {         },
                                Filters        =
                                {
                                    new FilterExpression
                                    {
                                        FilterOperator = LogicalOperator.Or,
                                        Conditions     = { }
                                    }
                                }
                            }
                        }
                    }
                };

                // unless inactive parents are excluded then add a condition to the linked entity criteria to only
                // join active records.
                if (!includeInactiveRecords)
                {
                    executionContext.Trace($"{processName}: Filtering on active records.");
                    qry.LinkEntities[0].LinkCriteria.Conditions.Add(new ConditionExpression("statecode", ConditionOperator.Equal, 0));
                }

                // add one condition for each search field to the linked entity search filter.
                foreach (var field in searchFields)
                {
                    qry.LinkEntities[0].LinkCriteria.Filters[0].Conditions.Add(new ConditionExpression(field, ConditionOperator.Like, searchTerm + "%"));
                }

                // execute the query and return a list of target ids found.
                var orgService = useElevatedAccess ? executionContext.ElevatedOrganizationService : executionContext.OrganizationService;
                var ids        = orgService.RetrieveMultiple(qry).Entities.Select(e => e.Id).ToArray();

                executionContext.Trace($"Exiting {processName} - Returning {ids.Length} record ids.");
                return(ids);
            }