public void RegisterMissingIncludes(IEnumerable <RavenJObject> results, ICollection <string> includes) { if (includes == null || includes.Any() == false) { return; } foreach (var result in results) { foreach (var include in includes) { IncludesUtil.Include(result, include, id => { if (id == null) { return; } if (IsLoaded(id) == false) { RegisterMissing(id); } }); } } }
public async Task include_with_suffix() { using (var store = GetDocumentStore()) { var order = RavenJObject.FromObject(new Order() { CustomerId = "1", Number = "abc" }); using (var session = store.OpenAsyncSession()) { await session.StoreAsync(order, "orders/1"); await session.SaveChangesAsync(); } var ids = new HashSet <string>(StringComparer.OrdinalIgnoreCase); IncludesUtil.Include(order, "CustomerId[{0}/customer]", CustomerId => { if (CustomerId == null) { return(false); } ids.Add(CustomerId); return(true); }); Assert.Equal(new[] { "1/customer", "1" }, ids); } }
public void Execute(RavenJObject document) { if (Includes == null) { return; } foreach (var include in Includes) { IncludesUtil.Include(document, include, LoadId); } }
public void include_with_suffix() { using (var context = JsonOperationContext.ShortTermSingleUse()) { var json = DocumentConventions.Default.Serialization.DefaultConverter.ToBlittable(new Order { CustomerId = "1", Number = "abc" }, context); var ids = new HashSet <string>(StringComparer.OrdinalIgnoreCase); IncludesUtil.Include(json, "CustomerId[{0}/customer]", customerId => { if (customerId == null) { return; } ids.Add(customerId); }); Assert.Equal(new[] { "1/customer", "1" }, ids); } }
public void include_with_prefix() { using (var context = JsonOperationContext.ShortTermSingleUse()) { var json = EntityToBlittable.ConvertCommandToBlittable(new Order { CustomerId = "1", Number = "abc" }, context); var ids = new HashSet <string>(StringComparer.OrdinalIgnoreCase); IncludesUtil.Include(json, "CustomerId(customer/)", customerId => { if (customerId == null) { return; } ids.Add(customerId); }); Assert.Equal(new[] { "customer/1", "1" }, ids); } }
IIncludeBuilder <T> IDocumentIncludeBuilder <T, IIncludeBuilder <T> > .IncludeDocuments <TInclude>(Expression <Func <T, IEnumerable <string> > > path) { IncludeDocuments(IncludesUtil.GetPrefixedIncludePath <TInclude>(path.ToPropertyPath(), _conventions)); return(this); }
internal static SubscriptionCreationOptions CreateSubscriptionOptionsFromGeneric <T>( DocumentConventions conventions, SubscriptionCreationOptions criteria, Expression <Func <T, bool> > predicate, Expression <Func <T, object> > project, Action <ISubscriptionIncludeBuilder <T> > includes) { criteria ??= new SubscriptionCreationOptions(); var collectionName = conventions.GetCollectionName(typeof(T)); if (criteria.Query == null) { var tType = typeof(T); var includeRevisions = tType.IsConstructedGenericType && tType.GetGenericTypeDefinition() == typeof(Revision <>); if (includeRevisions) { collectionName = conventions.GetCollectionName(tType.GenericTypeArguments[0]); } var builder = new StringBuilder("from '"); StringExtensions.EscapeString(builder, collectionName); builder.Append('\''); if (includeRevisions) { builder.Append(" (Revisions = true)"); } criteria.Query = builder.Append(" as doc").ToString(); } if (predicate != null) { var script = predicate.CompileToJavascript( new JavascriptCompilationOptions( JsCompilationFlags.BodyOnly, JavascriptConversionExtensions.MathSupport.Instance, new JavascriptConversionExtensions.DictionarySupport(), JavascriptConversionExtensions.LinqMethodsSupport.Instance, new JavascriptConversionExtensions.SubscriptionsWrappedConstantSupport(conventions), new JavascriptConversionExtensions.ConstSupport(conventions), new JavascriptConversionExtensions.ReplaceParameterWithNewName(predicate.Parameters[0], "this"), JavascriptConversionExtensions.ToStringSupport.Instance, JavascriptConversionExtensions.DateTimeSupport.Instance, JavascriptConversionExtensions.InvokeSupport.Instance, JavascriptConversionExtensions.NullCoalescingSupport.Instance, JavascriptConversionExtensions.NestedConditionalSupport.Instance, JavascriptConversionExtensions.StringSupport.Instance )); criteria.Query = $"declare function predicate() {{ return {script} }}{Environment.NewLine}" + $"{criteria.Query}{Environment.NewLine}" + "where predicate.call(doc)"; } if (project != null) { var script = project.CompileToJavascript( new JavascriptCompilationOptions( JsCompilationFlags.BodyOnly, JavascriptConversionExtensions.MathSupport.Instance, new JavascriptConversionExtensions.DictionarySupport(), JavascriptConversionExtensions.LinqMethodsSupport.Instance, new JavascriptConversionExtensions.ConstSupport(conventions), JavascriptConversionExtensions.ToStringSupport.Instance, JavascriptConversionExtensions.DateTimeSupport.Instance, JavascriptConversionExtensions.InvokeSupport.Instance, JavascriptConversionExtensions.NullCoalescingSupport.Instance, JavascriptConversionExtensions.StringSupport.Instance, JavascriptConversionExtensions.NestedConditionalSupport.Instance, new JavascriptConversionExtensions.ReplaceParameterWithNewName(project.Parameters[0], "doc"), JavascriptConversionExtensions.CounterSupport.Instance, JavascriptConversionExtensions.CompareExchangeSupport.Instance )); criteria.Query += Environment.NewLine + "select " + script; } if (includes != null) { var builder = new IncludeBuilder <T>(conventions); includes(builder); var numberOfIncludesAdded = 0; if (builder.DocumentsToInclude?.Count > 0) { criteria.Query += Environment.NewLine + "include "; foreach (var inc in builder.DocumentsToInclude) { var include = "doc." + inc; if (numberOfIncludesAdded > 0) { criteria.Query += ","; } if (IncludesUtil.RequiresQuotes(include, out var escapedInclude)) { criteria.Query += $"'{escapedInclude}'"; } else { criteria.Query += include; } numberOfIncludesAdded++; } } if (builder.AllCounters) { if (numberOfIncludesAdded == 0) { criteria.Query += Environment.NewLine + "include "; } criteria.Query += $"counters()"; numberOfIncludesAdded++; } else if (builder.CountersToInclude?.Count > 0) { if (numberOfIncludesAdded == 0) { criteria.Query += Environment.NewLine + "include "; } foreach (var counterName in builder.CountersToInclude) { if (numberOfIncludesAdded > 0) { criteria.Query += ","; } if (IncludesUtil.RequiresQuotes(counterName, out var escapedCounterName)) { criteria.Query += $"counters({escapedCounterName})"; } else { criteria.Query += $"counters({counterName})"; } numberOfIncludesAdded++; } } } return(criteria); }
internal static SubscriptionCreationOptions CreateSubscriptionOptionsFromGeneric <T>( DocumentConventions conventions, SubscriptionCreationOptions criteria, Expression <Func <T, bool> > predicate, Expression <Func <T, object> > project, Action <ISubscriptionIncludeBuilder <T> > includes) { criteria ??= new SubscriptionCreationOptions(); var collectionName = conventions.GetCollectionName(typeof(T)); StringBuilder queryBuilder; if (criteria.Query != null) { queryBuilder = new StringBuilder(criteria.Query); } else { queryBuilder = new StringBuilder(); var tType = typeof(T); var includeRevisions = tType.IsConstructedGenericType && tType.GetGenericTypeDefinition() == typeof(Revision <>); if (includeRevisions) { collectionName = conventions.GetCollectionName(tType.GenericTypeArguments[0]); } queryBuilder.Append("from '"); StringExtensions.EscapeString(queryBuilder, collectionName); queryBuilder.Append('\''); if (includeRevisions) { queryBuilder.Append(" (Revisions = true)"); } criteria.Query = queryBuilder.Append(" as doc").ToString(); } if (predicate != null) { var script = predicate.CompileToJavascript( new JavascriptCompilationOptions( JsCompilationFlags.BodyOnly, JavascriptConversionExtensions.MathSupport.Instance, new JavascriptConversionExtensions.DictionarySupport(), JavascriptConversionExtensions.LinqMethodsSupport.Instance, new JavascriptConversionExtensions.SubscriptionsWrappedConstantSupport(conventions), new JavascriptConversionExtensions.ConstSupport(conventions), new JavascriptConversionExtensions.ReplaceParameterWithNewName(predicate.Parameters[0], "this"), JavascriptConversionExtensions.ToStringSupport.Instance, JavascriptConversionExtensions.DateTimeSupport.Instance, JavascriptConversionExtensions.TimeSpanSupport.Instance, JavascriptConversionExtensions.InvokeSupport.Instance, JavascriptConversionExtensions.NullCoalescingSupport.Instance, JavascriptConversionExtensions.NestedConditionalSupport.Instance, JavascriptConversionExtensions.StringSupport.Instance, new JavascriptConversionExtensions.IdentityPropertySupport(conventions) )); queryBuilder .Insert(0, $"declare function predicate() {{ return {script} }}{Environment.NewLine}") .AppendLine() .Append("where predicate.call(doc)"); } if (project != null) { var script = project.CompileToJavascript( new JavascriptCompilationOptions( JsCompilationFlags.BodyOnly, JavascriptConversionExtensions.MathSupport.Instance, new JavascriptConversionExtensions.DictionarySupport(), JavascriptConversionExtensions.LinqMethodsSupport.Instance, new JavascriptConversionExtensions.ConstSupport(conventions), JavascriptConversionExtensions.ToStringSupport.Instance, JavascriptConversionExtensions.DateTimeSupport.Instance, JavascriptConversionExtensions.TimeSpanSupport.Instance, JavascriptConversionExtensions.InvokeSupport.Instance, JavascriptConversionExtensions.NullCoalescingSupport.Instance, JavascriptConversionExtensions.StringSupport.Instance, JavascriptConversionExtensions.NestedConditionalSupport.Instance, new JavascriptConversionExtensions.ReplaceParameterWithNewName(project.Parameters[0], "doc"), new JavascriptConversionExtensions.IdentityPropertySupport(conventions), JavascriptConversionExtensions.CounterSupport.Instance, JavascriptConversionExtensions.CompareExchangeSupport.Instance, new JavascriptConversionExtensions.LoadSupport(), JavascriptConversionExtensions.MemberInit.Instance )); queryBuilder .AppendLine() .Append("select ") .Append(script); } if (includes != null) { var builder = new IncludeBuilder <T>(conventions); includes(builder); var numberOfIncludesAdded = 0; if (builder.DocumentsToInclude?.Count > 0) { queryBuilder .AppendLine() .Append("include "); foreach (var inc in builder.DocumentsToInclude) { var include = "doc." + inc; if (numberOfIncludesAdded > 0) { queryBuilder.Append(","); } if (IncludesUtil.RequiresQuotes(include, out var escapedInclude)) { queryBuilder .Append("'") .Append(escapedInclude) .Append("'"); } else { queryBuilder.Append(QueryToken.IsKeyword(include) ? $"'{include}'" : include); } numberOfIncludesAdded++; } } if (builder.AllCounters) { if (numberOfIncludesAdded == 0) { queryBuilder .AppendLine() .Append("include "); } var token = CounterIncludesToken.All(string.Empty); token.WriteTo(queryBuilder); numberOfIncludesAdded++; } else if (builder.CountersToInclude?.Count > 0) { if (numberOfIncludesAdded == 0) { queryBuilder .AppendLine() .Append("include "); } foreach (var counterName in builder.CountersToInclude) { if (numberOfIncludesAdded > 0) { queryBuilder.Append(","); } var token = CounterIncludesToken.Create(string.Empty, counterName); token.WriteTo(queryBuilder); numberOfIncludesAdded++; } } if (builder.TimeSeriesToInclude != null) { foreach (var timeSeriesRange in builder.TimeSeriesToInclude) { if (numberOfIncludesAdded == 0) { queryBuilder .AppendLine() .Append("include "); } if (numberOfIncludesAdded > 0) { queryBuilder.Append(","); } var token = TimeSeriesIncludesToken.Create(string.Empty, timeSeriesRange); token.WriteTo(queryBuilder); numberOfIncludesAdded++; } } } criteria.Query = queryBuilder.ToString(); return(criteria); }
/// <summary> /// Includes the specified path. /// </summary> /// <param name="path">The path.</param> public AsyncMultiLoaderWithInclude <T> Include <TInclude>(Expression <Func <T, IEnumerable <string> > > path) { return(Include(IncludesUtil.GetPrefixedIncludePath <TInclude>(path.ToPropertyPath(), _session.Conventions))); }
private SubscriptionCreationOptions EnsureCriteria <T>( SubscriptionCreationOptions criteria, Expression <Func <T, bool> > predicate, Expression <Func <T, object> > project, Action <ISubscriptionIncludeBuilder <T> > includes) { criteria = criteria ?? new SubscriptionCreationOptions(); var collectionName = _store.Conventions.GetCollectionName(typeof(T)); if (criteria.Query == null) { var tType = typeof(T); var includeRevisions = tType.IsConstructedGenericType && tType.GetGenericTypeDefinition() == typeof(Revision <>); if (includeRevisions) { collectionName = _store.Conventions.GetCollectionName(tType.GenericTypeArguments[0]); } if (includeRevisions) { criteria.Query = "from " + collectionName + " (Revisions = true)"; } else { criteria.Query = "from " + collectionName; } criteria.Query += " as doc"; } if (predicate != null) { var script = predicate.CompileToJavascript( new JavascriptCompilationOptions( JsCompilationFlags.BodyOnly, JavascriptConversionExtensions.MathSupport.Instance, new JavascriptConversionExtensions.DictionarySupport(), JavascriptConversionExtensions.LinqMethodsSupport.Instance, new JavascriptConversionExtensions.SubscriptionsWrappedConstantSupport(_store.Conventions), new JavascriptConversionExtensions.ConstSupport(_store.Conventions), new JavascriptConversionExtensions.ReplaceParameterWithNewName(predicate.Parameters[0], "this"), JavascriptConversionExtensions.ToStringSupport.Instance, JavascriptConversionExtensions.DateTimeSupport.Instance, JavascriptConversionExtensions.InvokeSupport.Instance, JavascriptConversionExtensions.NullCoalescingSupport.Instance, JavascriptConversionExtensions.NestedConditionalSupport.Instance, JavascriptConversionExtensions.StringSupport.Instance )); criteria.Query = $"declare function predicate() {{ return {script} }}{Environment.NewLine}" + $"{criteria.Query}{Environment.NewLine}" + "where predicate.call(doc)"; } if (project != null) { var script = project.CompileToJavascript( new JavascriptCompilationOptions( JsCompilationFlags.BodyOnly, JavascriptConversionExtensions.MathSupport.Instance, new JavascriptConversionExtensions.DictionarySupport(), JavascriptConversionExtensions.LinqMethodsSupport.Instance, new JavascriptConversionExtensions.ConstSupport(_store.Conventions), JavascriptConversionExtensions.ToStringSupport.Instance, JavascriptConversionExtensions.DateTimeSupport.Instance, JavascriptConversionExtensions.InvokeSupport.Instance, JavascriptConversionExtensions.NullCoalescingSupport.Instance, JavascriptConversionExtensions.StringSupport.Instance, JavascriptConversionExtensions.NestedConditionalSupport.Instance, new JavascriptConversionExtensions.ReplaceParameterWithNewName(project.Parameters[0], "doc"), JavascriptConversionExtensions.CounterSupport.Instance, JavascriptConversionExtensions.CompareExchangeSupport.Instance )); criteria.Query += Environment.NewLine + "select " + script; } if (includes != null) { var builder = new IncludeBuilder <T>(_store.Conventions); includes(builder); if (builder.DocumentsToInclude != null && builder.DocumentsToInclude.Count > 0) { criteria.Query += Environment.NewLine + "include "; var first = true; foreach (var inc in builder.DocumentsToInclude) { var include = "doc." + inc; if (first == false) { criteria.Query += ","; } first = false; if (IncludesUtil.RequiresQuotes(include, out var escapedInclude)) { criteria.Query += $"'{escapedInclude}'"; } else { criteria.Query += include; } } } } return(criteria); }