Skip to content

Commit cbaf0d2

Browse files
author
Himshikha Gupta
committed
Merge remote-tracking branch 'opensearch-main/2.x' into remote-checksum-fix-2x
2 parents 4d67722 + fa6de0d commit cbaf0d2

File tree

8 files changed

+77
-18
lines changed

8 files changed

+77
-18
lines changed

.github/workflows/assemble.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ jobs:
3232
if: runner.os == 'macos'
3333
continue-on-error: true
3434
run: |
35-
brew install docker colima coreutils
35+
# Force QEMU 9.0.2 usage
36+
curl https://raw.githubusercontent.com/Homebrew/homebrew-core/f1a9cf104a9a51779c7a532b658c490f69974839/Formula/q/qemu.rb > qemu.rb
37+
brew install qemu.rb
38+
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 HOMEBREW_NO_AUTO_UPDATE=1 brew install docker colima coreutils
3639
gtimeout 15m colima start
3740
shell: bash
3841
- name: Run Gradle (assemble)

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
1111
- Bump `com.azure:azure-identity` from 1.13.0 to 1.13.2 ([#15578](https://github.com/opensearch-project/OpenSearch/pull/15578))
1212
- Bump `protobuf` from 3.22.3 to 3.25.4 ([#15684](https://github.com/opensearch-project/OpenSearch/pull/15684))
1313
- Bump `peter-evans/create-pull-request` from 6 to 7 ([#15863](https://github.com/opensearch-project/OpenSearch/pull/15863))
14+
- Bump `com.nimbusds:oauth2-oidc-sdk` from 11.9.1 to 11.19.1 ([#15862](https://github.com/opensearch-project/OpenSearch/pull/15862))
1415

1516
### Changed
1617

@@ -20,6 +21,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
2021
### Removed
2122

2223
### Fixed
24+
- Fix wildcard query containing escaped character ([#15737](https://github.com/opensearch-project/OpenSearch/pull/15737))
2325

2426
### Security
2527

gradle/wrapper/gradle-wrapper.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
distributionBase=GRADLE_USER_HOME
1313
distributionPath=wrapper/dists
14-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-all.zip
14+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-all.zip
1515
zipStoreBase=GRADLE_USER_HOME
1616
zipStorePath=wrapper/dists
17-
distributionSha256Sum=682b4df7fe5accdca84a4d1ef6a3a6ab096b3efd5edf7de2bd8c758d95a93703
17+
distributionSha256Sum=fdfca5dbc2834f0ece5020465737538e5ba679deeff5ab6c09621d67f8bb1a15

plugins/repository-azure/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ dependencies {
6262
api 'com.microsoft.azure:msal4j-persistence-extension:1.3.0'
6363
api "net.java.dev.jna:jna-platform:${versions.jna}"
6464
api 'com.microsoft.azure:msal4j:1.17.0'
65-
api 'com.nimbusds:oauth2-oidc-sdk:11.9.1'
65+
api 'com.nimbusds:oauth2-oidc-sdk:11.19.1'
6666
api 'com.nimbusds:nimbus-jose-jwt:9.40'
6767
api 'com.nimbusds:content-type:2.3'
6868
api 'com.nimbusds:lang-tag:1.7'
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
58db85a807a56ae76baffa519772271ad5808195

plugins/repository-azure/licenses/oauth2-oidc-sdk-11.9.1.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/src/main/java/org/opensearch/index/mapper/WildcardFieldMapper.java

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import org.apache.lucene.util.automaton.RegExp;
4141
import org.opensearch.common.lucene.BytesRefs;
4242
import org.opensearch.common.lucene.Lucene;
43-
import org.opensearch.common.regex.Regex;
4443
import org.opensearch.common.unit.Fuzziness;
4544
import org.opensearch.core.xcontent.XContentParser;
4645
import org.opensearch.index.analysis.IndexAnalyzers;
@@ -430,22 +429,27 @@ public Query wildcardQuery(String value, MultiTermQuery.RewriteMethod method, bo
430429
finalValue = value;
431430
}
432431
Predicate<String> matchPredicate;
433-
if (value.contains("?")) {
434-
Automaton automaton = WildcardQuery.toAutomaton(new Term(name(), finalValue));
435-
CompiledAutomaton compiledAutomaton = new CompiledAutomaton(automaton);
432+
Automaton automaton = WildcardQuery.toAutomaton(new Term(name(), finalValue));
433+
CompiledAutomaton compiledAutomaton = new CompiledAutomaton(automaton);
434+
if (compiledAutomaton.type == CompiledAutomaton.AUTOMATON_TYPE.SINGLE) {
435+
// when type equals SINGLE, #compiledAutomaton.runAutomaton is null
436436
matchPredicate = s -> {
437437
if (caseInsensitive) {
438438
s = s.toLowerCase(Locale.ROOT);
439439
}
440-
BytesRef valueBytes = BytesRefs.toBytesRef(s);
441-
return compiledAutomaton.runAutomaton.run(valueBytes.bytes, valueBytes.offset, valueBytes.length);
440+
return s.equals(finalValue);
442441
};
442+
} else if (compiledAutomaton.type == CompiledAutomaton.AUTOMATON_TYPE.ALL) {
443+
return existsQuery(context);
444+
} else if (compiledAutomaton.type == CompiledAutomaton.AUTOMATON_TYPE.NONE) {
445+
return new MatchNoDocsQuery("Wildcard expression matches nothing");
443446
} else {
444447
matchPredicate = s -> {
445448
if (caseInsensitive) {
446449
s = s.toLowerCase(Locale.ROOT);
447450
}
448-
return Regex.simpleMatch(finalValue, s);
451+
BytesRef valueBytes = BytesRefs.toBytesRef(s);
452+
return compiledAutomaton.runAutomaton.run(valueBytes.bytes, valueBytes.offset, valueBytes.length);
449453
};
450454
}
451455

@@ -468,22 +472,30 @@ public Query wildcardQuery(String value, MultiTermQuery.RewriteMethod method, bo
468472
// Package-private for testing
469473
static Set<String> getRequiredNGrams(String value) {
470474
Set<String> terms = new HashSet<>();
475+
476+
if (value.isEmpty()) {
477+
return terms;
478+
}
479+
471480
int pos = 0;
481+
String rawSequence = null;
472482
String currentSequence = null;
473483
if (!value.startsWith("?") && !value.startsWith("*")) {
474484
// Can add prefix term
475-
currentSequence = getNonWildcardSequence(value, 0);
485+
rawSequence = getNonWildcardSequence(value, 0);
486+
currentSequence = performEscape(rawSequence);
476487
if (currentSequence.length() == 1) {
477488
terms.add(new String(new char[] { 0, currentSequence.charAt(0) }));
478489
} else {
479490
terms.add(new String(new char[] { 0, currentSequence.charAt(0), currentSequence.charAt(1) }));
480491
}
481492
} else {
482493
pos = findNonWildcardSequence(value, pos);
483-
currentSequence = getNonWildcardSequence(value, pos);
494+
rawSequence = getNonWildcardSequence(value, pos);
484495
}
485496
while (pos < value.length()) {
486-
boolean isEndOfValue = pos + currentSequence.length() == value.length();
497+
boolean isEndOfValue = pos + rawSequence.length() == value.length();
498+
currentSequence = performEscape(rawSequence);
487499
if (!currentSequence.isEmpty() && currentSequence.length() < 3 && !isEndOfValue && pos > 0) {
488500
// If this is a prefix or suffix of length < 3, then we already have a longer token including the anchor.
489501
terms.add(currentSequence);
@@ -502,16 +514,16 @@ static Set<String> getRequiredNGrams(String value) {
502514
terms.add(new String(new char[] { a, b, 0 }));
503515
}
504516
}
505-
pos = findNonWildcardSequence(value, pos + currentSequence.length());
506-
currentSequence = getNonWildcardSequence(value, pos);
517+
pos = findNonWildcardSequence(value, pos + rawSequence.length());
518+
rawSequence = getNonWildcardSequence(value, pos);
507519
}
508520
return terms;
509521
}
510522

511523
private static String getNonWildcardSequence(String value, int startFrom) {
512524
for (int i = startFrom; i < value.length(); i++) {
513525
char c = value.charAt(i);
514-
if (c == '?' || c == '*') {
526+
if ((c == '?' || c == '*') && (i == 0 || value.charAt(i - 1) != '\\')) {
515527
return value.substring(startFrom, i);
516528
}
517529
}
@@ -529,6 +541,22 @@ private static int findNonWildcardSequence(String value, int startFrom) {
529541
return value.length();
530542
}
531543

544+
private static String performEscape(String str) {
545+
StringBuilder sb = new StringBuilder();
546+
for (int i = 0; i < str.length(); i++) {
547+
if (str.charAt(i) == '\\' && (i + 1) < str.length()) {
548+
char c = str.charAt(i + 1);
549+
if (c == '*' || c == '?') {
550+
i++;
551+
}
552+
}
553+
sb.append(str.charAt(i));
554+
}
555+
assert !sb.toString().contains("\\*");
556+
assert !sb.toString().contains("\\?");
557+
return sb.toString();
558+
}
559+
532560
@Override
533561
public Query regexpQuery(
534562
String value,

server/src/test/java/org/opensearch/index/mapper/WildcardFieldTypeTests.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,32 @@ public void testWildcardQuery() {
8888
);
8989
}
9090

91+
public void testEscapedWildcardQuery() {
92+
MappedFieldType ft = new WildcardFieldMapper.WildcardFieldType("field");
93+
Set<String> expectedTerms = new HashSet<>();
94+
expectedTerms.add(prefixAnchored("*"));
95+
expectedTerms.add(suffixAnchored("*"));
96+
97+
BooleanQuery.Builder builder = new BooleanQuery.Builder();
98+
for (String term : expectedTerms) {
99+
builder.add(new TermQuery(new Term("field", term)), BooleanClause.Occur.FILTER);
100+
}
101+
102+
assertEquals(
103+
new WildcardFieldMapper.WildcardMatchingQuery("field", builder.build(), "\\**\\*"),
104+
ft.wildcardQuery("\\**\\*", null, null)
105+
);
106+
107+
assertEquals(new WildcardFieldMapper.WildcardMatchingQuery("field", builder.build(), "\\*"), ft.wildcardQuery("\\*", null, null));
108+
109+
expectedTerms.remove(suffixAnchored("*"));
110+
builder = new BooleanQuery.Builder();
111+
for (String term : expectedTerms) {
112+
builder.add(new TermQuery(new Term("field", term)), BooleanClause.Occur.FILTER);
113+
}
114+
assertEquals(new WildcardFieldMapper.WildcardMatchingQuery("field", builder.build(), "\\**"), ft.wildcardQuery("\\**", null, null));
115+
}
116+
91117
public void testMultipleWildcardsInQuery() {
92118
final String pattern = "a?cd*efg?h";
93119
MappedFieldType ft = new WildcardFieldMapper.WildcardFieldType("field");

0 commit comments

Comments
 (0)