Skip to content

Commit e306d51

Browse files
q-andydbwiddis
andauthored
Add read and write optional enum sets methods to stream input and output (#17556)
* Add read and write optional enum sets to stream Signed-off-by: Andy Qin <qinandy@amazon.com> * Only write set if it is non-empty Signed-off-by: Andy Qin <qinandy@amazon.com> * Update javadoc Signed-off-by: Andy Qin <qinandy@amazon.com> * Read false presence flag as empty set Co-authored-by: Daniel Widdis <widdis@gmail.com> Signed-off-by: Andy <qinandy@amazon.com> * Update javadoc Signed-off-by: Andy Qin <qinandy@amazon.com> * Add unit tests Signed-off-by: Andy Qin <qinandy@amazon.com> * Fix typos Signed-off-by: Andy Qin <qinandy@amazon.com> * Update changelog Signed-off-by: Andy Qin <qinandy@amazon.com> --------- Signed-off-by: Andy Qin <qinandy@amazon.com> Signed-off-by: Andy <qinandy@amazon.com> Co-authored-by: Daniel Widdis <widdis@gmail.com>
1 parent e80b907 commit e306d51

File tree

4 files changed

+63
-0
lines changed

4 files changed

+63
-0
lines changed

CHANGELOG-3.0.md

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5151
- Use Lucene `BM25Similarity` as default since the `LegacyBM25Similarity` is marked as deprecated ([#17306](https://github.com/opensearch-project/OpenSearch/pull/17306))
5252
- Wildcard field index only 3gram of the input data [#17349](https://github.com/opensearch-project/OpenSearch/pull/17349)
5353
- Use BC libraries to parse PEM files, increase key length, allow general use of known cryptographic binary extensions, remove unused BC dependencies ([#3420](https://github.com/opensearch-project/OpenSearch/pull/14912))
54+
- Add optional enum set read / write functionality to stream input / output ([#17556](https://github.com/opensearch-project/OpenSearch/pull/17556))
5455

5556
### Deprecated
5657

libs/core/src/main/java/org/opensearch/core/common/io/stream/StreamInput.java

+15
Original file line numberDiff line numberDiff line change
@@ -1305,6 +1305,21 @@ public <E extends Enum<E>> EnumSet<E> readEnumSet(Class<E> enumClass) throws IOE
13051305
return res;
13061306
}
13071307

1308+
/**
1309+
* Reads an optional enum set with type E that was serialized based on the value of each enum's ordinal
1310+
* The set is expected to have been written using {@link StreamOutput#writeOptionalEnumSet(EnumSet)}
1311+
*
1312+
* @return the enum set of strings
1313+
* @throws IOException if an I/O exception occurs reading the set
1314+
*/
1315+
public <E extends Enum<E>> EnumSet<E> readOptionalEnumSet(Class<E> enumClass) throws IOException {
1316+
if (readBoolean()) {
1317+
return readEnumSet(enumClass);
1318+
} else {
1319+
return EnumSet.noneOf(enumClass);
1320+
}
1321+
}
1322+
13081323
public static StreamInput wrap(byte[] bytes) {
13091324
return wrap(bytes, 0, bytes.length);
13101325
}

libs/core/src/main/java/org/opensearch/core/common/io/stream/StreamOutput.java

+13
Original file line numberDiff line numberDiff line change
@@ -1255,6 +1255,19 @@ public <E extends Enum<E>> void writeEnumSet(EnumSet<E> enumSet) throws IOExcept
12551255
}
12561256
}
12571257

1258+
/**
1259+
* Writes an optional EnumSet with type E that serializes each enum based on its ordinal value
1260+
* For null or empty enum set, writes false;
1261+
*/
1262+
public <E extends Enum<E>> void writeOptionalEnumSet(@Nullable EnumSet<E> enumSet) throws IOException {
1263+
if (enumSet != null && enumSet.size() > 0) {
1264+
writeBoolean(true);
1265+
writeEnumSet(enumSet);
1266+
} else {
1267+
writeBoolean(false);
1268+
}
1269+
}
1270+
12581271
/**
12591272
* Write a {@link TimeValue} to the stream
12601273
*/

libs/core/src/test/java/org/opensearch/core/common/io/stream/BaseStreamTests.java

+34
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import java.util.Arrays;
5454
import java.util.Collection;
5555
import java.util.Collections;
56+
import java.util.EnumSet;
5657
import java.util.HashMap;
5758
import java.util.HashSet;
5859
import java.util.LinkedHashMap;
@@ -354,6 +355,32 @@ private <T> void runWriteReadCollectionTest(
354355
}
355356
}
356357

358+
public void testOptionalEnumSet() throws IOException {
359+
EnumSet<TestEnum> enumSet = EnumSet.allOf(TestEnum.class);
360+
BytesStreamOutput out = new BytesStreamOutput();
361+
out.writeOptionalEnumSet(enumSet);
362+
EnumSet<TestEnum> targetSet = getStreamInput(out.bytes()).readOptionalEnumSet(TestEnum.class);
363+
assertEquals(enumSet, targetSet);
364+
365+
enumSet = EnumSet.of(TestEnum.A, TestEnum.C, TestEnum.E);
366+
out = new BytesStreamOutput();
367+
out.writeOptionalEnumSet(enumSet);
368+
targetSet = getStreamInput(out.bytes()).readOptionalEnumSet(TestEnum.class);
369+
assertEquals(enumSet, targetSet);
370+
371+
enumSet = EnumSet.noneOf(TestEnum.class);
372+
out = new BytesStreamOutput();
373+
out.writeOptionalEnumSet(enumSet);
374+
targetSet = getStreamInput(out.bytes()).readOptionalEnumSet(TestEnum.class);
375+
assertEquals(enumSet, targetSet);
376+
377+
enumSet = null;
378+
out = new BytesStreamOutput();
379+
out.writeOptionalEnumSet(enumSet);
380+
targetSet = getStreamInput(out.bytes()).readOptionalEnumSet(TestEnum.class);
381+
assertEquals(EnumSet.noneOf(TestEnum.class), targetSet);
382+
}
383+
357384
public void testSetOfLongs() throws IOException {
358385
final int size = randomIntBetween(0, 6);
359386
final Set<Long> sourceSet = new HashSet<>(size);
@@ -540,4 +567,11 @@ private void assertGenericRoundtrip(Object original) throws IOException {
540567
});
541568
}
542569

570+
private enum TestEnum {
571+
A,
572+
B,
573+
C,
574+
D,
575+
E;
576+
}
543577
}

0 commit comments

Comments
 (0)