chore: 实现 operation
parent
e4381667c8
commit
8132a465ba
|
@ -17,7 +17,7 @@ namespace LeanCloud.Storage.Internal.Codec {
|
|||
return EncodeDictionary(dict);
|
||||
} else if (obj is LCObject lcObj) {
|
||||
return EncodeLCObject(lcObj);
|
||||
} else if (obj is LCOperation op) {
|
||||
} else if (obj is ILCOperation op) {
|
||||
return EncodeOperation(op);
|
||||
} else if (obj is ILCQueryCondition cond) {
|
||||
return EncodeQueryCondition(cond);
|
||||
|
@ -74,7 +74,7 @@ namespace LeanCloud.Storage.Internal.Codec {
|
|||
};
|
||||
}
|
||||
|
||||
static object EncodeOperation(LCOperation operation) {
|
||||
static object EncodeOperation(ILCOperation operation) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace LeanCloud.Storage.Internal.Operation {
|
||||
internal interface ILCOperation {
|
||||
ILCOperation MergeWithPrevious(ILCOperation previousOp);
|
||||
|
||||
Dictionary<string, object> Encode();
|
||||
|
||||
object Apply(object oldValue, string key);
|
||||
|
||||
IEnumerable GetNewObjectList();
|
||||
}
|
||||
}
|
|
@ -1,7 +1,49 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using LeanCloud.Storage.Internal.Codec;
|
||||
|
||||
namespace LeanCloud.Storage.Internal.Operation {
|
||||
public class LCAddOperation {
|
||||
public LCAddOperation() {
|
||||
internal class LCAddOperation : ILCOperation {
|
||||
internal List<object> valueList;
|
||||
|
||||
internal LCAddOperation(IEnumerable<object> values) {
|
||||
valueList = new List<object>(values);
|
||||
}
|
||||
|
||||
ILCOperation ILCOperation.MergeWithPrevious(ILCOperation previousOp) {
|
||||
if (previousOp is LCSetOperation || previousOp is LCDeleteOperation) {
|
||||
return previousOp;
|
||||
}
|
||||
if (previousOp is LCAddOperation addOp) {
|
||||
valueList.AddRange(addOp.valueList);
|
||||
return this;
|
||||
}
|
||||
if (previousOp is LCAddUniqueOperation addUniqueOp) {
|
||||
valueList.AddRange(addUniqueOp.values);
|
||||
return this;
|
||||
}
|
||||
throw new ArgumentException("Operation is invalid after previous operation.");
|
||||
}
|
||||
|
||||
Dictionary<string, object> ILCOperation.Encode() {
|
||||
return new Dictionary<string, object> {
|
||||
{ "op", "Add" },
|
||||
{ "objects", LCEncoder.Encode(valueList) }
|
||||
};
|
||||
}
|
||||
|
||||
object ILCOperation.Apply(object oldValue, string key) {
|
||||
List<object> list = new List<object>();
|
||||
if (oldValue != null) {
|
||||
list.AddRange(oldValue as IEnumerable<object>);
|
||||
}
|
||||
list.AddRange(valueList);
|
||||
return list;
|
||||
}
|
||||
|
||||
IEnumerable ILCOperation.GetNewObjectList() {
|
||||
return valueList;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,43 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using LeanCloud.Storage.Internal.Codec;
|
||||
|
||||
namespace LeanCloud.Storage.Internal.Operation {
|
||||
public class LCAddRelationOperation {
|
||||
public LCAddRelationOperation() {
|
||||
internal class LCAddRelationOperation : ILCOperation {
|
||||
List<LCObject> valueList;
|
||||
|
||||
internal LCAddRelationOperation(IEnumerable<LCObject> objects) {
|
||||
valueList = new List<LCObject>(objects);
|
||||
}
|
||||
|
||||
public ILCOperation MergeWithPrevious(ILCOperation previousOp) {
|
||||
if (previousOp is LCSetOperation || previousOp is LCDeleteOperation) {
|
||||
return previousOp;
|
||||
}
|
||||
if (previousOp is LCAddRelationOperation addRelationOp) {
|
||||
valueList.AddRange(addRelationOp.valueList);
|
||||
return this;
|
||||
}
|
||||
throw new ArgumentException("Operation is invalid after previous operation.");
|
||||
}
|
||||
|
||||
public Dictionary<string, object> Encode() {
|
||||
return new Dictionary<string, object> {
|
||||
{ "__op", "AddRelation" },
|
||||
{ "objects", LCEncoder.Encode(valueList) }
|
||||
};
|
||||
}
|
||||
|
||||
public object Apply(object oldValue, string key) {
|
||||
LCRelation<LCObject> relation = new LCRelation<LCObject>();
|
||||
relation.targetClass = valueList[0].ClassName;
|
||||
return relation;
|
||||
}
|
||||
|
||||
public IEnumerable GetNewObjectList() {
|
||||
return valueList;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,46 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using LeanCloud.Storage.Internal.Codec;
|
||||
|
||||
namespace LeanCloud.Storage.Internal.Operation {
|
||||
public class LCAddUniqueOperation {
|
||||
public LCAddUniqueOperation() {
|
||||
internal class LCAddUniqueOperation : ILCOperation {
|
||||
internal HashSet<object> values;
|
||||
|
||||
internal LCAddUniqueOperation(IEnumerable<object> values) {
|
||||
this.values = new HashSet<object>(values);
|
||||
}
|
||||
|
||||
public ILCOperation MergeWithPrevious(ILCOperation previousOp) {
|
||||
if (previousOp is LCSetOperation || previousOp is LCDeleteOperation) {
|
||||
return previousOp;
|
||||
}
|
||||
if (previousOp is LCAddUniqueOperation addUniqueOp) {
|
||||
values.UnionWith(addUniqueOp.values);
|
||||
return this;
|
||||
}
|
||||
throw new ArgumentException("Operation is invalid after previous operation.");
|
||||
}
|
||||
|
||||
public Dictionary<string, object> Encode() {
|
||||
return new Dictionary<string, object> {
|
||||
{ "__op", "AddUnique" },
|
||||
{ "objects", LCEncoder.Encode(values.ToList()) }
|
||||
};
|
||||
}
|
||||
|
||||
public object Apply(object oldValue, string key) {
|
||||
HashSet<object> set = new HashSet<object>();
|
||||
if (oldValue != null) {
|
||||
set.UnionWith(oldValue as IEnumerable<object>);
|
||||
}
|
||||
set.UnionWith(values);
|
||||
return set;
|
||||
}
|
||||
|
||||
public IEnumerable GetNewObjectList() {
|
||||
return values;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,28 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace LeanCloud.Storage.Internal.Operation {
|
||||
public class LCDecrementOperation {
|
||||
public LCDecrementOperation() {
|
||||
internal class LCDecrementOperation : ILCOperation {
|
||||
|
||||
|
||||
internal LCDecrementOperation() {
|
||||
}
|
||||
|
||||
public ILCOperation MergeWithPrevious(ILCOperation previousOp) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public Dictionary<string, object> Encode() {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public object Apply(object oldValue, string key) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public IEnumerable GetNewObjectList() {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,28 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace LeanCloud.Storage.Internal.Operation {
|
||||
public class LCDeleteOperation {
|
||||
public LCDeleteOperation() {
|
||||
internal class LCDeleteOperation : ILCOperation {
|
||||
internal LCDeleteOperation() {
|
||||
}
|
||||
|
||||
public ILCOperation MergeWithPrevious(ILCOperation previousOp) {
|
||||
return this;
|
||||
}
|
||||
|
||||
public Dictionary<string, object> Encode() {
|
||||
return new Dictionary<string, object> {
|
||||
{ "__op", "Delete" }
|
||||
};
|
||||
}
|
||||
|
||||
public object Apply(object oldValue, string key) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public IEnumerable GetNewObjectList() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
using System;
|
||||
namespace LeanCloud.Storage.Internal.Operation {
|
||||
public class LCOperation {
|
||||
public LCOperation() {
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,7 +1,46 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using LeanCloud.Storage.Internal.Codec;
|
||||
|
||||
namespace LeanCloud.Storage.Internal.Operation {
|
||||
public class LCRemoveOperation {
|
||||
public LCRemoveOperation() {
|
||||
internal class LCRemoveOperation : ILCOperation {
|
||||
List<object> valueList;
|
||||
|
||||
internal LCRemoveOperation(IEnumerable values) {
|
||||
valueList = new List<object> {
|
||||
values.Cast<object>()
|
||||
};
|
||||
}
|
||||
|
||||
public ILCOperation MergeWithPrevious(ILCOperation previousOp) {
|
||||
if (previousOp is LCSetOperation || previousOp is LCDeleteOperation) {
|
||||
return previousOp;
|
||||
}
|
||||
if (previousOp is LCRemoveOperation removeOp) {
|
||||
valueList.AddRange(removeOp.valueList);
|
||||
}
|
||||
throw new ArgumentException("Operation is invalid after previous operation.");
|
||||
}
|
||||
|
||||
public Dictionary<string, object> Encode() {
|
||||
return new Dictionary<string, object> {
|
||||
{ "__op", "Remove" },
|
||||
{ "objects", LCEncoder.Encode(valueList) }
|
||||
};
|
||||
}
|
||||
|
||||
public object Apply(object oldValue, string key) {
|
||||
List<object> list = new List<object>();
|
||||
if (oldValue != null) {
|
||||
list.AddRange(oldValue as IEnumerable<object>);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public IEnumerable GetNewObjectList() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,42 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using LeanCloud.Storage.Internal.Codec;
|
||||
|
||||
namespace LeanCloud.Storage.Internal.Operation {
|
||||
public class LCRemoveRelationOperation {
|
||||
public LCRemoveRelationOperation() {
|
||||
internal class LCRemoveRelationOperation : ILCOperation {
|
||||
List<LCObject> valueList;
|
||||
|
||||
internal LCRemoveRelationOperation(LCObject obj) {
|
||||
valueList = new List<LCObject> { obj };
|
||||
}
|
||||
|
||||
public ILCOperation MergeWithPrevious(ILCOperation previousOp) {
|
||||
if (previousOp is LCSetOperation || previousOp is LCDeleteOperation) {
|
||||
return previousOp;
|
||||
}
|
||||
if (previousOp is LCRemoveRelationOperation removeRelationOp) {
|
||||
valueList.AddRange(removeRelationOp.valueList);
|
||||
return this;
|
||||
}
|
||||
throw new ArgumentException("Operation is invalid after previous operation.");
|
||||
}
|
||||
|
||||
public Dictionary<string, object> Encode() {
|
||||
return new Dictionary<string, object> {
|
||||
{ "__op", "RemoveRelation" },
|
||||
{ "objects", LCEncoder.Encode(valueList) }
|
||||
};
|
||||
}
|
||||
|
||||
public object Apply(object oldValue, string key) {
|
||||
LCRelation<LCObject> relation = new LCRelation<LCObject>();
|
||||
relation.targetClass = valueList[0].ClassName;
|
||||
return relation;
|
||||
}
|
||||
|
||||
public IEnumerable GetNewObjectList() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,33 @@
|
|||
using System;
|
||||
namespace LeanCloud.Storage.Internal {
|
||||
public class LCSetOperation {
|
||||
public LCSetOperation() {
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using LeanCloud.Storage.Internal.Codec;
|
||||
|
||||
namespace LeanCloud.Storage.Internal.Operation {
|
||||
internal class LCSetOperation : ILCOperation {
|
||||
object value;
|
||||
|
||||
internal LCSetOperation(object value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public ILCOperation MergeWithPrevious(ILCOperation previousOp) {
|
||||
return this;
|
||||
}
|
||||
|
||||
public Dictionary<string, object> Encode() {
|
||||
return LCEncoder.Encode(value) as Dictionary<string, object>;
|
||||
}
|
||||
|
||||
public object Apply(object oldValue, string key) {
|
||||
return value;
|
||||
}
|
||||
|
||||
public IEnumerable GetNewObjectList() {
|
||||
if (value is IEnumerable enumerable) {
|
||||
return enumerable;
|
||||
}
|
||||
return new List<object> { value };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ namespace LeanCloud.Storage {
|
|||
/// <summary>
|
||||
/// 操作字典
|
||||
/// </summary>
|
||||
Dictionary<string, LCOperation> operationDict;
|
||||
Dictionary<string, ILCOperation> operationDict;
|
||||
|
||||
public string ClassName {
|
||||
get {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
|
||||
namespace LeanCloud.Storage {
|
||||
public class LCRole : LCObject {
|
||||
public LCRole() {
|
||||
|
|
Loading…
Reference in New Issue