class OrcTableSource implements BatchTableSource<Row>, ProjectableTableSource<Row>, FilterableTableSource<Row> {

	@Override
	public TableSource<Row> applyPredicate(List<Expression> predicates) {
		ArrayList<Predicate> orcPredicates = new ArrayList<>();

		// we do not remove any predicates from the list because ORC does not fully apply predicates
		for (Expression pred : predicates) {
			Predicate orcPred = toOrcPredicate(pred);
			if (orcPred != null) {
				LOG.info("Predicate [{}] converted into OrcPredicate [{}] and pushed into OrcTableSource for path {}.", pred, orcPred, path);
				orcPredicates.add(orcPred);
			} else {
				LOG.info("Predicate [{}] could not be pushed into OrcTableSource for path {}.", pred, path);
			}
		}

		return new OrcTableSource(path, orcSchema, orcConfig, batchSize, recursiveEnumeration, selectedFields, orcPredicates.toArray(new Predicate[]{}));
	}

	private  OrcTableSource(String path, TypeDescription orcSchema, Configuration orcConfig, int batchSize, boolean recursiveEnumeration);
	private  OrcTableSource(String path, TypeDescription orcSchema, Configuration orcConfig,
							int batchSize, boolean recursiveEnumeration,
							int[] selectedFields, Predicate[] predicates);

}