public object Encode() { List <object> additionQueue = AdditionQueue.Select(id => PointerOrLocalIdEncoder.Instance.Encode(ParseObject.CreateWithoutData(TargetClassName, id))).ToList(); List <object> removalQueue = RemovalQueue.Select(id => PointerOrLocalIdEncoder.Instance.Encode(ParseObject.CreateWithoutData(TargetClassName, id))).ToList(); Dictionary <string, object> additionOperation = additionQueue.Count == 0 ? null : new Dictionary <string, object> { ["__op"] = "AddRelation", ["objects"] = additionQueue }; Dictionary <string, object> removalOperation = removalQueue.Count == 0 ? null : new Dictionary <string, object> { ["__op"] = "RemoveRelation", ["objects"] = removalQueue }; return(additionOperation != null && removalOperation != null ? new Dictionary <string, object> { ["__op"] = "Batch", ["ops"] = new[] { additionOperation, removalOperation } } : additionOperation ?? removalOperation); }
public IParseFieldOperation MergeWithPrevious(IParseFieldOperation previous) { switch (previous) { case null: return(this); case ParseDeleteOperation _: throw new InvalidOperationException("You can't modify a relation after deleting it."); case ParseRelationOperation other: if (other.TargetClassName != TargetClassName) { throw new InvalidOperationException(String.Format("Related object must be of class {0}, but {1} was passed in.", other.TargetClassName, TargetClassName)); } return(new ParseRelationOperation(AdditionQueue.Union(other.AdditionQueue.Except(RemovalQueue)).ToList(), RemovalQueue.Union(other.RemovalQueue.Except(AdditionQueue)).ToList(), TargetClassName)); default: throw new InvalidOperationException("Operation is invalid after previous operation."); } }