public static CompiledQueryPlan BuildPlan <TDoc, TOut>(QuerySession session, ICompiledQuery <TDoc, TOut> query, StoreOptions storeOptions) { eliminateStringNulls(query); var plan = new CompiledQueryPlan(query.GetType(), typeof(TOut)); plan.FindMembers(); assertValidityOfQueryType(plan, query.GetType()); // This *could* throw var queryTemplate = plan.CreateQueryTemplate(query); var statistics = plan.GetStatisticsIfAny(query); var builder = BuildDatabaseCommand(session, queryTemplate, statistics, out var command); plan.IncludePlans.AddRange(new List <IIncludePlan>()); var handler = builder.BuildHandler <TOut>(); if (handler is IIncludeQueryHandler <TOut> i) { handler = i.Inner; } plan.HandlerPrototype = handler; plan.ReadCommand(command, storeOptions); return(plan); }
public CompiledQuerySourceBuilder(CompiledQueryPlan plan, StoreOptions storeOptions, DocumentTracking documentTracking) { _plan = plan; _storeOptions = storeOptions; _documentTracking = documentTracking; _typeName = documentTracking + plan.QueryType.ToSuffixedTypeName("CompiledQuerySource"); }
public CompiledQueryCodeFile(Type compiledQueryType, DocumentStore store, CompiledQueryPlan plan, DocumentTracking documentTracking) { _plan = plan ?? throw new ArgumentNullException(nameof(plan)); _compiledQueryType = compiledQueryType; _store = store; _typeName = documentTracking + compiledQueryType.ToSuffixedTypeName("CompiledQuerySource"); _documentTracking = documentTracking; }
public HardCodedParameters(CompiledQueryPlan plan) { for (int i = 0; i < plan.Command.Parameters.Count; i++) { if (plan.Parameters.All(x => x.ParameterIndex != i)) { Record(i, plan.Command.Parameters[i]); } } }
private static void assertValidityOfQueryType(CompiledQueryPlan plan, Type type) { if (plan.InvalidMembers.Any()) { var members = plan.InvalidMembers.Select(x => $"{x.GetRawMemberType().NameInCode()} {x.Name}") .Join(", "); var message = $"Members {members} cannot be used as parameters to a compiled query"; throw new InvalidCompiledQueryException(message); } }
public bool AreValuesUnique(object query, CompiledQueryPlan plan) { var members = findMembers(plan); if (!members.Any()) { return(true); } return(members.Select(x => x.GetValue(query)) .Distinct().Count() == members.Length); }
public HardCodedParameters(CompiledQueryPlan plan) { var parameters = plan.Command.Parameters; HasTenantId = parameters.Any(x => x.ParameterName == TenantIdArgument.ArgName); if (HasTenantId) { parameters.RemoveAll(x => x.ParameterName == TenantIdArgument.ArgName); } for (int i = 0; i < parameters.Count; i++) { if (plan.Parameters.All(x => !x.ParameterIndexes.Contains(i))) { Record(i, parameters[i]); } } }
public bool AreValuesUnique(object query, CompiledQueryPlan plan) { var groups = plan.Parameters.Where(x => x.Type.IsEnum) .GroupBy(x => x.Type).Where(x => x.Count() > 1).ToArray(); if (!groups.Any()) { return(true); } foreach (var grouping in groups) { var distinctValueCount = grouping.Select(x => x.GetValueAsObject(query)).Distinct().Count(); if (distinctValueCount != grouping.Count()) { return(false); } } return(true); }
public CompiledQuerySourceBuilder(CompiledQueryPlan plan, StoreOptions storeOptions) { _plan = plan; _storeOptions = storeOptions; _typeName = _plan.QueryType.Name + "CompiledQuerySource"; }
private static IQueryMember <T>[] findMembers(CompiledQueryPlan plan) { return(plan.Parameters.OfType <IQueryMember <T> >().ToArray()); }
public CompiledQuerySourceBuilder(CompiledQueryPlan plan, StoreOptions storeOptions) { _plan = plan; _storeOptions = storeOptions; }