// SetExpression will execute the given expr. // // If expr.Dest is set it will store the result under the sub tree defined by expr.Dest. // // If expr.Dest is nil it will return the result. // // Either expr.Op or expr.Code has to be set. // // If expr.Op is nil expr.Code will be parsed using SetOpParser to provide expr.Op. func (self *Conn) SetExpression(expr setop.SetExpression) (result []setop.SetOpResult) { if expr.Op == nil { expr.Op = setop.MustParse(expr.Code) } var biggestKey []byte biggestSize := 0 var thisSize int for key, _ := range findKeys(expr.Op) { thisSize = self.SubSize([]byte(key)) if biggestKey == nil { biggestKey = []byte(key) biggestSize = thisSize } else if thisSize > biggestSize { biggestKey = []byte(key) biggestSize = thisSize } } _, _, successor := self.ring.Remotes(biggestKey) var results []setop.SetOpResult err := successor.Call("DHash.SetExpression", expr, &results) for err != nil { self.removeNode(*successor) _, _, successor = self.ring.Remotes(biggestKey) err = successor.Call("DHash.SetExpression", expr, &results) } return results }