diff --git a/server/src/main/java/org/elasticsearch/common/text/Text.java b/libs/x-content/src/main/java/org/elasticsearch/xcontent/Text.java similarity index 52% rename from server/src/main/java/org/elasticsearch/common/text/Text.java rename to libs/x-content/src/main/java/org/elasticsearch/xcontent/Text.java index b24b59655775..7a771f247a44 100644 --- a/server/src/main/java/org/elasticsearch/common/text/Text.java +++ b/libs/x-content/src/main/java/org/elasticsearch/xcontent/Text.java @@ -6,22 +6,17 @@ * your election, the "Elastic License 2.0", the "GNU Affero General Public * License v3.0 only", or the "Server Side Public License, v 1". */ -package org.elasticsearch.common.text; - -import org.apache.lucene.util.BytesRef; -import org.elasticsearch.common.bytes.BytesArray; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.xcontent.ToXContentFragment; -import org.elasticsearch.xcontent.XContentBuilder; +package org.elasticsearch.xcontent; import java.io.IOException; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; /** - * Both {@link String} and {@link BytesReference} representation of the text. Starts with one of those, and if - * the other is requests, caches the other one in a local reference so no additional conversion will be needed. + * Both {@link String} and {@link UTF8Bytes} representation of the text. Starts with one of those, and if + * the other is requested, caches the other one in a local reference so no additional conversion will be needed. */ -public final class Text implements Comparable, ToXContentFragment { +public final class Text implements XContentString, Comparable, ToXContentFragment { public static final Text[] EMPTY_ARRAY = new Text[0]; @@ -36,31 +31,46 @@ public final class Text implements Comparable, ToXContentFragment { return texts; } - private BytesReference bytes; - private String text; + private UTF8Bytes bytes; + private String string; private int hash; + private int stringLength = -1; - public Text(BytesReference bytes) { + /** + * Construct a Text from encoded UTF8Bytes. Since no string length is specified, {@link #stringLength()} + * will perform a string conversion to measure the string length. + */ + public Text(UTF8Bytes bytes) { this.bytes = bytes; } - public Text(String text) { - this.text = text; + /** + * Construct a Text from encoded UTF8Bytes and an explicit string length. Used to avoid string conversion + * in {@link #stringLength()}. The provided stringLength should match the value that would + * be calculated by {@link Text#Text(UTF8Bytes)}. + */ + public Text(UTF8Bytes bytes, int stringLength) { + this.bytes = bytes; + this.stringLength = stringLength; + } + + public Text(String string) { + this.string = string; } /** - * Whether a {@link BytesReference} view of the data is already materialized. + * Whether an {@link UTF8Bytes} view of the data is already materialized. */ public boolean hasBytes() { return bytes != null; } - /** - * Returns a {@link BytesReference} view of the data. - */ - public BytesReference bytes() { + @Override + public UTF8Bytes bytes() { if (bytes == null) { - bytes = new BytesArray(text.getBytes(StandardCharsets.UTF_8)); + var byteBuff = StandardCharsets.UTF_8.encode(string); + assert byteBuff.hasArray(); + bytes = new UTF8Bytes(byteBuff.array(), byteBuff.arrayOffset() + byteBuff.position(), byteBuff.remaining()); } return bytes; } @@ -69,14 +79,25 @@ public final class Text implements Comparable, ToXContentFragment { * Whether a {@link String} view of the data is already materialized. */ public boolean hasString() { - return text != null; + return string != null; } - /** - * Returns a {@link String} view of the data. - */ + @Override public String string() { - return text == null ? bytes.utf8ToString() : text; + if (string == null) { + var byteBuff = ByteBuffer.wrap(bytes.bytes(), bytes.offset(), bytes.length()); + string = StandardCharsets.UTF_8.decode(byteBuff).toString(); + assert (stringLength < 0) || (string.length() == stringLength); + } + return string; + } + + @Override + public int stringLength() { + if (stringLength < 0) { + stringLength = string().length(); + } + return stringLength; } @Override @@ -115,8 +136,7 @@ public final class Text implements Comparable, ToXContentFragment { } else { // TODO: TextBytesOptimization we can use a buffer here to convert it? maybe add a // request to jackson to support InputStream as well? - BytesRef br = this.bytes().toBytesRef(); - return builder.utf8Value(br.bytes, br.offset, br.length); + return builder.utf8Value(bytes.bytes(), bytes.offset(), bytes.length()); } } } diff --git a/libs/x-content/src/main/java/org/elasticsearch/xcontent/XContentString.java b/libs/x-content/src/main/java/org/elasticsearch/xcontent/XContentString.java new file mode 100644 index 000000000000..2e6da57eae1e --- /dev/null +++ b/libs/x-content/src/main/java/org/elasticsearch/xcontent/XContentString.java @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.xcontent; + +import java.nio.ByteBuffer; + +public interface XContentString { + record UTF8Bytes(byte[] bytes, int offset, int length) implements Comparable { + public UTF8Bytes(byte[] bytes) { + this(bytes, 0, bytes.length); + } + + @Override + public int compareTo(UTF8Bytes o) { + if (this.bytes == o.bytes && this.offset == o.offset && this.length == o.length) { + return 0; + } + + return ByteBuffer.wrap(bytes, offset, length).compareTo(ByteBuffer.wrap(o.bytes, o.offset, o.length)); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + return this.compareTo((UTF8Bytes) o) == 0; + } + + @Override + public int hashCode() { + return ByteBuffer.wrap(bytes, offset, length).hashCode(); + } + } + + /** + * Returns a {@link String} view of the data. + */ + String string(); + + /** + * Returns an encoded {@link UTF8Bytes} view of the data. + */ + UTF8Bytes bytes(); + + /** + * Returns the number of characters in the represented string. + */ + int stringLength(); +} diff --git a/libs/x-content/src/test/java/org/elasticsearch/xcontent/TextTests.java b/libs/x-content/src/test/java/org/elasticsearch/xcontent/TextTests.java new file mode 100644 index 000000000000..150fe1627c42 --- /dev/null +++ b/libs/x-content/src/test/java/org/elasticsearch/xcontent/TextTests.java @@ -0,0 +1,190 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.xcontent; + +import org.elasticsearch.test.ESTestCase; + +import java.nio.charset.StandardCharsets; + +public class TextTests extends ESTestCase { + public void testConvertToBytes() { + String value = randomUnicodeOfLength(randomInt(128)); + byte[] encodedArr = value.getBytes(StandardCharsets.UTF_8); + var encoded = new XContentString.UTF8Bytes(encodedArr); + + var text = new Text(value); + assertTrue(text.hasString()); + assertFalse(text.hasBytes()); + + assertEquals(value, text.string()); + assertEquals(encoded, text.bytes()); + + assertTrue(text.hasString()); + assertTrue(text.hasBytes()); + + // Ensure the conversion didn't mess up subsequent calls + assertEquals(value, text.string()); + assertEquals(encoded, text.bytes()); + + assertSame(text.bytes(), text.bytes()); + } + + public void testConvertToString() { + String value = randomUnicodeOfLength(randomInt(128)); + byte[] encodedArr = value.getBytes(StandardCharsets.UTF_8); + var encoded = new XContentString.UTF8Bytes(encodedArr); + + var text = new Text(encoded); + assertFalse(text.hasString()); + assertTrue(text.hasBytes()); + + assertEquals(value, text.string()); + assertEquals(encoded, text.bytes()); + + assertTrue(text.hasString()); + assertTrue(text.hasBytes()); + + // Ensure the conversion didn't mess up subsequent calls + assertEquals(value, text.string()); + assertEquals(encoded, text.bytes()); + + assertSame(encoded, text.bytes()); + } + + public void testStringLength() { + int stringLength = randomInt(128); + String value = randomUnicodeOfLength(stringLength); + byte[] encodedArr = value.getBytes(StandardCharsets.UTF_8); + var encoded = new XContentString.UTF8Bytes(encodedArr); + + { + var text = new Text(value); + assertTrue(text.hasString()); + assertEquals(stringLength, text.stringLength()); + } + + { + var text = new Text(encoded); + assertFalse(text.hasString()); + assertEquals(stringLength, text.stringLength()); + assertTrue(text.hasString()); + } + + { + var text = new Text(encoded, stringLength); + assertFalse(text.hasString()); + assertEquals(stringLength, text.stringLength()); + assertFalse(text.hasString()); + } + } + + public void testEquals() { + String value = randomUnicodeOfLength(randomInt(128)); + byte[] encodedArr = value.getBytes(StandardCharsets.UTF_8); + var encoded = new XContentString.UTF8Bytes(encodedArr); + + { + var text1 = new Text(value); + var text2 = new Text(value); + assertTrue(text1.equals(text2)); + } + + { + var text1 = new Text(value); + var text2 = new Text(encoded); + assertTrue(text1.equals(text2)); + } + + { + var text1 = new Text(encoded); + var text2 = new Text(encoded); + assertTrue(text1.equals(text2)); + } + } + + public void testCompareTo() { + String value1 = randomUnicodeOfLength(randomInt(128)); + byte[] encodedArr1 = value1.getBytes(StandardCharsets.UTF_8); + var encoded1 = new XContentString.UTF8Bytes(encodedArr1); + + { + var text1 = new Text(value1); + var text2 = new Text(value1); + assertEquals(0, text1.compareTo(text2)); + } + + { + var text1 = new Text(value1); + var text2 = new Text(encoded1); + assertEquals(0, text1.compareTo(text2)); + } + + { + var text1 = new Text(encoded1); + var text2 = new Text(encoded1); + assertEquals(0, text1.compareTo(text2)); + } + + String value2 = randomUnicodeOfLength(randomInt(128)); + byte[] encodedArr2 = value2.getBytes(StandardCharsets.UTF_8); + var encoded2 = new XContentString.UTF8Bytes(encodedArr2); + + int compSign = (int) Math.signum(encoded1.compareTo(encoded2)); + + { + var text1 = new Text(value1); + var text2 = new Text(value2); + assertEquals(compSign, (int) Math.signum(text1.compareTo(text2))); + } + + { + var text1 = new Text(value1); + var text2 = new Text(encoded2); + assertEquals(compSign, (int) Math.signum(text1.compareTo(text2))); + } + + { + var text1 = new Text(encoded1); + var text2 = new Text(value2); + assertEquals(compSign, (int) Math.signum(text1.compareTo(text2))); + } + + { + var text1 = new Text(encoded1); + var text2 = new Text(encoded2); + assertEquals(compSign, (int) Math.signum(text1.compareTo(text2))); + } + } + + public void testRandomized() { + int stringLength = randomInt(128); + String value = randomUnicodeOfLength(stringLength); + byte[] encodedArr = value.getBytes(StandardCharsets.UTF_8); + var encoded = new XContentString.UTF8Bytes(encodedArr); + + Text text = switch (randomInt(2)) { + case 0 -> new Text(value); + case 1 -> new Text(encoded); + default -> new Text(encoded, stringLength); + }; + + for (int i = 0; i < 20; i++) { + switch (randomInt(5)) { + case 0 -> assertEquals(encoded, text.bytes()); + case 1 -> assertSame(text.bytes(), text.bytes()); + case 2 -> assertEquals(value, text.string()); + case 3 -> assertEquals(value, text.toString()); + case 4 -> assertEquals(stringLength, text.stringLength()); + case 5 -> assertEquals(new Text(value), text); + } + } + } + +} diff --git a/plugins/examples/custom-suggester/src/main/java/org/elasticsearch/example/customsuggester/CustomSuggester.java b/plugins/examples/custom-suggester/src/main/java/org/elasticsearch/example/customsuggester/CustomSuggester.java index 148324be5565..1c2e52f3c606 100644 --- a/plugins/examples/custom-suggester/src/main/java/org/elasticsearch/example/customsuggester/CustomSuggester.java +++ b/plugins/examples/custom-suggester/src/main/java/org/elasticsearch/example/customsuggester/CustomSuggester.java @@ -11,7 +11,7 @@ package org.elasticsearch.example.customsuggester; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.util.CharsRefBuilder; -import org.elasticsearch.common.text.Text; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.search.suggest.Suggest; import org.elasticsearch.search.suggest.Suggester; diff --git a/plugins/examples/custom-suggester/src/main/java/org/elasticsearch/example/customsuggester/CustomSuggestion.java b/plugins/examples/custom-suggester/src/main/java/org/elasticsearch/example/customsuggester/CustomSuggestion.java index b04d62065edc..dd349bfe1bbc 100644 --- a/plugins/examples/custom-suggester/src/main/java/org/elasticsearch/example/customsuggester/CustomSuggestion.java +++ b/plugins/examples/custom-suggester/src/main/java/org/elasticsearch/example/customsuggester/CustomSuggestion.java @@ -11,7 +11,7 @@ package org.elasticsearch.example.customsuggester; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.text.Text; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.search.suggest.Suggest; import org.elasticsearch.xcontent.ParseField; import org.elasticsearch.xcontent.XContentBuilder; diff --git a/server/src/main/java/org/elasticsearch/cluster/service/MasterService.java b/server/src/main/java/org/elasticsearch/cluster/service/MasterService.java index 05fa03283d06..596cce87fd15 100644 --- a/server/src/main/java/org/elasticsearch/cluster/service/MasterService.java +++ b/server/src/main/java/org/elasticsearch/cluster/service/MasterService.java @@ -36,7 +36,6 @@ import org.elasticsearch.common.component.AbstractLifecycleComponent; import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.text.Text; import org.elasticsearch.common.util.CollectionUtils; import org.elasticsearch.common.util.concurrent.AbstractRunnable; import org.elasticsearch.common.util.concurrent.CountDown; @@ -56,6 +55,7 @@ import org.elasticsearch.tasks.TaskId; import org.elasticsearch.tasks.TaskManager; import org.elasticsearch.threadpool.Scheduler; import org.elasticsearch.threadpool.ThreadPool; +import org.elasticsearch.xcontent.Text; import java.util.ArrayList; import java.util.Collections; diff --git a/server/src/main/java/org/elasticsearch/cluster/service/PendingClusterTask.java b/server/src/main/java/org/elasticsearch/cluster/service/PendingClusterTask.java index b83a56ca9b42..075e69504de1 100644 --- a/server/src/main/java/org/elasticsearch/cluster/service/PendingClusterTask.java +++ b/server/src/main/java/org/elasticsearch/cluster/service/PendingClusterTask.java @@ -13,8 +13,8 @@ import org.elasticsearch.common.Priority; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; -import org.elasticsearch.common.text.Text; import org.elasticsearch.core.TimeValue; +import org.elasticsearch.xcontent.Text; import java.io.IOException; diff --git a/server/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java b/server/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java index 8b54c7a78907..3e3ab92f5d72 100644 --- a/server/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java +++ b/server/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java @@ -23,12 +23,13 @@ import org.elasticsearch.common.bytes.ReleasableBytesReference; import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.settings.SecureString; -import org.elasticsearch.common.text.Text; import org.elasticsearch.common.util.Maps; import org.elasticsearch.common.util.set.Sets; import org.elasticsearch.core.CharArrays; import org.elasticsearch.core.Nullable; import org.elasticsearch.core.TimeValue; +import org.elasticsearch.xcontent.Text; +import org.elasticsearch.xcontent.XContentString; import java.io.EOFException; import java.io.FilterInputStream; @@ -385,19 +386,28 @@ public abstract class StreamInput extends InputStream { return new BigInteger(readString()); } + private Text readText(int length) throws IOException { + byte[] bytes = new byte[length]; + if (length > 0) { + readBytes(bytes, 0, length); + } + var encoded = new XContentString.UTF8Bytes(bytes); + return new Text(encoded); + } + @Nullable public Text readOptionalText() throws IOException { int length = readInt(); if (length == -1) { return null; } - return new Text(readBytesReference(length)); + return readText(length); } public Text readText() throws IOException { - // use StringAndBytes so we can cache the string if it's ever converted to it + // use Text so we can cache the string if it's ever converted to it int length = readInt(); - return new Text(readBytesReference(length)); + return readText(length); } @Nullable diff --git a/server/src/main/java/org/elasticsearch/common/io/stream/StreamOutput.java b/server/src/main/java/org/elasticsearch/common/io/stream/StreamOutput.java index 0621709683ba..d1fb6c700a9f 100644 --- a/server/src/main/java/org/elasticsearch/common/io/stream/StreamOutput.java +++ b/server/src/main/java/org/elasticsearch/common/io/stream/StreamOutput.java @@ -22,11 +22,11 @@ import org.elasticsearch.common.compress.CompressorFactory; import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.io.stream.Writeable.Writer; import org.elasticsearch.common.settings.SecureString; -import org.elasticsearch.common.text.Text; import org.elasticsearch.common.util.ByteUtils; import org.elasticsearch.core.CharArrays; import org.elasticsearch.core.Nullable; import org.elasticsearch.core.TimeValue; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.XContentType; import java.io.IOException; @@ -419,7 +419,8 @@ public abstract class StreamOutput extends OutputStream { writeInt(spare.length()); write(spare.bytes(), 0, spare.length()); } else { - BytesReference bytes = text.bytes(); + var encoded = text.bytes(); + BytesReference bytes = new BytesArray(encoded.bytes(), encoded.offset(), encoded.length()); writeInt(bytes.length()); bytes.writeTo(this); } diff --git a/server/src/main/java/org/elasticsearch/search/SearchHit.java b/server/src/main/java/org/elasticsearch/search/SearchHit.java index 950df0dc2290..a9c8e01fa32a 100644 --- a/server/src/main/java/org/elasticsearch/search/SearchHit.java +++ b/server/src/main/java/org/elasticsearch/search/SearchHit.java @@ -20,7 +20,6 @@ import org.elasticsearch.common.document.DocumentField; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; -import org.elasticsearch.common.text.Text; import org.elasticsearch.common.util.Maps; import org.elasticsearch.common.xcontent.ChunkedToXContent; import org.elasticsearch.common.xcontent.XContentHelper; @@ -39,6 +38,7 @@ import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; import org.elasticsearch.search.lookup.Source; import org.elasticsearch.transport.LeakTracker; import org.elasticsearch.transport.RemoteClusterAware; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.ToXContentFragment; import org.elasticsearch.xcontent.ToXContentObject; import org.elasticsearch.xcontent.XContentBuilder; diff --git a/server/src/main/java/org/elasticsearch/search/SearchShardTarget.java b/server/src/main/java/org/elasticsearch/search/SearchShardTarget.java index ae27fba37372..41664c30cc1b 100644 --- a/server/src/main/java/org/elasticsearch/search/SearchShardTarget.java +++ b/server/src/main/java/org/elasticsearch/search/SearchShardTarget.java @@ -12,10 +12,10 @@ package org.elasticsearch.search; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; -import org.elasticsearch.common.text.Text; import org.elasticsearch.core.Nullable; import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.transport.RemoteClusterAware; +import org.elasticsearch.xcontent.Text; import java.io.IOException; import java.util.Objects; diff --git a/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/DefaultHighlighter.java b/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/DefaultHighlighter.java index 9f888c1f08ba..3efbcd15140e 100644 --- a/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/DefaultHighlighter.java +++ b/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/DefaultHighlighter.java @@ -21,7 +21,6 @@ import org.apache.lucene.util.CollectionUtil; import org.elasticsearch.common.CheckedSupplier; import org.elasticsearch.common.Strings; import org.elasticsearch.common.lucene.Lucene; -import org.elasticsearch.common.text.Text; import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.mapper.IdFieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; @@ -34,6 +33,7 @@ import org.elasticsearch.lucene.search.uhighlight.QueryMaxAnalyzedOffset; import org.elasticsearch.lucene.search.uhighlight.Snippet; import org.elasticsearch.search.fetch.FetchContext; import org.elasticsearch.search.fetch.FetchSubPhase; +import org.elasticsearch.xcontent.Text; import java.io.IOException; import java.text.BreakIterator; diff --git a/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/FastVectorHighlighter.java b/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/FastVectorHighlighter.java index ddf3645af4f4..d0060142890d 100644 --- a/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/FastVectorHighlighter.java +++ b/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/FastVectorHighlighter.java @@ -23,7 +23,6 @@ import org.apache.lucene.search.vectorhighlight.SimpleFragListBuilder; import org.apache.lucene.search.vectorhighlight.SingleFragListBuilder; import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.text.Text; import org.elasticsearch.common.util.CollectionUtils; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.TextSearchInfo; @@ -33,6 +32,7 @@ import org.elasticsearch.search.fetch.FetchSubPhase; import org.elasticsearch.search.fetch.subphase.highlight.SearchHighlightContext.Field; import org.elasticsearch.search.fetch.subphase.highlight.SearchHighlightContext.FieldOptions; import org.elasticsearch.search.lookup.Source; +import org.elasticsearch.xcontent.Text; import java.io.IOException; import java.text.BreakIterator; diff --git a/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightField.java b/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightField.java index 9516465309c3..e5b2b14ccb6b 100644 --- a/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightField.java +++ b/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightField.java @@ -12,7 +12,7 @@ package org.elasticsearch.search.fetch.subphase.highlight; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; -import org.elasticsearch.common.text.Text; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.ToXContentFragment; import org.elasticsearch.xcontent.XContentBuilder; diff --git a/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/PlainHighlighter.java b/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/PlainHighlighter.java index e1c09e925c1b..47944ef65da5 100644 --- a/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/PlainHighlighter.java +++ b/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/PlainHighlighter.java @@ -24,12 +24,12 @@ import org.apache.lucene.search.highlight.SimpleSpanFragmenter; import org.apache.lucene.search.highlight.TextFragment; import org.apache.lucene.util.BytesRefHash; import org.elasticsearch.common.lucene.Lucene; -import org.elasticsearch.common.text.Text; import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.lucene.search.uhighlight.QueryMaxAnalyzedOffset; import org.elasticsearch.search.fetch.FetchContext; import org.elasticsearch.search.fetch.FetchSubPhase; +import org.elasticsearch.xcontent.Text; import java.io.IOException; import java.util.ArrayList; diff --git a/server/src/main/java/org/elasticsearch/search/searchafter/SearchAfterBuilder.java b/server/src/main/java/org/elasticsearch/search/searchafter/SearchAfterBuilder.java index 7f7820773319..1ea702aa75e7 100644 --- a/server/src/main/java/org/elasticsearch/search/searchafter/SearchAfterBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/searchafter/SearchAfterBuilder.java @@ -19,12 +19,12 @@ import org.elasticsearch.common.Strings; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; -import org.elasticsearch.common.text.Text; import org.elasticsearch.core.Nullable; import org.elasticsearch.index.fielddata.IndexFieldData; import org.elasticsearch.search.DocValueFormat; import org.elasticsearch.search.sort.SortAndFormats; import org.elasticsearch.xcontent.ParseField; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.ToXContentObject; import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentParser; diff --git a/server/src/main/java/org/elasticsearch/search/suggest/Suggest.java b/server/src/main/java/org/elasticsearch/search/suggest/Suggest.java index 174f38d0cb05..ccd9d88c1b26 100644 --- a/server/src/main/java/org/elasticsearch/search/suggest/Suggest.java +++ b/server/src/main/java/org/elasticsearch/search/suggest/Suggest.java @@ -14,13 +14,13 @@ import org.elasticsearch.common.io.stream.NamedWriteable; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; -import org.elasticsearch.common.text.Text; import org.elasticsearch.rest.action.search.RestSearchAction; import org.elasticsearch.search.aggregations.Aggregation; import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry; import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry.Option; import org.elasticsearch.search.suggest.completion.CompletionSuggestion; import org.elasticsearch.xcontent.ParseField; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.ToXContentFragment; import org.elasticsearch.xcontent.XContentBuilder; diff --git a/server/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java b/server/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java index fd6cfeaea639..9cb1815c3689 100644 --- a/server/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java +++ b/server/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java @@ -19,10 +19,10 @@ import org.apache.lucene.search.suggest.document.CompletionQuery; import org.apache.lucene.search.suggest.document.TopSuggestDocs; import org.apache.lucene.search.suggest.document.TopSuggestDocsCollector; import org.apache.lucene.util.CharsRefBuilder; -import org.elasticsearch.common.text.Text; import org.elasticsearch.index.mapper.CompletionFieldMapper; import org.elasticsearch.search.suggest.Suggest; import org.elasticsearch.search.suggest.Suggester; +import org.elasticsearch.xcontent.Text; import java.io.IOException; import java.util.Collections; diff --git a/server/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestion.java b/server/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestion.java index f90590b6fa96..6493540750a5 100644 --- a/server/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestion.java +++ b/server/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestion.java @@ -14,12 +14,12 @@ import org.apache.lucene.util.PriorityQueue; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.lucene.Lucene; -import org.elasticsearch.common.text.Text; import org.elasticsearch.common.util.Maps; import org.elasticsearch.common.util.set.Sets; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.suggest.Suggest; import org.elasticsearch.xcontent.ParseField; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.XContentBuilder; import java.io.IOException; diff --git a/server/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggester.java b/server/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggester.java index 57eb7cfd7351..ebaf969b40ae 100644 --- a/server/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggester.java +++ b/server/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggester.java @@ -19,7 +19,6 @@ import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.BytesRefBuilder; import org.apache.lucene.util.CharsRefBuilder; import org.elasticsearch.common.lucene.Lucene; -import org.elasticsearch.common.text.Text; import org.elasticsearch.index.query.AbstractQueryBuilder; import org.elasticsearch.index.query.ParsedQuery; import org.elasticsearch.index.query.QueryBuilder; @@ -31,6 +30,7 @@ import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry.Option; import org.elasticsearch.search.suggest.Suggester; import org.elasticsearch.search.suggest.SuggestionSearchContext.SuggestionContext; import org.elasticsearch.search.suggest.phrase.NoisyChannelSpellChecker.Result; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.XContentFactory; import org.elasticsearch.xcontent.XContentParser; diff --git a/server/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestion.java b/server/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestion.java index 9afdbc8eb3a7..ad50ecfd7444 100644 --- a/server/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestion.java +++ b/server/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestion.java @@ -11,9 +11,9 @@ package org.elasticsearch.search.suggest.phrase; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.text.Text; import org.elasticsearch.search.suggest.Suggest; import org.elasticsearch.search.suggest.Suggest.Suggestion; +import org.elasticsearch.xcontent.Text; import java.io.IOException; import java.util.Objects; diff --git a/server/src/main/java/org/elasticsearch/search/suggest/term/TermSuggester.java b/server/src/main/java/org/elasticsearch/search/suggest/term/TermSuggester.java index b6e2ba7df0b9..a3e82c0bf6d6 100644 --- a/server/src/main/java/org/elasticsearch/search/suggest/term/TermSuggester.java +++ b/server/src/main/java/org/elasticsearch/search/suggest/term/TermSuggester.java @@ -16,11 +16,11 @@ import org.apache.lucene.search.spell.SuggestWord; import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.BytesRefBuilder; import org.apache.lucene.util.CharsRefBuilder; -import org.elasticsearch.common.bytes.BytesArray; -import org.elasticsearch.common.text.Text; import org.elasticsearch.search.suggest.Suggester; import org.elasticsearch.search.suggest.SuggestionSearchContext.SuggestionContext; import org.elasticsearch.search.suggest.phrase.DirectCandidateGenerator; +import org.elasticsearch.xcontent.Text; +import org.elasticsearch.xcontent.XContentString; import java.io.IOException; import java.util.ArrayList; @@ -47,7 +47,9 @@ public final class TermSuggester extends Suggester { indexReader, suggestion.getDirectSpellCheckerSettings().suggestMode() ); - Text key = new Text(new BytesArray(token.term.bytes())); + var termBytes = token.term.bytes(); + var termEncoded = new XContentString.UTF8Bytes(termBytes.bytes, termBytes.offset, termBytes.length); + Text key = new Text(termEncoded); TermSuggestion.Entry resultEntry = new TermSuggestion.Entry(key, token.startOffset, token.endOffset - token.startOffset); for (SuggestWord suggestWord : suggestedWords) { Text word = new Text(suggestWord.string); @@ -96,7 +98,9 @@ public final class TermSuggester extends Suggester { TermSuggestion termSuggestion = new TermSuggestion(name, suggestion.getSize(), suggestion.getDirectSpellCheckerSettings().sort()); List tokens = queryTerms(suggestion, spare); for (Token token : tokens) { - Text key = new Text(new BytesArray(token.term.bytes())); + var termBytes = token.term.bytes(); + var termEncoded = new XContentString.UTF8Bytes(termBytes.bytes, termBytes.offset, termBytes.length); + Text key = new Text(termEncoded); TermSuggestion.Entry resultEntry = new TermSuggestion.Entry(key, token.startOffset, token.endOffset - token.startOffset); termSuggestion.addTerm(resultEntry); } diff --git a/server/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestion.java b/server/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestion.java index 2c86aa75ebf7..05330c963206 100644 --- a/server/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestion.java +++ b/server/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestion.java @@ -10,12 +10,12 @@ package org.elasticsearch.search.suggest.term; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.text.Text; import org.elasticsearch.search.suggest.SortBy; import org.elasticsearch.search.suggest.Suggest; import org.elasticsearch.search.suggest.Suggest.Suggestion; import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry.Option; import org.elasticsearch.xcontent.ParseField; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.XContentBuilder; import java.io.IOException; diff --git a/server/src/test/java/org/elasticsearch/action/admin/cluster/tasks/PendingClusterTasksResponseTests.java b/server/src/test/java/org/elasticsearch/action/admin/cluster/tasks/PendingClusterTasksResponseTests.java index e00c8d5d0444..9c00c772bb69 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/cluster/tasks/PendingClusterTasksResponseTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/cluster/tasks/PendingClusterTasksResponseTests.java @@ -11,9 +11,9 @@ package org.elasticsearch.action.admin.cluster.tasks; import org.elasticsearch.cluster.service.PendingClusterTask; import org.elasticsearch.common.Priority; -import org.elasticsearch.common.text.Text; import org.elasticsearch.test.AbstractChunkedSerializingTestCase; import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xcontent.Text; import java.util.ArrayList; diff --git a/server/src/test/java/org/elasticsearch/action/search/SearchPhaseControllerTests.java b/server/src/test/java/org/elasticsearch/action/search/SearchPhaseControllerTests.java index 5f6e0178db1a..04bec6276f9d 100644 --- a/server/src/test/java/org/elasticsearch/action/search/SearchPhaseControllerTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/SearchPhaseControllerTests.java @@ -30,7 +30,6 @@ import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.common.lucene.search.TopDocsAndMaxScore; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.text.Text; import org.elasticsearch.common.util.BigArrays; import org.elasticsearch.common.util.concurrent.AtomicArray; import org.elasticsearch.common.util.concurrent.EsExecutors; @@ -71,6 +70,7 @@ import org.elasticsearch.tasks.TaskId; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.threadpool.TestThreadPool; import org.elasticsearch.threadpool.ThreadPool; +import org.elasticsearch.xcontent.Text; import org.junit.After; import org.junit.Before; diff --git a/server/src/test/java/org/elasticsearch/action/search/SearchResponseMergerTests.java b/server/src/test/java/org/elasticsearch/action/search/SearchResponseMergerTests.java index d54ac9c66d9a..8cf9428be9d9 100644 --- a/server/src/test/java/org/elasticsearch/action/search/SearchResponseMergerTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/SearchResponseMergerTests.java @@ -13,7 +13,6 @@ import org.apache.lucene.search.SortField; import org.apache.lucene.search.TotalHits; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.action.search.TransportSearchAction.SearchTimeProvider; -import org.elasticsearch.common.text.Text; import org.elasticsearch.common.time.DateFormatter; import org.elasticsearch.core.Tuple; import org.elasticsearch.index.Index; @@ -40,6 +39,7 @@ import org.elasticsearch.search.suggest.completion.CompletionSuggestion; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.transport.RemoteClusterAware; import org.elasticsearch.transport.RemoteClusterService; +import org.elasticsearch.xcontent.Text; import org.junit.Before; import java.time.ZoneId; diff --git a/server/src/test/java/org/elasticsearch/common/xcontent/BaseXContentTestCase.java b/server/src/test/java/org/elasticsearch/common/xcontent/BaseXContentTestCase.java index 20f33b9f71d1..979224ba8f9b 100644 --- a/server/src/test/java/org/elasticsearch/common/xcontent/BaseXContentTestCase.java +++ b/server/src/test/java/org/elasticsearch/common/xcontent/BaseXContentTestCase.java @@ -16,13 +16,13 @@ import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.geo.GeoPoint; -import org.elasticsearch.common.text.Text; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.core.PathUtils; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xcontent.NamedObjectNotFoundException; import org.elasticsearch.xcontent.NamedXContentRegistry; import org.elasticsearch.xcontent.ParseField; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.ToXContent; import org.elasticsearch.xcontent.ToXContentObject; import org.elasticsearch.xcontent.XContent; @@ -34,6 +34,7 @@ import org.elasticsearch.xcontent.XContentParseException; import org.elasticsearch.xcontent.XContentParser; import org.elasticsearch.xcontent.XContentParser.Token; import org.elasticsearch.xcontent.XContentParserConfiguration; +import org.elasticsearch.xcontent.XContentString; import org.elasticsearch.xcontent.XContentType; import org.hamcrest.Matcher; import org.hamcrest.Matchers; @@ -43,6 +44,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.math.BigDecimal; import java.math.BigInteger; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.time.DayOfWeek; @@ -376,15 +378,18 @@ public abstract class BaseXContentTestCase extends ESTestCase { assertResult("{'text':''}", () -> builder().startObject().field("text", new Text("")).endObject()); assertResult("{'text':'foo bar'}", () -> builder().startObject().field("text", new Text("foo bar")).endObject()); - final BytesReference random = new BytesArray(randomBytes()); - XContentBuilder builder = builder().startObject().field("text", new Text(random)).endObject(); + final var random = randomBytes(); + XContentBuilder builder = builder().startObject().field("text", new Text(new XContentString.UTF8Bytes(random))).endObject(); try (XContentParser parser = createParser(xcontentType().xContent(), BytesReference.bytes(builder))) { assertSame(parser.nextToken(), Token.START_OBJECT); assertSame(parser.nextToken(), Token.FIELD_NAME); assertEquals(parser.currentName(), "text"); assertTrue(parser.nextToken().isValue()); - assertThat(new BytesRef(parser.charBuffer()).utf8ToString(), equalTo(random.utf8ToString())); + assertThat( + new BytesRef(parser.charBuffer()).utf8ToString(), + equalTo(StandardCharsets.UTF_8.decode(ByteBuffer.wrap(random)).toString()) + ); assertSame(parser.nextToken(), Token.END_OBJECT); assertNull(parser.nextToken()); } @@ -590,7 +595,10 @@ public abstract class BaseXContentTestCase extends ESTestCase { objects.put("{'objects':[1,1,2,3,5,8,13]}", new Object[] { 1L, 1L, 2L, 3L, 5L, 8L, 13L }); objects.put("{'objects':[1,1,2,3,5,8]}", new Object[] { (short) 1, (short) 1, (short) 2, (short) 3, (short) 5, (short) 8 }); objects.put("{'objects':['a','b','c']}", new Object[] { "a", "b", "c" }); - objects.put("{'objects':['a','b','c']}", new Object[] { new Text("a"), new Text(new BytesArray("b")), new Text("c") }); + objects.put( + "{'objects':['a','b','c']}", + new Object[] { new Text("a"), new Text(new XContentString.UTF8Bytes("b".getBytes(StandardCharsets.UTF_8))), new Text("c") } + ); objects.put("{'objects':null}", null); objects.put("{'objects':[null,null,null]}", new Object[] { null, null, null }); objects.put("{'objects':['OPEN','CLOSE']}", IndexMetadata.State.values()); @@ -636,7 +644,7 @@ public abstract class BaseXContentTestCase extends ESTestCase { object.put("{'object':1}", (short) 1); object.put("{'object':'string'}", "string"); object.put("{'object':'a'}", new Text("a")); - object.put("{'object':'b'}", new Text(new BytesArray("b"))); + object.put("{'object':'b'}", new Text(new XContentString.UTF8Bytes("b".getBytes(StandardCharsets.UTF_8)))); object.put("{'object':null}", null); object.put("{'object':'OPEN'}", IndexMetadata.State.OPEN); object.put("{'object':'NM'}", DistanceUnit.NAUTICALMILES); diff --git a/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/CustomHighlighter.java b/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/CustomHighlighter.java index 64bd5ebf29ba..7e02e005a33c 100644 --- a/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/CustomHighlighter.java +++ b/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/CustomHighlighter.java @@ -8,8 +8,8 @@ */ package org.elasticsearch.search.fetch.subphase.highlight; -import org.elasticsearch.common.text.Text; import org.elasticsearch.index.mapper.MappedFieldType; +import org.elasticsearch.xcontent.Text; import java.util.ArrayList; import java.util.List; diff --git a/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightFieldTests.java b/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightFieldTests.java index a609a13a8783..5ba535ae8e30 100644 --- a/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightFieldTests.java +++ b/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightFieldTests.java @@ -12,9 +12,9 @@ package org.elasticsearch.search.fetch.subphase.highlight; import org.elasticsearch.common.Strings; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.text.Text; import org.elasticsearch.search.SearchResponseUtils; import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.ToXContent; import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentFactory; diff --git a/server/src/test/java/org/elasticsearch/search/query/QueryPhaseTimeoutTests.java b/server/src/test/java/org/elasticsearch/search/query/QueryPhaseTimeoutTests.java index 35074930d967..e19a85f4f2a0 100644 --- a/server/src/test/java/org/elasticsearch/search/query/QueryPhaseTimeoutTests.java +++ b/server/src/test/java/org/elasticsearch/search/query/QueryPhaseTimeoutTests.java @@ -44,7 +44,6 @@ import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchShardTask; import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.text.Text; import org.elasticsearch.core.CheckedConsumer; import org.elasticsearch.index.query.MatchAllQueryBuilder; import org.elasticsearch.index.query.ParsedQuery; @@ -61,6 +60,7 @@ import org.elasticsearch.search.suggest.SuggestBuilder; import org.elasticsearch.search.suggest.Suggester; import org.elasticsearch.search.suggest.SuggestionSearchContext; import org.elasticsearch.test.TestSearchContext; +import org.elasticsearch.xcontent.Text; import org.hamcrest.Matchers; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/server/src/test/java/org/elasticsearch/search/searchafter/SearchAfterBuilderTests.java b/server/src/test/java/org/elasticsearch/search/searchafter/SearchAfterBuilderTests.java index c015f93ea866..031b891e4935 100644 --- a/server/src/test/java/org/elasticsearch/search/searchafter/SearchAfterBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/searchafter/SearchAfterBuilderTests.java @@ -21,7 +21,6 @@ import org.apache.lucene.util.BytesRef; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; -import org.elasticsearch.common.text.Text; import org.elasticsearch.common.util.BigArrays; import org.elasticsearch.index.fielddata.IndexFieldData; import org.elasticsearch.search.DocValueFormat; @@ -30,6 +29,7 @@ import org.elasticsearch.search.sort.BucketedSort; import org.elasticsearch.search.sort.SortAndFormats; import org.elasticsearch.search.sort.SortOrder; import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.XContent; import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentFactory; diff --git a/server/src/test/java/org/elasticsearch/search/suggest/CompletionSuggestionOptionTests.java b/server/src/test/java/org/elasticsearch/search/suggest/CompletionSuggestionOptionTests.java index db698af24dcf..6eb8e5659f75 100644 --- a/server/src/test/java/org/elasticsearch/search/suggest/CompletionSuggestionOptionTests.java +++ b/server/src/test/java/org/elasticsearch/search/suggest/CompletionSuggestionOptionTests.java @@ -10,7 +10,6 @@ package org.elasticsearch.search.suggest; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.text.Text; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHitTests; import org.elasticsearch.search.SearchResponseUtils; @@ -18,6 +17,7 @@ import org.elasticsearch.search.suggest.completion.CompletionSuggestion; import org.elasticsearch.search.suggest.completion.CompletionSuggestion.Entry.Option; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xcontent.ObjectParser; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.ToXContent; import org.elasticsearch.xcontent.XContentParser; import org.elasticsearch.xcontent.XContentType; diff --git a/server/src/test/java/org/elasticsearch/search/suggest/SuggestTests.java b/server/src/test/java/org/elasticsearch/search/suggest/SuggestTests.java index 1e50bb67f672..f844f77d1dce 100644 --- a/server/src/test/java/org/elasticsearch/search/suggest/SuggestTests.java +++ b/server/src/test/java/org/elasticsearch/search/suggest/SuggestTests.java @@ -17,7 +17,6 @@ import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.text.Text; import org.elasticsearch.core.CheckedFunction; import org.elasticsearch.rest.action.search.RestSearchAction; import org.elasticsearch.search.SearchModule; @@ -33,6 +32,7 @@ import org.elasticsearch.test.TransportVersionUtils; import org.elasticsearch.xcontent.NamedXContentRegistry; import org.elasticsearch.xcontent.ObjectParser; import org.elasticsearch.xcontent.ParseField; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.ToXContent; import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentFactory; diff --git a/server/src/test/java/org/elasticsearch/search/suggest/SuggestionEntryTests.java b/server/src/test/java/org/elasticsearch/search/suggest/SuggestionEntryTests.java index 585f369bf30a..35fdc837c4b7 100644 --- a/server/src/test/java/org/elasticsearch/search/suggest/SuggestionEntryTests.java +++ b/server/src/test/java/org/elasticsearch/search/suggest/SuggestionEntryTests.java @@ -10,7 +10,6 @@ package org.elasticsearch.search.suggest; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.text.Text; import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry; import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry.Option; @@ -20,6 +19,7 @@ import org.elasticsearch.search.suggest.term.TermSuggestion; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xcontent.ObjectParser; import org.elasticsearch.xcontent.ParseField; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.ToXContent; import org.elasticsearch.xcontent.XContentParser; import org.elasticsearch.xcontent.XContentType; diff --git a/server/src/test/java/org/elasticsearch/search/suggest/SuggestionOptionTests.java b/server/src/test/java/org/elasticsearch/search/suggest/SuggestionOptionTests.java index 96b9d8bb78a5..61f5ae38a1df 100644 --- a/server/src/test/java/org/elasticsearch/search/suggest/SuggestionOptionTests.java +++ b/server/src/test/java/org/elasticsearch/search/suggest/SuggestionOptionTests.java @@ -10,11 +10,11 @@ package org.elasticsearch.search.suggest; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.text.Text; import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry.Option; import org.elasticsearch.search.suggest.phrase.PhraseSuggestion; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xcontent.ConstructingObjectParser; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.ToXContent; import org.elasticsearch.xcontent.XContentParser; import org.elasticsearch.xcontent.XContentType; diff --git a/server/src/test/java/org/elasticsearch/search/suggest/SuggestionTests.java b/server/src/test/java/org/elasticsearch/search/suggest/SuggestionTests.java index 343b89e15f5f..ed5d67e4d3a8 100644 --- a/server/src/test/java/org/elasticsearch/search/suggest/SuggestionTests.java +++ b/server/src/test/java/org/elasticsearch/search/suggest/SuggestionTests.java @@ -10,7 +10,6 @@ package org.elasticsearch.search.suggest; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.text.Text; import org.elasticsearch.rest.action.search.RestSearchAction; import org.elasticsearch.search.SearchResponseUtils; import org.elasticsearch.search.suggest.Suggest.Suggestion; @@ -22,6 +21,7 @@ import org.elasticsearch.search.suggest.term.TermSuggestion; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xcontent.NamedObjectNotFoundException; import org.elasticsearch.xcontent.NamedXContentRegistry; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.ToXContent; import org.elasticsearch.xcontent.XContent; import org.elasticsearch.xcontent.XContentParser; diff --git a/server/src/test/java/org/elasticsearch/search/suggest/TermSuggestionOptionTests.java b/server/src/test/java/org/elasticsearch/search/suggest/TermSuggestionOptionTests.java index 22bee11cea01..915b1b5127ba 100644 --- a/server/src/test/java/org/elasticsearch/search/suggest/TermSuggestionOptionTests.java +++ b/server/src/test/java/org/elasticsearch/search/suggest/TermSuggestionOptionTests.java @@ -10,11 +10,11 @@ package org.elasticsearch.search.suggest; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.text.Text; import org.elasticsearch.search.suggest.term.TermSuggestion; import org.elasticsearch.search.suggest.term.TermSuggestion.Entry.Option; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xcontent.ConstructingObjectParser; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.ToXContent; import org.elasticsearch.xcontent.XContentParser; import org.elasticsearch.xcontent.XContentType; diff --git a/server/src/test/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionTests.java b/server/src/test/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionTests.java index 3877e382d72e..cbaf847a9ff9 100644 --- a/server/src/test/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionTests.java +++ b/server/src/test/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionTests.java @@ -9,9 +9,9 @@ package org.elasticsearch.search.suggest.completion; -import org.elasticsearch.common.text.Text; import org.elasticsearch.search.suggest.Suggest; import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xcontent.Text; import java.util.ArrayList; import java.util.Collections; diff --git a/test/framework/src/main/java/org/elasticsearch/search/RandomSearchRequestGenerator.java b/test/framework/src/main/java/org/elasticsearch/search/RandomSearchRequestGenerator.java index 6e8cf735983a..e10a20d062c5 100644 --- a/test/framework/src/main/java/org/elasticsearch/search/RandomSearchRequestGenerator.java +++ b/test/framework/src/main/java/org/elasticsearch/search/RandomSearchRequestGenerator.java @@ -14,7 +14,6 @@ import org.elasticsearch.action.search.SearchType; import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.text.Text; import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.core.TimeValue; import org.elasticsearch.index.query.QueryBuilders; @@ -38,6 +37,7 @@ import org.elasticsearch.search.suggest.SuggestBuilder; import org.elasticsearch.search.vectors.KnnSearchBuilder; import org.elasticsearch.search.vectors.RescoreVectorBuilder; import org.elasticsearch.test.AbstractQueryTestCase; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentFactory; import org.elasticsearch.xcontent.XContentParser; diff --git a/test/framework/src/main/java/org/elasticsearch/search/SearchResponseUtils.java b/test/framework/src/main/java/org/elasticsearch/search/SearchResponseUtils.java index 032155073666..de94a81eb00c 100644 --- a/test/framework/src/main/java/org/elasticsearch/search/SearchResponseUtils.java +++ b/test/framework/src/main/java/org/elasticsearch/search/SearchResponseUtils.java @@ -24,7 +24,6 @@ import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.document.DocumentField; import org.elasticsearch.common.lucene.Lucene; -import org.elasticsearch.common.text.Text; import org.elasticsearch.common.util.concurrent.ConcurrentCollections; import org.elasticsearch.common.xcontent.XContentParserUtils; import org.elasticsearch.core.RefCounted; @@ -55,6 +54,7 @@ import org.elasticsearch.xcontent.ConstructingObjectParser; import org.elasticsearch.xcontent.InstantiatingObjectParser; import org.elasticsearch.xcontent.ObjectParser; import org.elasticsearch.xcontent.ParseField; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentParser; diff --git a/test/framework/src/main/java/org/elasticsearch/search/fetch/HighlighterTestCase.java b/test/framework/src/main/java/org/elasticsearch/search/fetch/HighlighterTestCase.java index 5fd3ead5bf81..72417f5e61b2 100644 --- a/test/framework/src/main/java/org/elasticsearch/search/fetch/HighlighterTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/search/fetch/HighlighterTestCase.java @@ -15,7 +15,6 @@ import org.apache.lucene.index.FilterLeafReader; import org.apache.lucene.index.IndexableField; import org.apache.lucene.index.LeafReader; import org.apache.lucene.index.StoredFields; -import org.elasticsearch.common.text.Text; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.mapper.MapperServiceTestCase; import org.elasticsearch.index.mapper.ParsedDocument; @@ -30,6 +29,7 @@ import org.elasticsearch.search.fetch.subphase.highlight.HighlightPhase; import org.elasticsearch.search.fetch.subphase.highlight.Highlighter; import org.elasticsearch.search.fetch.subphase.highlight.PlainHighlighter; import org.elasticsearch.search.lookup.Source; +import org.elasticsearch.xcontent.Text; import java.io.IOException; import java.util.ArrayList; diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/highlight/SemanticTextHighlighter.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/highlight/SemanticTextHighlighter.java index 4dff2723115e..1ad205cd6aad 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/highlight/SemanticTextHighlighter.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/highlight/SemanticTextHighlighter.java @@ -21,7 +21,6 @@ import org.apache.lucene.search.QueryVisitor; import org.apache.lucene.search.ScoreMode; import org.apache.lucene.search.Scorer; import org.apache.lucene.search.Weight; -import org.elasticsearch.common.text.Text; import org.elasticsearch.common.xcontent.support.XContentMapValues; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.vectors.DenseVectorFieldMapper.DenseVectorFieldType; @@ -34,6 +33,7 @@ import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; import org.elasticsearch.search.fetch.subphase.highlight.HighlightUtils; import org.elasticsearch.search.fetch.subphase.highlight.Highlighter; import org.elasticsearch.search.vectors.VectorData; +import org.elasticsearch.xcontent.Text; import org.elasticsearch.xpack.core.ml.search.SparseVectorQueryWrapper; import org.elasticsearch.xpack.inference.mapper.OffsetSourceField; import org.elasticsearch.xpack.inference.mapper.OffsetSourceFieldMapper;