aboutsummaryrefslogtreecommitdiffstats
path: root/predicate-search/src/main/java/com/yahoo/search/predicate/index/PredicateOptimizer.java
blob: aa84d973e6130ca2ad4a08110df6215f9d4d80f8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.search.predicate.index;

import com.yahoo.document.predicate.Predicate;
import com.yahoo.search.predicate.Config;
import com.yahoo.search.predicate.optimization.AndOrSimplifier;
import com.yahoo.search.predicate.optimization.BooleanSimplifier;
import com.yahoo.search.predicate.optimization.ComplexNodeTransformer;
import com.yahoo.search.predicate.optimization.FeatureConjunctionTransformer;
import com.yahoo.search.predicate.optimization.NotNodeReorderer;
import com.yahoo.search.predicate.optimization.OrSimplifier;
import com.yahoo.search.predicate.optimization.PredicateOptions;
import com.yahoo.search.predicate.optimization.PredicateProcessor;

/**
 * Prepares the predicate for indexing.
 * Performs several optimization passes on the predicate.
 *
 * @author bjorncs
 */
public class PredicateOptimizer {

    private final PredicateProcessor[] processors;
    private final PredicateOptions options;

    public PredicateOptimizer(Config config) {
        this.options = new PredicateOptions(config.arity, config.lowerBound, config.upperBound);
        processors = new PredicateProcessor[]{
                new AndOrSimplifier(),
                new BooleanSimplifier(),
                new ComplexNodeTransformer(),
                new OrSimplifier(),
                new NotNodeReorderer(),
                new FeatureConjunctionTransformer(config.useConjunctionAlgorithm)
        };
    }

    /**
     * @return The optimized predicate.
     */
    public Predicate optimizePredicate(Predicate predicate) {
        for (PredicateProcessor processor : processors) {
            predicate = processor.process(predicate, options);
        }
        return predicate;
    }

}