func (self *Node) SetExpression(expr setop.SetExpression, items *[]setop.SetOpResult) (err error) { if expr.Dest != nil { if expr.Op.Merge == setop.Append { err = fmt.Errorf("When storing results of Set expressions the Append merge function is not allowed") return } successor := self.node.GetSuccessorFor(expr.Dest) if successor.Addr != self.node.GetAddr() { return successor.Call("DHash.SetExpression", expr, items) } } data := common.Item{ Key: expr.Dest, } err = expr.Each(func(b []byte) setop.Skipper { succ := self.node.GetSuccessorFor(b) result := &treeSkipper{ remote: succ, key: b, } if succ.Addr == self.node.GetAddr() { result.tree = self.tree } return result }, func(res *setop.SetOpResult) { if expr.Dest == nil { *items = append(*items, *res) } else { data.SubKey = res.Key data.Value = res.Values[0] data.TTL = self.node.Redundancy() data.Timestamp = self.timer.ContinuousTime() self.subPut(data) } }) return }