aboutsummaryrefslogtreecommitdiffstats
path: root/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/ExpressionTestCase.java
blob: a7ed7ae3e722b6561c6a184edf1ef92a12d91cac (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
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.indexinglanguage.parser;

import com.yahoo.language.Linguistics;
import com.yahoo.language.process.Embedder;
import com.yahoo.language.simple.SimpleLinguistics;
import com.yahoo.vespa.indexinglanguage.expressions.*;
import org.junit.Test;

import java.util.Optional;

import static org.junit.Assert.assertEquals;

/**
 * @author Simon Thoresen Hult
 */
@SuppressWarnings({ "rawtypes" })
public class ExpressionTestCase {

    @Test
    public void requireThatAllExpressionTypesAreParsed() throws ParseException {
        assertExpression(ArithmeticExpression.class, "1 + 2");
        assertExpression(AttributeExpression.class, "attribute");
        assertExpression(Base64DecodeExpression.class, "base64decode");
        assertExpression(Base64EncodeExpression.class, "base64encode");
        assertExpression(CatExpression.class, "1 . 2");
        assertExpression(ClearStateExpression.class, "clear_state");
        assertExpression(EchoExpression.class, "echo");
        assertExpression(ExactExpression.class, "exact");
        assertExpression(FlattenExpression.class, "flatten");
        assertExpression(ForEachExpression.class, "for_each { 1 }");
        assertExpression(GetFieldExpression.class, "get_field field1");
        assertExpression(GetVarExpression.class, "get_var myvar1");
        assertExpression(GuardExpression.class, "guard { 1 }");
        assertExpression(GuardExpression.class, "guard { 1; 2 }");
        assertExpression(HexDecodeExpression.class, "hexdecode");
        assertExpression(HexEncodeExpression.class, "hexencode");
        assertExpression(HostNameExpression.class, "hostname");
        assertExpression(IfThenExpression.class, "if (1 < 2) { 3 }");
        assertExpression(IfThenExpression.class, "if (1 < 2) { 3 } else { 4 }");
        assertExpression(IndexExpression.class, "index");
        assertExpression(InputExpression.class, "input foo");
        assertExpression(InputExpression.class, "input field1");
        assertExpression(JoinExpression.class, "join '1'");
        assertExpression(LowerCaseExpression.class, "lowercase");
        assertExpression(NGramExpression.class, "ngram 1");
        assertExpression(NormalizeExpression.class, "normalize");
        assertExpression(NowExpression.class, "now");
        assertExpression(OptimizePredicateExpression.class, "optimize_predicate");
        assertExpression(ParenthesisExpression.class, "(1)");
        assertExpression(RandomExpression.class, "random");
        assertExpression(RandomExpression.class, "random 1");
        assertExpression(ScriptExpression.class, "{ 1; 2 }");
        assertExpression(SelectInputExpression.class, "select_input { field1: 2; }");
        assertExpression(SetLanguageExpression.class, "set_language");
        assertExpression(ConstantExpression.class, "1");
        assertExpression(SetVarExpression.class, "set_var myvar1");
        assertExpression(SplitExpression.class, "split '1'");
        assertExpression(StatementExpression.class, "1 | 2");
        assertExpression(SubstringExpression.class, "substring 1 2");
        assertExpression(SummaryExpression.class, "summary");
        assertExpression(SwitchExpression.class, "switch { case '1': 2; }");
        assertExpression(ThisExpression.class, "this");
        assertExpression(ToArrayExpression.class, "to_array");
        assertExpression(ToByteExpression.class, "to_byte");
        assertExpression(ToDoubleExpression.class, "to_double");
        assertExpression(ToFloatExpression.class, "to_float");
        assertExpression(ToIntegerExpression.class, "to_int");
        assertExpression(TokenizeExpression.class, "tokenize");
        assertExpression(TokenizeExpression.class, "tokenize stem");
        assertExpression(TokenizeExpression.class, "tokenize stem normalize");
        assertExpression(TokenizeExpression.class, "tokenize stem:\"ALL\" normalize");
        assertExpression(TokenizeExpression.class, "tokenize stem:\"ALL\"");
        assertExpression(TokenizeExpression.class, "tokenize normalize");
        assertExpression(TokenizeExpression.class, "tokenize max-occurrences: 15", Optional.of("tokenize max-occurrences:15"));
        assertExpression(ToLongExpression.class, "to_long");
        assertExpression(ToPositionExpression.class, "to_pos");
        assertExpression(ToStringExpression.class, "to_string");
        assertExpression(ToWsetExpression.class, "to_wset");
        assertExpression(ToBoolExpression.class, "to_bool");
        assertExpression(ToWsetExpression.class, "to_wset create_if_non_existent");
        assertExpression(ToWsetExpression.class, "to_wset remove_if_zero");
        assertExpression(ToWsetExpression.class, "to_wset create_if_non_existent remove_if_zero");
        assertExpression(ToWsetExpression.class, "to_wset remove_if_zero create_if_non_existent");
        assertExpression(TrimExpression.class, "trim");
        assertExpression(ZCurveExpression.class, "zcurve");
        assertExpression(ChoiceExpression.class, "input foo || \"\"");
    }

    private static void assertExpression(Class expectedClass, String str) throws ParseException {
        assertExpression(expectedClass, str, Optional.empty());
    }

    private static void assertExpression(Class expectedClass, String str, Optional<String> expStr) throws ParseException {
        Linguistics linguistics = new SimpleLinguistics();
        Expression foo = Expression.fromString(str, linguistics, Embedder.throwsOnUse.asMap());
        assertEquals(expectedClass, foo.getClass());
        if (expStr.isPresent()) {
            assertEquals(expStr.get(), foo.toString());
        }
        Expression bar = Expression.fromString(foo.toString(), linguistics, Embedder.throwsOnUse.asMap());
        assertEquals(foo.hashCode(), bar.hashCode());
        assertEquals(foo, bar);
    }

}