private Evaluator evaluator() { if (lazyEvaluator == null) { this.lazyEvaluator = new Evaluator(reader.spec().partitionType(), partFilter); } return lazyEvaluator; }
public boolean eval(StructLike data) { return visitor().eval(data); }
@Override public Iterator<DataFile> iterator() { if (rowFilter != null && rowFilter != Expressions.alwaysTrue() && partFilter != null && partFilter != Expressions.alwaysTrue()) { Evaluator evaluator = evaluator(); InclusiveMetricsEvaluator metricsEvaluator = metricsEvaluator(); return Iterators.transform( Iterators.filter(reader.iterator(partFilter, columns), input -> (input != null && evaluator.eval(input.partition()) && metricsEvaluator.eval(input))), DataFile::copy); } else { return Iterators.transform(reader.iterator(partFilter, columns), DataFile::copy); } }
Iterable<ManifestEntry> liveEntries() { if (rowFilter != null && rowFilter != Expressions.alwaysTrue() && partFilter != null && partFilter != Expressions.alwaysTrue()) { Evaluator evaluator = evaluator(); InclusiveMetricsEvaluator metricsEvaluator = metricsEvaluator(); return Iterables.filter(reader.entries(columns), entry -> (entry != null && entry.status() != Status.DELETED && evaluator.eval(entry.file().partition()) && metricsEvaluator.eval(entry.file()))); } else { return Iterables.filter(reader.entries(columns), entry -> entry != null && entry.status() != Status.DELETED); } }
@Test public void testLessThanOrEqual() { Evaluator evaluator = new Evaluator(STRUCT, lessThanOrEqual("x", 7)); Assert.assertTrue("7 <= 7 => true", evaluator.eval(TestHelpers.Row.of(7, 8, null))); Assert.assertTrue("6 <= 7 => true", evaluator.eval(TestHelpers.Row.of(6, 8, null))); Assert.assertFalse("8 <= 7 => false", evaluator.eval(TestHelpers.Row.of(8, 8, null))); }
@Override public boolean hasNext() { while (true) { if (currentIterator.hasNext()) { return true; } else if (tasks.hasNext()) { if (currentCloseable != null) { try { currentCloseable.close(); } catch (IOException e) { throw new RuntimeIOException(e, "Failed to close task"); } } FileScanTask task = tasks.next(); CloseableIterable<Record> reader = open(task); this.currentCloseable = reader; if (task.residual() != null && task.residual() != Expressions.alwaysTrue()) { Evaluator filter = new Evaluator(projection.asStruct(), task.residual()); this.currentIterator = filter(reader, filter::eval).iterator(); } else { this.currentIterator = reader.iterator(); } } else { return false; } } }
Iterable<ManifestEntry> allEntries() { if (rowFilter != null && rowFilter != Expressions.alwaysTrue() && partFilter != null && partFilter != Expressions.alwaysTrue()) { Evaluator evaluator = evaluator(); InclusiveMetricsEvaluator metricsEvaluator = metricsEvaluator(); return Iterables.filter(reader.entries(columns), entry -> (entry != null && evaluator.eval(entry.file().partition()) && metricsEvaluator.eval(entry.file()))); } else { return reader.entries(columns); } }
@Test public void testGreaterThan() { Evaluator evaluator = new Evaluator(STRUCT, greaterThan("x", 7)); Assert.assertFalse("7 > 7 => false", evaluator.eval(TestHelpers.Row.of(7, 8, null))); Assert.assertFalse("6 > 7 => false", evaluator.eval(TestHelpers.Row.of(6, 8, null))); Assert.assertTrue("8 > 7 => true", evaluator.eval(TestHelpers.Row.of(8, 8, null))); }
@Test public void testGreaterThanOrEqual() { Evaluator evaluator = new Evaluator(STRUCT, greaterThanOrEqual("x", 7)); Assert.assertTrue("7 >= 7 => true", evaluator.eval(TestHelpers.Row.of(7, 8, null))); Assert.assertFalse("6 >= 7 => false", evaluator.eval(TestHelpers.Row.of(6, 8, null))); Assert.assertTrue("8 >= 7 => true", evaluator.eval(TestHelpers.Row.of(8, 8, null))); }
@Test public void testOr() { Evaluator evaluator = new Evaluator(STRUCT, or(equal("x", 7), notNull("z"))); Assert.assertTrue("7, 3 => true", evaluator.eval(TestHelpers.Row.of(7, 0, 3))); Assert.assertTrue("8, 3 => true", evaluator.eval(TestHelpers.Row.of(8, 0, 3))); Assert.assertTrue("7, null => true", evaluator.eval(TestHelpers.Row.of(7, 0, null))); Assert.assertFalse("8, null => false", evaluator.eval(TestHelpers.Row.of(8, 0, null))); }
@Test public void testAnd() { Evaluator evaluator = new Evaluator(STRUCT, and(equal("x", 7), notNull("z"))); Assert.assertTrue("7, 3 => true", evaluator.eval(TestHelpers.Row.of(7, 0, 3))); Assert.assertFalse("8, 3 => false", evaluator.eval(TestHelpers.Row.of(8, 0, 3))); Assert.assertFalse("7, null => false", evaluator.eval(TestHelpers.Row.of(7, 0, null))); Assert.assertFalse("8, null => false", evaluator.eval(TestHelpers.Row.of(8, 0, null))); }