aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/searchdefinition/DefaultRankProfile.java
blob: cbbcee0dcfa30536deb004102c5ed9ed72664786 (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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.searchdefinition;

import com.yahoo.searchdefinition.document.SDField;

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;

/**
 * The rank profile containing default settings. This is derived from the fields
 * whenever this is accessed.
 *
 * @author  bratseth
 */
public class DefaultRankProfile extends RankProfile {

    /**
     * Creates a new rank profile
     *
     * @param rankProfileRegistry The {@link com.yahoo.searchdefinition.RankProfileRegistry} to use for storing and looking up rank profiles.
     */
    public DefaultRankProfile(Search search, RankProfileRegistry rankProfileRegistry) {
        super("default", search, rankProfileRegistry);
    }

    /**
     * Does nothing, the default rank profile can not inherit anything
     */
    // TODO: Why not? If that's the case, then fail attempts at it
    public void setInherited(String inheritedName) {
    }

    /** Returns null, the default rank profile can not inherit anything */
    public String getInheritedName() {
        return null;
    }

    /** Returns the rank boost value of the given field */
    public RankSetting getRankSetting(String fieldOrIndex,RankSetting.Type type) {
        RankSetting setting = super.getRankSetting(fieldOrIndex,type);
        if (setting != null) return setting;

        SDField field = getSearch().getConcreteField(fieldOrIndex);
        if (field != null) {
            setting = toRankSetting(field,type);
            if (setting != null)
                return setting;
        }

        Index index = getSearch().getIndex(fieldOrIndex);
        if (index != null) {
            setting = toRankSetting(index,type);
            if (setting != null)
                return setting;
        }

        return null;
    }

    private RankSetting toRankSetting(SDField field,RankSetting.Type type) {
        if (type.equals(RankSetting.Type.WEIGHT) && field.getWeight()>0 && field.getWeight()!=100)
            return new RankSetting(field.getName(),type,field.getWeight());
        if (type.equals(RankSetting.Type.RANKTYPE))
            return new RankSetting(field.getName(),type,field.getRankType());
        if (type.equals(RankSetting.Type.LITERALBOOST) && field.getLiteralBoost()>0)
            return new RankSetting(field.getName(),type,field.getLiteralBoost());

        // Index level setting really
        if (type.equals(RankSetting.Type.PREFERBITVECTOR) && field.getRanking().isFilter()) {
            return new RankSetting(field.getName(), type, true);
        }

        return null;
    }

    private RankSetting toRankSetting(Index index, RankSetting.Type type) {
        /* TODO: Add support for indexes by adding a ranking object to the index
        if (type.equals(RankSetting.Type.PREFERBITVECTOR) && index.isPreferBitVector()) {
            return new RankSetting(index.getName(), type, new Boolean(true));
        }
        */
        return null;
    }

    /**
     * Returns the names of the fields which have a rank boost setting
     * explicitly in this profile or in fields
     */
    public Set<RankSetting> rankSettings() {
        Set<RankSetting> settings = new LinkedHashSet<>(20);
        settings.addAll(this.rankSettings);
        for (SDField field : getSearch().allConcreteFields() ) {
            addSetting(field, RankSetting.Type.WEIGHT, settings);
            addSetting(field, RankSetting.Type.RANKTYPE, settings);
            addSetting(field, RankSetting.Type.LITERALBOOST, settings);
            addSetting(field, RankSetting.Type.PREFERBITVECTOR, settings);
        }

        // Foer settings that really pertains to indexes do the explicit indexes too
        for (Index index : getSearch().getExplicitIndices()) {
            addSetting(index, RankSetting.Type.PREFERBITVECTOR, settings);
        }
        return settings;
    }

    private void addSetting(SDField field, RankSetting.Type type, Set<RankSetting> settings) {
        if (type.isIndexLevel()) {
            addIndexSettings(field, type, settings);
        }
        else {
            RankSetting setting = toRankSetting(field, type);
            if (setting == null) return;
            settings.add(setting);
        }
    }

    private void addIndexSettings(SDField field, RankSetting.Type type, Set<RankSetting> settings) {
        for (Iterator i = field.getFieldNameAsIterator(); i.hasNext(); ) {
            String indexName = (String)i.next();

            // TODO: Make a ranking object in the index override the field level ranking object
            if (type.equals(RankSetting.Type.PREFERBITVECTOR) && field.getRanking().isFilter()) {
                settings.add(new RankSetting(indexName, type, true));
            }
        }
    }

    private void addSetting(Index index, RankSetting.Type type, Set<RankSetting> settings) {
        RankSetting setting = toRankSetting(index, type);
        if (setting == null) return;
        settings.add(setting);
    }

}