aboutsummaryrefslogtreecommitdiffstats
path: root/document/src/main/java/com/yahoo/document/datatypes/PredicateFieldValue.java
blob: 8c2779570563e7dcbfbb4a750b457b3952d0a531 (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 Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.document.datatypes;

import com.yahoo.document.DataType;
import com.yahoo.document.Field;
import com.yahoo.document.PrimitiveDataType;
import com.yahoo.document.predicate.Predicate;
import com.yahoo.document.serialization.FieldReader;
import com.yahoo.document.serialization.FieldWriter;
import com.yahoo.document.serialization.XmlStream;

import java.util.Objects;

/**
 * @author Simon Thoresen Hult
 */
public class PredicateFieldValue extends FieldValue {

    private Predicate predicate;

    public PredicateFieldValue() {
        this((Predicate)null);
    }

    public PredicateFieldValue(Predicate predicate) {
        this.predicate = predicate;
    }

    public PredicateFieldValue(String predicateString) {
        this(Predicate.fromString(predicateString));
    }

    public Predicate getPredicate() {
        return predicate;
    }

    public PredicateFieldValue setPredicate(Predicate predicate) {
        this.predicate = predicate;
        return this;
    }

    @Override
    public DataType getDataType() {
        return DataType.PREDICATE;
    }

    @Override
    @Deprecated
    public void printXml(XmlStream xml) {
        if (predicate == null) {
            return;
        }
        xml.addContent(predicate.toString());
    }

    @Override
    public void clear() {
        predicate = null;
    }

    @Override
    public void assign(Object o) {
        if (o == null) {
            predicate = null;
        } else if (o instanceof Predicate) {
            predicate = (Predicate)o;
        } else if (o instanceof PredicateFieldValue) {
            predicate = ((PredicateFieldValue)o).predicate;
        } else {
            throw new IllegalArgumentException("Expected " + getClass().getName() + ", got " +
                                               o.getClass().getName() + ".");
        }
    }

    @Override
    public void serialize(Field field, FieldWriter writer) {
        writer.write(field, this);
    }

    @Override
    public void deserialize(Field field, FieldReader reader) {
        reader.read(field, this);
    }

    @Override
    public Object getWrappedValue() {
        return predicate;
    }

    @Override
    public PredicateFieldValue clone() {
        PredicateFieldValue obj = (PredicateFieldValue)super.clone();
        if (predicate != null) {
            try {
                obj.predicate = predicate.clone();
            } catch (CloneNotSupportedException e) {
                throw new AssertionError(e);
            }
        }
        return obj;
    }

    @Override
    public int hashCode() {
        return predicate != null ? predicate.hashCode() : 31;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof PredicateFieldValue)) {
            return false;
        }
        PredicateFieldValue rhs = (PredicateFieldValue)obj;
        if (!Objects.equals(predicate, rhs.predicate)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return String.valueOf(predicate);
    }

    public static PrimitiveDataType.Factory getFactory() {
        return new Factory();
    }
    private static class Factory extends PrimitiveDataType.Factory {
        @Override public FieldValue create() { return new PredicateFieldValue(); }
        @Override public FieldValue create(String value) { return new PredicateFieldValue(value); }
    }
}