class PushdownUnexecutableNodesVisitor extends BaseVisitor {

    public static JexlNode pushdownPredicates(JexlNode queryTree, boolean forFieldIndex, ShardQueryConfiguration config, Set<String> indexedFields,
                    Set<String> indexOnlyFields, Set<String> nonEventFields, MetadataHelper helper) {
        PushdownUnexecutableNodesVisitor visitor = new PushdownUnexecutableNodesVisitor(config, forFieldIndex, indexedFields, indexOnlyFields, nonEventFields,
                        helper);
        
        // rewrite the tree to push down all negations before anything else
        JexlNode pushedDownTree = PushdownNegationVisitor.pushdownNegations(queryTree);
        return (JexlNode) pushedDownTree.jjtAccept(visitor, null);
    }

    public  PushdownUnexecutableNodesVisitor(ShardQueryConfiguration config, boolean forFieldIndex, Set<String> indexedFields, Set<String> indexOnlyFields,
                    Set<String> nonEventFields, MetadataHelper helper);

}