package io.jeo.filter;
import io.jeo.util.Pair;
import io.jeo.filter.cql.CQL;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class FilterSplitterTest {
@Test
public void testFlat() throws Exception {
Filter f = CQL.parse("foo = TRUE AND x = TRUE");
Pair<Filter,Filter> split = split(f);
assertEquals(f, split.first);
assertEquals(Filters.all(), split.second);
f = CQL.parse("foo = TRUE AND x = FALSE");
split = split(f);
assertEquals(CQL.parse("foo = TRUE"), split.first);
assertEquals(CQL.parse("x = FALSE"), split.second);
f = CQL.parse("foo = FALSE AND x = FALSE");
split = split(f);
assertEquals(Filters.all(), split.first);
assertEquals(f, split.second);
f = CQL.parse("foo = TRUE OR x = TRUE");
split = split(f);
assertEquals(f, split.first);
assertEquals(Filters.all(), split.second);
f = CQL.parse("foo = TRUE OR x = FALSE");
split = split(f);
assertEquals(Filters.all(), split.first);
assertEquals(f, split.second);
f = CQL.parse("foo = FALSE OR x = FALSE");
split = split(f);
assertEquals(Filters.all(), split.first);
assertEquals(f, split.second);
}
@Test
public void testNested() throws Exception {
Filter f = CQL.parse("(foo = TRUE AND x = TRUE) AND z = TRUE");
Pair<Filter,Filter> split = split(f);
assertEquals(f, split.first);
assertEquals(Filters.all(), split.second);
f = CQL.parse("(foo = TRUE OR x = FALSE) AND z = TRUE");
split = split(f);
assertEquals(CQL.parse("z = TRUE"), split.first);
assertEquals(CQL.parse("foo = TRUE OR x = FALSE"), split.second);
f = CQL.parse("(foo = TRUE AND x = FALSE) AND z = TRUE");
split = split(f);
assertEquals(CQL.parse("foo = TRUE AND z = TRUE"), split.first);
assertEquals(CQL.parse("x = FALSE"), split.second);
f = CQL.parse("(foo = TRUE AND x = FALSE) OR z = TRUE");
split = split(f);
assertEquals(Filters.all(), split.first);
assertEquals(CQL.parse("(foo = TRUE AND x = FALSE) OR z = TRUE"), split.second);
}
@Test
public void testNonLogic() throws Exception {
Filter f = CQL.parse("foo = TRUE");
Pair<Filter,Filter> split = split(f);
assertEquals(f, split.first);
assertEquals(Filters.all(), split.second);
f = CQL.parse("foo = FALSE");
split = split(f);
assertEquals(Filters.all(), split.first);
assertEquals(f, split.second);
}
Pair<Filter,Filter> split(Filter f) {
FilterSplitter splitter = new FilterSplitter(new FilterWalker<Boolean>() {
@Override
public Boolean visit(Comparison<?> compare, Object obj) {
String s = compare.right().evaluate(null).toString();
return Boolean.valueOf(s);
}
@Override
public Boolean visit(Logic<?> logic, Object obj) {
return true;
}
});
return splitter.split(f);
}
}