Line data Source code
1 : // Copyright (C) 2022 The Android Open Source Project
2 : //
3 : // Licensed under the Apache License, Version 2.0 (the "License");
4 : // you may not use this file except in compliance with the License.
5 : // You may obtain a copy of the License at
6 : //
7 : // http://www.apache.org/licenses/LICENSE-2.0
8 : //
9 : // Unless required by applicable law or agreed to in writing, software
10 : // distributed under the License is distributed on an "AS IS" BASIS,
11 : // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : // See the License for the specific language governing permissions and
13 : // limitations under the License.
14 :
15 : package com.google.gerrit.index.testing;
16 :
17 : import com.google.common.reflect.TypeToken;
18 : import com.google.gerrit.entities.converter.ChangeProtoConverter;
19 : import com.google.gerrit.index.IndexedField;
20 : import com.google.gerrit.index.SchemaFieldDefs.Getter;
21 : import com.google.gerrit.index.SchemaFieldDefs.Setter;
22 : import com.google.gerrit.proto.Entities;
23 : import com.google.gerrit.proto.Entities.Change;
24 : import com.google.gerrit.proto.Entities.Change_Id;
25 : import java.io.IOException;
26 : import java.sql.Timestamp;
27 :
28 : /**
29 : * Collection of {@link IndexedField}, used in unit tests.
30 : *
31 : * <p>The list of {@link IndexedField} below are field types, that are currently supported and used
32 : * in different index implementations
33 : *
34 : * <p>They are used in unit tests to make sure these types can be extracted to index and assigned
35 : * back to object.
36 : */
37 : public final class TestIndexedFields {
38 :
39 : /** Test input object for {@link IndexedField} */
40 1 : public static class TestIndexedData {
41 :
42 : /** Key that is used to index to identify indexed object */
43 : private Object key;
44 :
45 : /** Field value that is extracted from this indexed object to the index document. */
46 : private Object testFieldValue;
47 :
48 : public Object getTestField() {
49 1 : return testFieldValue;
50 : }
51 :
52 : public void setTestFieldValue(Object testFieldValue) {
53 1 : this.testFieldValue = testFieldValue;
54 1 : }
55 :
56 : public Object getKey() {
57 0 : return key;
58 : }
59 :
60 : public void setKey(Object key) {
61 0 : this.key = key;
62 0 : }
63 : }
64 :
65 : /** Setter for {@link TestIndexedData} */
66 : private static class TestIndexedDataSetter<T> implements Setter<TestIndexedData, T> {
67 : @Override
68 : public void set(TestIndexedData testIndexedData, T value) {
69 1 : testIndexedData.setTestFieldValue(value);
70 1 : }
71 : }
72 :
73 : /** Getter for {@link TestIndexedData} */
74 : @SuppressWarnings("unchecked")
75 : private static class TestIndexedDataGetter<T> implements Getter<TestIndexedData, T> {
76 : @Override
77 : public T get(TestIndexedData input) throws IOException {
78 0 : return (T) input.getTestField();
79 : }
80 : }
81 :
82 : public static <T> TestIndexedDataSetter<T> setter() {
83 1 : return new TestIndexedDataSetter<>();
84 : }
85 :
86 : public static <T> TestIndexedDataGetter<T> getter() {
87 1 : return new TestIndexedDataGetter<>();
88 : }
89 :
90 1 : public static final IndexedField<TestIndexedData, Integer> INTEGER_FIELD =
91 1 : IndexedField.<TestIndexedData>integerBuilder("IntegerTestField").build(getter(), setter());
92 :
93 1 : public static final IndexedField<TestIndexedData, Integer>.SearchSpec INTEGER_FIELD_SPEC =
94 1 : INTEGER_FIELD.integer("integer_test");
95 :
96 1 : public static final IndexedField<TestIndexedData, Iterable<Integer>> ITERABLE_INTEGER_FIELD =
97 1 : IndexedField.<TestIndexedData>iterableIntegerBuilder("IterableIntegerTestField")
98 1 : .build(getter(), setter());
99 :
100 : public static final IndexedField<TestIndexedData, Iterable<Integer>>.SearchSpec
101 1 : ITERABLE_INTEGER_FIELD_SPEC = ITERABLE_INTEGER_FIELD.integer("iterable_integer_test");
102 :
103 1 : public static final IndexedField<TestIndexedData, Integer> INTEGER_RANGE_FIELD =
104 1 : IndexedField.<TestIndexedData>integerBuilder("IntegerRangeTestField")
105 1 : .build(TestIndexedFields.getter(), TestIndexedFields.setter());
106 1 : public static final IndexedField<TestIndexedData, Integer>.SearchSpec INTEGER_RANGE_FIELD_SPEC =
107 1 : INTEGER_RANGE_FIELD.range("integer_range_test");
108 :
109 : public static final IndexedField<TestIndexedData, Iterable<Integer>>
110 1 : ITERABLE_INTEGER_RANGE_FIELD =
111 1 : IndexedField.<TestIndexedData>iterableIntegerBuilder("IterableIntegerRangeTestField")
112 1 : .build(TestIndexedFields.getter(), TestIndexedFields.setter());
113 :
114 : public static final IndexedField<TestIndexedData, Iterable<Integer>>.SearchSpec
115 1 : ITERABLE_INTEGER_RANGE_FIELD_SPEC =
116 1 : ITERABLE_INTEGER_RANGE_FIELD.range("iterable_integer_range_test");
117 :
118 1 : public static final IndexedField<TestIndexedData, Long> LONG_FIELD =
119 1 : IndexedField.<TestIndexedData>longBuilder("LongTestField").build(getter(), setter());
120 :
121 1 : public static final IndexedField<TestIndexedData, Long>.SearchSpec LONG_FIELD_SPEC =
122 1 : LONG_FIELD.longSearch("long_test");
123 :
124 1 : public static final IndexedField<TestIndexedData, Iterable<Long>> ITERABLE_LONG_FIELD =
125 1 : IndexedField.<TestIndexedData, Iterable<Long>>builder(
126 : "IterableLongTestField", IndexedField.ITERABLE_LONG_TYPE)
127 1 : .build(TestIndexedFields.getter(), TestIndexedFields.setter());
128 :
129 : public static final IndexedField<TestIndexedData, Iterable<Long>>.SearchSpec
130 1 : ITERABLE_LONG_FIELD_SPEC = ITERABLE_LONG_FIELD.longSearch("iterable_long_test");
131 :
132 1 : public static final IndexedField<TestIndexedData, Long> LONG_RANGE_FIELD =
133 1 : IndexedField.<TestIndexedData>longBuilder("LongRangeTestField")
134 1 : .build(TestIndexedFields.getter(), TestIndexedFields.setter());
135 :
136 1 : public static final IndexedField<TestIndexedData, Long>.SearchSpec LONG_RANGE_FIELD_SPEC =
137 1 : LONG_RANGE_FIELD.range("long_range_test");
138 :
139 1 : public static final IndexedField<TestIndexedData, Iterable<Long>> ITERABLE_LONG_RANGE_FIELD =
140 1 : IndexedField.<TestIndexedData, Iterable<Long>>builder(
141 : "IterableLongRangeTestField", IndexedField.ITERABLE_LONG_TYPE)
142 1 : .build(TestIndexedFields.getter(), TestIndexedFields.setter());
143 :
144 : public static final IndexedField<TestIndexedData, Iterable<Long>>.SearchSpec
145 1 : ITERABLE_LONG_RANGE_FIELD_SPEC = ITERABLE_LONG_RANGE_FIELD.range("iterable_long_range_test");
146 :
147 1 : public static final IndexedField<TestIndexedData, Timestamp> TIMESTAMP_FIELD =
148 1 : IndexedField.<TestIndexedData>timestampBuilder("TimestampTestField")
149 1 : .build(getter(), setter());
150 :
151 1 : public static final IndexedField<TestIndexedData, Timestamp>.SearchSpec TIMESTAMP_FIELD_SPEC =
152 1 : TIMESTAMP_FIELD.timestamp("timestamp_test");
153 :
154 1 : public static final IndexedField<TestIndexedData, Iterable<String>> ITERABLE_STRING_FIELD =
155 1 : IndexedField.<TestIndexedData>iterableStringBuilder("IterableStringTestField")
156 1 : .build(getter(), setter());
157 :
158 : public static final IndexedField<TestIndexedData, Iterable<String>>.SearchSpec
159 1 : ITERABLE_STRING_FIELD_SPEC = ITERABLE_STRING_FIELD.fullText("iterable_test_string");
160 :
161 1 : public static final IndexedField<TestIndexedData, String> STRING_FIELD =
162 1 : IndexedField.<TestIndexedData>stringBuilder("StringTestField").build(getter(), setter());
163 :
164 1 : public static final IndexedField<TestIndexedData, String>.SearchSpec STRING_FIELD_SPEC =
165 1 : STRING_FIELD.fullText("string_test");
166 :
167 1 : public static final IndexedField<TestIndexedData, Iterable<byte[]>> ITERABLE_STORED_BYTE_FIELD =
168 1 : IndexedField.<TestIndexedData>iterableByteArrayBuilder("IterableByteTestField")
169 1 : .stored()
170 1 : .build(getter(), setter());
171 :
172 : public static final IndexedField<TestIndexedData, Iterable<byte[]>>.SearchSpec
173 1 : ITERABLE_STORED_BYTE_SPEC = ITERABLE_STORED_BYTE_FIELD.storedOnly("iterable_byte_test");
174 :
175 1 : public static final IndexedField<TestIndexedData, byte[]> STORED_BYTE_FIELD =
176 1 : IndexedField.<TestIndexedData>byteArrayBuilder("ByteTestField")
177 1 : .stored()
178 1 : .build(getter(), setter());
179 :
180 1 : public static final IndexedField<TestIndexedData, byte[]>.SearchSpec STORED_BYTE_SPEC =
181 1 : STORED_BYTE_FIELD.storedOnly("byte_test");
182 :
183 1 : public static final IndexedField<TestIndexedData, Entities.Change> STORED_PROTO_FIELD =
184 1 : IndexedField.<TestIndexedData, Entities.Change>builder(
185 : "TestChange",
186 1 : new TypeToken<Entities.Change>() {
187 : private static final long serialVersionUID = 1L;
188 : })
189 1 : .stored()
190 1 : .build(getter(), setter(), ChangeProtoConverter.INSTANCE);
191 :
192 : public static final IndexedField<TestIndexedData, Entities.Change>.SearchSpec
193 1 : STORED_PROTO_FIELD_SPEC = STORED_PROTO_FIELD.storedOnly("test_change");
194 :
195 : public static final IndexedField<TestIndexedData, Iterable<Entities.Change>>
196 1 : ITERABLE_STORED_PROTO_FIELD =
197 1 : IndexedField.<TestIndexedData, Iterable<Entities.Change>>builder(
198 : "IterableTestChange",
199 1 : new TypeToken<Iterable<Entities.Change>>() {
200 : private static final long serialVersionUID = 1L;
201 : })
202 1 : .stored()
203 1 : .build(getter(), setter(), ChangeProtoConverter.INSTANCE);
204 :
205 : public static final IndexedField<TestIndexedData, Iterable<Entities.Change>>.SearchSpec
206 1 : ITERABLE_PROTO_FIELD_SPEC = ITERABLE_STORED_PROTO_FIELD.storedOnly("iterable_test_change");
207 :
208 : public static Change createChangeProto(int id) {
209 1 : return Entities.Change.newBuilder()
210 1 : .setChangeId(Change_Id.newBuilder().setId(id).build())
211 1 : .build();
212 : }
213 :
214 : private TestIndexedFields() {}
215 : }
|