private static PatchRequest CreatePatchRequest <T>(Expression <Func <JavaScriptArray <T>, object> > arrayAdder, string pathScript, string adderScript, JavascriptConversionExtensions.CustomMethods extension) { var script = $"this.{pathScript}{adderScript}"; if (arrayAdder.Body is MethodCallExpression mce && mce.Method.Name == nameof(JavaScriptArray <T> .RemoveAll)) { script = $"this.{pathScript} = {script}"; } return(new PatchRequest { Script = script, Values = extension.Parameters }); }
public void Patch <T, U>(string id, Expression <Func <T, IEnumerable <U> > > path, Expression <Func <JavaScriptArray <U>, object> > arrayAdder) { var extension = new JavascriptConversionExtensions.CustomMethods { Suffix = _customCount++ }; var pathScript = path.CompileToJavascript(_javascriptCompilationOptions); var adderScript = arrayAdder.CompileToJavascript( new JavascriptCompilationOptions( JsCompilationFlags.BodyOnly | JsCompilationFlags.ScopeParameter, new LinqMethods(), extension)); var patchRequest = CreatePatchRequest(arrayAdder, pathScript, adderScript, extension); if (TryMergePatches(id, patchRequest) == false) { Defer(new PatchCommandData(id, null, patchRequest, null)); } }
public void AddOrPatch <T, TU>(string id, T entity, Expression <Func <T, List <TU> > > path, Expression <Func <JavaScriptArray <TU>, object> > arrayAdder) { var extension = new JavascriptConversionExtensions.CustomMethods { Suffix = _customCount++ }; var pathScript = path.CompileToJavascript(_javascriptCompilationOptions); var adderScript = arrayAdder.CompileToJavascript( new JavascriptCompilationOptions( JsCompilationFlags.BodyOnly | JsCompilationFlags.ScopeParameter, new LinqMethods(), extension, JavascriptConversionExtensions.ToStringSupport.Instance, JavascriptConversionExtensions.ConstantSupport.Instance) ); var patchRequest = CreatePatchRequest(arrayAdder, pathScript, adderScript, extension); string collectionName = _requestExecutor.Conventions.GetCollectionName(entity); string clrType = _requestExecutor.Conventions.GetClrTypeName(entity); var newInstance = JsonConverter.ToBlittable(entity, new DocumentInfo { Id = id, Collection = collectionName, MetadataInstance = new MetadataAsDictionary { [Constants.Documents.Metadata.Collection] = collectionName, [Constants.Documents.Metadata.RavenClrType] = clrType } }); _valsCount++; Defer(new PatchCommandData(id, null, patchRequest) { CreateIfMissing = newInstance }); }