Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add FilterFieldType #17627

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- Fix systemd integTest on deb regarding path ownership check ([#17641](https://github.com/opensearch-project/OpenSearch/pull/17641))
- Add dfs transformation function in XContentMapValues ([#17612](https://github.com/opensearch-project/OpenSearch/pull/17612))
- Added Kinesis support as a plugin for the pull-based ingestion ([#17615](https://github.com/opensearch-project/OpenSearch/pull/17615))
- Add FilterFieldType for developers who want to wrap MappedFieldType ([#17627](https://github.com/opensearch-project/OpenSearch/pull/17627))
- [Security Manager Replacement] Create initial Java Agent to intercept Socket::connect calls ([#17724](https://github.com/opensearch-project/OpenSearch/pull/17724))

### Changed
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/

package org.opensearch.index.mapper;

import org.opensearch.test.OpenSearchTestCase;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

public class FilterFieldTypeTest extends OpenSearchTestCase {

private static final class MethodSignature {
private final String name;
private final Class<?> returnType;
private final Class<?>[] parameterTypes;

public MethodSignature(String name, Class<?> returnType, Class<?>[] parameterTypes) {
this.name = name;
this.returnType = returnType;
this.parameterTypes = parameterTypes;
}

@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
MethodSignature that = (MethodSignature) o;
return Objects.equals(name, that.name)
&& Objects.equals(returnType, that.returnType)
&& Objects.deepEquals(parameterTypes, that.parameterTypes);
}

@Override
public int hashCode() {
return Objects.hash(name, returnType, Arrays.hashCode(parameterTypes));
}
}

private static final Set<MethodSignature> EXCLUDED_SIGNATURES = Set.of(new MethodSignature("typeName", String.class, new Class<?>[0]));

public void testAllMethodsDelegated() {
Method[] mappedFieldTypeMethods = MappedFieldType.class.getMethods();
Method[] filterFieldTypeMethods = FilterFieldType.class.getMethods();

Set<MethodSignature> mappedFieldTypeMethodSignatures = new HashSet<>();
for (Method method : mappedFieldTypeMethods) {
if (method.getDeclaringClass() == MappedFieldType.class
&& Modifier.isFinal(method.getModifiers()) == false
&& Modifier.isStatic(method.getModifiers()) == false) {
mappedFieldTypeMethodSignatures.add(
new MethodSignature(method.getName(), method.getReturnType(), method.getParameterTypes())
);
}
}

Set<MethodSignature> filterFieldTypeMethodSignatures = new HashSet<>();
for (Method method : filterFieldTypeMethods) {
if (method.getDeclaringClass() == FilterFieldType.class) {
filterFieldTypeMethodSignatures.add(
new MethodSignature(method.getName(), method.getReturnType(), method.getParameterTypes())
);
}
}
for (MethodSignature methodSignature : mappedFieldTypeMethodSignatures) {
if (filterFieldTypeMethodSignatures.contains(methodSignature)) {
assertFalse(
"Method " + methodSignature.name + " should NOT be implemented in " + FilterFieldType.class.getSimpleName(),
EXCLUDED_SIGNATURES.contains(methodSignature)
);
} else {
assertTrue(
"Method " + methodSignature.name + " should be implemented in " + FilterFieldType.class.getSimpleName(),
EXCLUDED_SIGNATURES.contains(methodSignature)
);
}
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,293 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/

package org.opensearch.index.mapper;

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queries.intervals.IntervalsSource;
import org.apache.lucene.queries.spans.SpanMultiTermQueryWrapper;
import org.apache.lucene.queries.spans.SpanQuery;
import org.apache.lucene.search.MultiTermQuery;
import org.apache.lucene.search.Query;
import org.opensearch.common.annotation.PublicApi;
import org.opensearch.common.geo.ShapeRelation;
import org.opensearch.common.time.DateMathParser;
import org.opensearch.common.unit.Fuzziness;
import org.opensearch.index.analysis.NamedAnalyzer;
import org.opensearch.index.fielddata.IndexFieldData;
import org.opensearch.index.query.IntervalMode;
import org.opensearch.index.query.QueryRewriteContext;
import org.opensearch.index.query.QueryShardContext;
import org.opensearch.search.DocValueFormat;
import org.opensearch.search.lookup.SearchLookup;

import java.io.IOException;
import java.time.ZoneId;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;

/**
* Wraps a {@link MappedFieldType}, delegating all methods (except typeName).
* <p>
* Subclasses can extend this class to wrap an existing {@link MappedFieldType} to reuse most functionality, while
* customizing/modifying some specific behavior by overriding the relevant methods.
*/
@PublicApi(since = "3.0.0")
public abstract class FilterFieldType extends MappedFieldType {
protected final MappedFieldType delegate;

public FilterFieldType(MappedFieldType delegate) {
super(
delegate.name(),
delegate.isSearchable(),
delegate.isStored(),
delegate.hasDocValues(),
delegate.getTextSearchInfo(),
delegate.meta()

Check warning on line 54 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L48-L54

Added lines #L48 - L54 were not covered by tests
);
this.delegate = delegate;
}

Check warning on line 57 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L56-L57

Added lines #L56 - L57 were not covered by tests

@Override
public ValueFetcher valueFetcher(QueryShardContext context, SearchLookup searchLookup, String format) {
return delegate.valueFetcher(context, searchLookup, format);

Check warning on line 61 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L61

Added line #L61 was not covered by tests
}

@Override
public Query termQuery(Object value, QueryShardContext context) {
return delegate.termQuery(value, context);

Check warning on line 66 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L66

Added line #L66 was not covered by tests
}

@Override
public String familyTypeName() {
return delegate.familyTypeName();

Check warning on line 71 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L71

Added line #L71 was not covered by tests
}

@Override
public String name() {
return delegate.name();

Check warning on line 76 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L76

Added line #L76 was not covered by tests
}

@Override
public float boost() {
return delegate.boost();

Check warning on line 81 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L81

Added line #L81 was not covered by tests
}

@Override
public void setBoost(float boost) {
delegate.setBoost(boost);
}

Check warning on line 87 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L86-L87

Added lines #L86 - L87 were not covered by tests

@Override
public boolean hasDocValues() {
return delegate.hasDocValues();

Check warning on line 91 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L91

Added line #L91 was not covered by tests
}

@Override
public NamedAnalyzer indexAnalyzer() {
return delegate.indexAnalyzer();

Check warning on line 96 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L96

Added line #L96 was not covered by tests
}

@Override
public void setIndexAnalyzer(NamedAnalyzer analyzer) {
delegate.setIndexAnalyzer(analyzer);
}

Check warning on line 102 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L101-L102

Added lines #L101 - L102 were not covered by tests

@Override
public Object valueForDisplay(Object value) {
return delegate.valueForDisplay(value);

Check warning on line 106 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L106

Added line #L106 was not covered by tests
}

@Override
public boolean isSearchable() {
return delegate.isSearchable();

Check warning on line 111 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L111

Added line #L111 was not covered by tests
}

@Override
public boolean isStored() {
return delegate.isStored();

Check warning on line 116 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L116

Added line #L116 was not covered by tests
}

@Override
public Function<byte[], Number> pointReaderIfPossible() {
return delegate.pointReaderIfPossible();

Check warning on line 121 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L121

Added line #L121 was not covered by tests
}

@Override
public boolean isAggregatable() {
return delegate.isAggregatable();

Check warning on line 126 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L126

Added line #L126 was not covered by tests
}

@Override
public Query termQueryCaseInsensitive(Object value, QueryShardContext context) {
return delegate.termQueryCaseInsensitive(value, context);

Check warning on line 131 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L131

Added line #L131 was not covered by tests
}

@Override
public Query termsQuery(List<?> values, QueryShardContext context) {
return delegate.termsQuery(values, context);

Check warning on line 136 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L136

Added line #L136 was not covered by tests
}

@Override
public Query rangeQuery(
Object lowerTerm,
Object upperTerm,
boolean includeLower,
boolean includeUpper,
ShapeRelation relation,
ZoneId timeZone,
DateMathParser parser,
QueryShardContext context
) {
return delegate.rangeQuery(lowerTerm, upperTerm, includeLower, includeUpper, relation, timeZone, parser, context);

Check warning on line 150 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L150

Added line #L150 was not covered by tests
}

@Override
public Query fuzzyQuery(
Object value,
Fuzziness fuzziness,
int prefixLength,
int maxExpansions,
boolean transpositions,
MultiTermQuery.RewriteMethod method,
QueryShardContext context
) {
return delegate.fuzzyQuery(value, fuzziness, prefixLength, maxExpansions, transpositions, method, context);

Check warning on line 163 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L163

Added line #L163 was not covered by tests
}

@Override
public Query prefixQuery(String value, MultiTermQuery.RewriteMethod method, boolean caseInsensitve, QueryShardContext context) {
return delegate.prefixQuery(value, method, caseInsensitve, context);

Check warning on line 168 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L168

Added line #L168 was not covered by tests
}

@Override
public Query wildcardQuery(String value, MultiTermQuery.RewriteMethod method, boolean caseInsensitve, QueryShardContext context) {
return delegate.wildcardQuery(value, method, caseInsensitve, context);

Check warning on line 173 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L173

Added line #L173 was not covered by tests
}

@Override
public Query normalizedWildcardQuery(String value, MultiTermQuery.RewriteMethod method, QueryShardContext context) {
return delegate.normalizedWildcardQuery(value, method, context);

Check warning on line 178 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L178

Added line #L178 was not covered by tests
}

@Override
public Query regexpQuery(
String value,
int syntaxFlags,
int matchFlags,
int maxDeterminizedStates,
MultiTermQuery.RewriteMethod method,
QueryShardContext context
) {
return delegate.regexpQuery(value, syntaxFlags, matchFlags, maxDeterminizedStates, method, context);

Check warning on line 190 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L190

Added line #L190 was not covered by tests
}

@Override
public Query existsQuery(QueryShardContext context) {
return delegate.existsQuery(context);

Check warning on line 195 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L195

Added line #L195 was not covered by tests
}

@Override
public Query phraseQuery(TokenStream stream, int slop, boolean enablePositionIncrements) throws IOException {
return delegate.phraseQuery(stream, slop, enablePositionIncrements);

Check warning on line 200 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L200

Added line #L200 was not covered by tests
}

@Override
public Query phraseQuery(TokenStream stream, int slop, boolean enablePositionIncrements, QueryShardContext context) throws IOException {
return delegate.phraseQuery(stream, slop, enablePositionIncrements, context);

Check warning on line 205 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L205

Added line #L205 was not covered by tests
}

@Override
public Query multiPhraseQuery(TokenStream stream, int slop, boolean enablePositionIncrements) throws IOException {
return delegate.multiPhraseQuery(stream, slop, enablePositionIncrements);

Check warning on line 210 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L210

Added line #L210 was not covered by tests
}

@Override
public Query multiPhraseQuery(TokenStream stream, int slop, boolean enablePositionIncrements, QueryShardContext context)
throws IOException {
return delegate.multiPhraseQuery(stream, slop, enablePositionIncrements, context);

Check warning on line 216 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L216

Added line #L216 was not covered by tests
}

@Override
public Query phrasePrefixQuery(TokenStream stream, int slop, int maxExpansions) throws IOException {
return delegate.phrasePrefixQuery(stream, slop, maxExpansions);

Check warning on line 221 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L221

Added line #L221 was not covered by tests
}

@Override
public Query phrasePrefixQuery(TokenStream stream, int slop, int maxExpansions, QueryShardContext context) throws IOException {
return delegate.phrasePrefixQuery(stream, slop, maxExpansions, context);

Check warning on line 226 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L226

Added line #L226 was not covered by tests
}

@Override
public SpanQuery spanPrefixQuery(String value, SpanMultiTermQueryWrapper.SpanRewriteMethod method, QueryShardContext context) {
return delegate.spanPrefixQuery(value, method, context);

Check warning on line 231 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L231

Added line #L231 was not covered by tests
}

@Override
public Query distanceFeatureQuery(Object origin, String pivot, float boost, QueryShardContext context) {
return delegate.distanceFeatureQuery(origin, pivot, boost, context);

Check warning on line 236 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L236

Added line #L236 was not covered by tests
}

@Override
public IntervalsSource intervals(String query, int max_gaps, IntervalMode mode, NamedAnalyzer analyzer, boolean prefix)
throws IOException {
return delegate.intervals(query, max_gaps, mode, analyzer, prefix);

Check warning on line 242 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L242

Added line #L242 was not covered by tests
}

@Override
public Relation isFieldWithinQuery(
IndexReader reader,
Object from,
Object to,
boolean includeLower,
boolean includeUpper,
ZoneId timeZone,
DateMathParser dateMathParser,
QueryRewriteContext context
) throws IOException {
return delegate.isFieldWithinQuery(reader, from, to, includeLower, includeUpper, timeZone, dateMathParser, context);

Check warning on line 256 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L256

Added line #L256 was not covered by tests
}

@Override
public boolean eagerGlobalOrdinals() {
return delegate.eagerGlobalOrdinals();

Check warning on line 261 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L261

Added line #L261 was not covered by tests
}

@Override
public void setEagerGlobalOrdinals(boolean eagerGlobalOrdinals) {
delegate.setEagerGlobalOrdinals(eagerGlobalOrdinals);
}

Check warning on line 267 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L266-L267

Added lines #L266 - L267 were not covered by tests

@Override
public DocValueFormat docValueFormat(String format, ZoneId timeZone) {
return delegate.docValueFormat(format, timeZone);

Check warning on line 271 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L271

Added line #L271 was not covered by tests
}

@Override
public Map<String, String> meta() {
return delegate.meta();

Check warning on line 276 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L276

Added line #L276 was not covered by tests
}

@Override
public TextSearchInfo getTextSearchInfo() {
return delegate.getTextSearchInfo();

Check warning on line 281 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L281

Added line #L281 was not covered by tests
}

@Override
public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName, Supplier<SearchLookup> searchLookup) {
return delegate.fielddataBuilder(fullyQualifiedIndexName, searchLookup);

Check warning on line 286 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L286

Added line #L286 was not covered by tests
}

@Override
public MappedFieldType unwrap() {
return delegate.unwrap();

Check warning on line 291 in server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/index/mapper/FilterFieldType.java#L291

Added line #L291 was not covered by tests
}
}
Loading
Loading