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
            });
        }
Exemplo n.º 2
0
        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
            });
        }