Beispiel #1
0
func (self *TX) setOp(expr *setop.SetExpression) (result []kv) {
	if err := expr.Each(self.skipper, func(res *setop.SetOpResult) {
		result = append(result, kv{
			Keys:  [][]byte{res.Key},
			Value: res.Values[0],
		})
	}); err != nil {
		panic(err)
	}
	return
}
Beispiel #2
0
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.GetBroadcastAddr() {
			return successor.Call("DHash.SetExpression", expr, items)
		}
	}
	data := common.Item{
		Key: expr.Dest,
	}
	err = expr.Each(func(b []byte) (result setop.Skipper, err error) {
		succ := self.node.GetSuccessorFor(b)
		res := &treeSkipper{
			remote: succ,
			key:    b,
		}
		if succ.Addr == self.node.GetBroadcastAddr() {
			res.tree = self.tree
		}
		result = res
		return
	}, 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
}