Skip to content

Commit

Permalink
Add support for deep copying SearchRequest (opensearch-project#12295)
Browse files Browse the repository at this point in the history
Signed-off-by: Chenyang Ji <[email protected]>
  • Loading branch information
ansjcy authored and parv0201 committed Jun 10, 2024
1 parent 67fe5c4 commit b458503
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- [Remote Store] Add settings for remote path type and hash algorithm ([#13225](https://github.com/opensearch-project/OpenSearch/pull/13225))
- [Remote Store] Upload remote paths during remote enabled index creation ([#13386](https://github.com/opensearch-project/OpenSearch/pull/13386))
- [Search Pipeline] Handle default pipeline for multiple indices ([#13276](https://github.com/opensearch-project/OpenSearch/pull/13276))
- Add support for deep copying SearchRequest ([#12295](https://github.com/opensearch-project/OpenSearch/pull/12295))

### Dependencies
- Bump `org.apache.commons:commons-configuration2` from 2.10.0 to 2.10.1 ([#12896](https://github.com/opensearch-project/OpenSearch/pull/12896))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.opensearch.action.support.IndicesOptions;
import org.opensearch.common.Nullable;
import org.opensearch.common.annotation.PublicApi;
import org.opensearch.common.io.stream.BytesStreamOutput;
import org.opensearch.common.unit.TimeValue;
import org.opensearch.core.common.Strings;
import org.opensearch.core.common.io.stream.StreamInput;
Expand Down Expand Up @@ -161,6 +162,18 @@ public SearchRequest(String[] indices, SearchSourceBuilder source) {
this.source = source;
}

/**
* Deep clone a SearchRequest
*
* @return a copy of the current SearchRequest
*/
public SearchRequest deepCopy() throws IOException {
BytesStreamOutput out = new BytesStreamOutput();
this.writeTo(out);
StreamInput in = out.bytes().streamInput();
return new SearchRequest(in);
}

/**
* Creates a new sub-search request starting from the original search request that is provided.
* For internal use only, allows to fork a search request into multiple search requests that will be executed independently.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import org.opensearch.search.Scroll;
import org.opensearch.search.builder.PointInTimeBuilder;
import org.opensearch.search.builder.SearchSourceBuilder;
import org.opensearch.search.fetch.subphase.FetchSourceContext;
import org.opensearch.search.rescore.QueryRescorerBuilder;
import org.opensearch.test.OpenSearchTestCase;
import org.opensearch.test.VersionUtils;
Expand Down Expand Up @@ -76,6 +77,35 @@ protected SearchRequest createSearchRequest() throws IOException {
);
}

public void testClone() throws IOException {
SearchRequest searchRequest = new SearchRequest();
SearchRequest clonedRequest = searchRequest.deepCopy();
assertEquals(searchRequest.hashCode(), clonedRequest.hashCode());
assertNotSame(searchRequest, clonedRequest);

String[] includes = new String[] { "field1.*" };
String[] excludes = new String[] { "field2.*" };
FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);
SearchSourceBuilder source = new SearchSourceBuilder().fetchSource(fetchSourceContext);
SearchRequest complexSearchRequest = createSearchRequest().source(source);
complexSearchRequest.requestCache(false);
complexSearchRequest.scroll(new TimeValue(1000));
SearchRequest clonedComplexRequest = complexSearchRequest.deepCopy();
assertEquals(complexSearchRequest.hashCode(), clonedComplexRequest.hashCode());
assertNotSame(complexSearchRequest, clonedComplexRequest);
assertEquals(fetchSourceContext, clonedComplexRequest.source().fetchSource());
assertNotSame(fetchSourceContext, clonedComplexRequest.source().fetchSource());
// Change the value of the original includes array and excludes array
includes[0] = "new_field1.*";
excludes[0] = "new_field2.*";
// Values in the original fetchSource object should be updated
assertEquals("new_field1.*", complexSearchRequest.source().fetchSource().includes()[0]);
assertEquals("new_field2.*", complexSearchRequest.source().fetchSource().excludes()[0]);
// Values in the cloned fetchSource object should not be updated
assertEquals("field1.*", clonedComplexRequest.source().fetchSource().includes()[0]);
assertEquals("field2.*", clonedComplexRequest.source().fetchSource().excludes()[0]);
}

public void testWithLocalReduction() {
expectThrows(NullPointerException.class, () -> SearchRequest.subSearchRequest(null, Strings.EMPTY_ARRAY, "", 0, randomBoolean()));
SearchRequest request = new SearchRequest();
Expand Down

0 comments on commit b458503

Please sign in to comment.