aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/query/textserialize/item/ItemExecutorRegistry.java
blob: dc622b0b052ada840be4f47bcb6d77afd7560abc (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
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.search.query.textserialize.item;

import com.yahoo.prelude.query.AndItem;
import com.yahoo.prelude.query.CompositeItem;
import com.yahoo.prelude.query.EquivItem;
import com.yahoo.prelude.query.Item;
import com.yahoo.prelude.query.NearItem;
import com.yahoo.prelude.query.ONearItem;
import com.yahoo.prelude.query.OrItem;
import com.yahoo.prelude.query.PhraseItem;
import com.yahoo.prelude.query.RankItem;

import java.util.HashMap;
import java.util.Map;

/**
 * @author Tony Vaagenes
 */
public class ItemExecutorRegistry {

    private static final Map<String, ItemFormConverter> executorsByName = new HashMap<>();
    static {
        register(Item.ItemType.AND, createCompositeConverter(AndItem.class));
        register(Item.ItemType.OR, createCompositeConverter(OrItem.class));
        register(Item.ItemType.RANK, createCompositeConverter(RankItem.class));
        register(Item.ItemType.PHRASE, createCompositeConverter(PhraseItem.class));
        register(Item.ItemType.EQUIV, createCompositeConverter(EquivItem.class));

        register(AndNotRestConverter.andNotRest, new AndNotRestConverter());

        register(Item.ItemType.NEAR, new NearConverter(NearItem.class));
        register(Item.ItemType.ONEAR, new NearConverter(ONearItem.class));

        register(Item.ItemType.WORD, new WordConverter());
        register(Item.ItemType.INT, new IntConverter());
        register(Item.ItemType.PREFIX, new PrefixConverter());
        register(Item.ItemType.SUBSTRING, new SubStringConverter());
        register(Item.ItemType.EXACT, new ExactStringConverter());
        register(Item.ItemType.SUFFIX, new SuffixConverter());
    }

    private static <T extends CompositeItem> ItemFormConverter createCompositeConverter(Class<T> itemClass) {
        return new CompositeConverter<>(itemClass);
    }

    private static void register(Item.ItemType type, ItemFormConverter executor) {
        register(type.toString(), executor);
    }

    private static void register(String type, ItemFormConverter executor) {
        executorsByName.put(type, executor);
    }

    public static ItemFormConverter getByName(String name) {
        ItemFormConverter executor = executorsByName.get(name);
        ensureNotNull(executor, name);
        return executor;
    }

    private static void ensureNotNull(ItemFormConverter executor, String name) {
        if (executor == null) {
            throw new RuntimeException("No item type named '" + name + "'.");
        }
    }

    public static ItemFormConverter getByType(Item.ItemType itemType) {
        String name = (itemType == Item.ItemType.NOT) ? AndNotRestConverter.andNotRest : itemType.name();
        return getByName(name);
    }
}