csharp-sdk-upm/Storage/Internal/Operation/LCAddUniqueOperation.cs

47 lines
1.5 KiB
C#
Raw Normal View History

2020-02-19 18:50:51 +08:00
using System;
2020-02-20 12:44:33 +08:00
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using LeanCloud.Storage.Internal.Codec;
2020-02-19 18:50:51 +08:00
namespace LeanCloud.Storage.Internal.Operation {
2020-02-20 12:44:33 +08:00
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 object Encode() {
2020-02-20 12:44:33 +08:00
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.ToList();
2020-02-20 12:44:33 +08:00
}
public IEnumerable GetNewObjectList() {
return values;
2020-02-19 18:50:51 +08:00
}
}
}