Merge pull request #777 from cmasone-attic/depanic

Implement compoundSet.Filter()
This commit is contained in:
cmasone-attic
2015-12-16 12:32:43 -08:00
2 changed files with 36 additions and 1 deletions

View File

@@ -113,7 +113,16 @@ func (cs compoundSet) Subtract(others ...Set) Set {
}
func (cs compoundSet) Filter(cb setFilterCallback) Set {
panic("not implemented")
seq := newEmptySequenceChunker(makeSetLeafChunkFn(cs.t, cs.cs), newSetMetaSequenceChunkFn(cs.t, cs.cs), newSetLeafBoundaryChecker(), newOrderedMetaSequenceBoundaryChecker)
cs.IterAll(func(v Value) {
if cb(v) {
seq.Append(v)
}
})
s := seq.Done()
return internalValueFromType(s, s.Type()).(Set)
}
func (cs compoundSet) findLeaf(key Value) (*sequenceCursor, setLeaf, int) {

View File

@@ -255,3 +255,29 @@ func TestCompoundSetRemoveNonexistentValue(t *testing.T) {
assert.Equal(original.Len(), actual.Len())
assert.True(original.Equals(actual))
}
func TestCompoundSetFilter(t *testing.T) {
assert := assert.New(t)
doTest := func(ts testSet) {
set := ts.toCompoundSet(chunks.NewMemoryStore())
sort.Sort(ts)
pivotPoint := 10
pivot := ts.values[pivotPoint]
actual := set.Filter(func(v Value) bool {
return ts.less(v, pivot)
})
assert.True(newTypedSet(set.cs, set.t, ts.values[:pivotPoint+1]...).Equals(actual))
idx := 0
actual.IterAll(func(v Value) {
assert.True(ts.values[idx].Equals(v), "%v != %v", v, ts.values[idx])
idx++
})
}
doTest(getTestNativeOrderSet())
doTest(getTestRefValueOrderSet())
doTest(getTestRefToNativeOrderSet())
doTest(getTestRefToValueOrderSet())
}