From 79d09b3b5b48565585ed239db1bdbbc1fab5413d Mon Sep 17 00:00:00 2001 From: Alberto Paro Date: Sun, 30 Jan 2022 16:50:11 +0100 Subject: [PATCH 01/81] Fixed github deploy Signed-off-by: Mark Cohen --- build.gradle | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index dc21f536..19acf027 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,5 @@ +import java.nio.file.Files + buildscript { repositories { mavenCentral() @@ -105,12 +107,12 @@ githubRelease.doFirst { } // check if zip file is there - assert file("build/distributions/ingest-opennlp-${version}.zip").exists() + assert file("build/distributions/ltr-${version}.zip").exists() // rename zip file def currentVersion = version.replace('-SNAPSHOT', '') - def filename = "build/distributions/ltr-1.5.4-os${currentVersion}.zip" - Files.copy(file("build/distributions/ltr-1.5.4-os${version}.zip").toPath(), file(filename).toPath()) + def filename = "build/distributions/ltr-${currentVersion}.zip" + Files.copy(file("build/distributions/ltr-${version}.zip").toPath(), file(filename).toPath()) // configuration github { From 048f6614b301353152f72dd7d1615e4e5dac16a1 Mon Sep 17 00:00:00 2001 From: gsingers Date: Tue, 6 Sep 2022 15:36:12 -0400 Subject: [PATCH 02/81] fix licenses, comment out nebula check Signed-off-by: Mark Cohen --- build.gradle | 17 +++++++++++++---- licenses/RankyMcRankFace-0.1.1.jar.sha1 | 1 + licenses/asm-5.0.4.jar.sha1 | 1 - licenses/asm-8.0.1.jar.sha1 | 1 + licenses/asm-analysis-8.0.1.jar.sha1 | 1 + licenses/asm-commons-5.0.4.jar.sha1 | 1 - licenses/asm-commons-8.0.1.jar.sha1 | 1 + licenses/asm-tree-5.0.4.jar.sha1 | 1 - licenses/asm-tree-8.0.1.jar.sha1 | 1 + licenses/compiler-0.9.3.jar.sha1 | 1 + licenses/lucene-expressions-6.6.0.jar.sha1 | 1 - licenses/lucene-expressions-8.10.1.jar.sha1 | 1 + .../o19s/es/ltr/action/LTRStatsActionIT.java | 15 +++++++++++++++ .../com/o19s/es/ltr/action/LTRStatsAction.java | 16 ++++++++++++++++ .../es/ltr/action/TransportLTRStatsAction.java | 16 ++++++++++++++++ .../ltr/feature/store/ExtraLoggingSupplier.java | 16 ++++++++++++++++ .../feature/store/FeatureNormDefinition.java | 16 ++++++++++++++++ .../es/ltr/feature/store/FeatureSupplier.java | 16 ++++++++++++++++ .../store/MinMaxFeatureNormDefinition.java | 16 ++++++++++++++++ .../es/ltr/feature/store/ScriptFeature.java | 16 ++++++++++++++++ .../store/StandardFeatureNormDefinition.java | 16 ++++++++++++++++ .../feature/store/StoredFeatureNormalizers.java | 16 ++++++++++++++++ .../o19s/es/ltr/query/LtrRewritableQuery.java | 16 ++++++++++++++++ .../o19s/es/ltr/query/LtrRewriteContext.java | 16 ++++++++++++++++ .../normalizer/FeatureNormalizingRanker.java | 16 ++++++++++++++++ .../normalizer/MinMaxFeatureNormalizer.java | 16 ++++++++++++++++ .../es/ltr/ranker/normalizer/Normalizer.java | 16 ++++++++++++++++ .../es/ltr/ranker/normalizer/Normalizers.java | 16 ++++++++++++++++ .../normalizer/StandardFeatureNormalizer.java | 16 ++++++++++++++++ .../com/o19s/es/ltr/rest/AutoDetectParser.java | 16 ++++++++++++++++ .../o19s/es/ltr/rest/RestFeatureManager.java | 16 ++++++++++++++++ .../java/com/o19s/es/ltr/rest/RestLTRStats.java | 16 ++++++++++++++++ .../es/ltr/rest/RestSearchStoreElements.java | 15 +++++++++++++++ .../com/o19s/es/ltr/rest/RestStoreManager.java | 15 +++++++++++++++ .../java/com/o19s/es/ltr/stats/LTRStat.java | 15 +++++++++++++++ .../java/com/o19s/es/ltr/stats/LTRStats.java | 15 +++++++++++++++ .../java/com/o19s/es/ltr/stats/StatName.java | 15 +++++++++++++++ .../suppliers/CacheStatsOnNodeSupplier.java | 15 +++++++++++++++ .../suppliers/PluginHealthStatusSupplier.java | 15 +++++++++++++++ .../ltr/stats/suppliers/StoreStatsSupplier.java | 15 +++++++++++++++ .../es/ltr/utils/AbstractQueryBuilderUtils.java | 15 +++++++++++++++ .../com/o19s/es/termstat/TermStatQuery.java | 15 +++++++++++++++ .../o19s/es/termstat/TermStatQueryBuilder.java | 15 +++++++++++++++ .../com/o19s/es/termstat/TermStatScorer.java | 15 +++++++++++++++ .../com/o19s/es/termstat/TermStatSupplier.java | 15 +++++++++++++++ .../action/TransportLTRStatsActionTests.java | 16 ++++++++++++++++ .../store/ExtraLoggingSupplierTests.java | 16 ++++++++++++++++ .../ltr/feature/store/FeatureSupplierTests.java | 16 ++++++++++++++++ .../ltr/ranker/normalizer/NormalizersTests.java | 16 ++++++++++++++++ .../com/o19s/es/ltr/stats/LTRStatTests.java | 15 +++++++++++++++ .../com/o19s/es/ltr/stats/LTRStatsTests.java | 15 +++++++++++++++ .../CacheStatsOnNodeSupplierTests.java | 15 +++++++++++++++ .../PluginHealthStatusSupplierTests.java | 15 +++++++++++++++ .../es/termstat/TermStatQueryBuilderTests.java | 15 +++++++++++++++ .../o19s/es/termstat/TermStatQueryTests.java | 15 +++++++++++++++ 55 files changed, 688 insertions(+), 8 deletions(-) create mode 100644 licenses/RankyMcRankFace-0.1.1.jar.sha1 delete mode 100644 licenses/asm-5.0.4.jar.sha1 create mode 100644 licenses/asm-8.0.1.jar.sha1 create mode 100644 licenses/asm-analysis-8.0.1.jar.sha1 delete mode 100644 licenses/asm-commons-5.0.4.jar.sha1 create mode 100644 licenses/asm-commons-8.0.1.jar.sha1 delete mode 100644 licenses/asm-tree-5.0.4.jar.sha1 create mode 100644 licenses/asm-tree-8.0.1.jar.sha1 create mode 100644 licenses/compiler-0.9.3.jar.sha1 delete mode 100644 licenses/lucene-expressions-6.6.0.jar.sha1 create mode 100644 licenses/lucene-expressions-8.10.1.jar.sha1 diff --git a/build.gradle b/build.gradle index 19acf027..6dec5a80 100644 --- a/build.gradle +++ b/build.gradle @@ -67,11 +67,20 @@ dependencies { compile "com.github.spullara.mustache.java:compiler:0.9.3" } + +//TODO: figure this out: validateNebulaPom fails + +validateNebulaPom { + validateNebulaPom.enabled = false +} + +// see https://github.com/opensearch-project/OpenSearch/blob/0ba0e7cc26060f964fcbf6ee45bae53b3a9941d0/buildSrc/src/main/java/org/opensearch/gradle/precommit/DependencyLicensesTask.java dependencyLicenses { mapping from: /lucene-.*/, to: 'lucene' mapping from: /asm-.*/, to: 'asm' - mapping from: /Ranky-.*/, to: 'lucene' - mapping from: /compiler-.*/, to: 'lucene' + mapping from: /RankyMcRankFace.*/, to: 'lucene' + //mapping from: /Ranky.*/, to: 'lucene' + mapping from: /compiler.*/, to: 'lucene' } sourceSets { @@ -116,8 +125,8 @@ githubRelease.doFirst { // configuration github { - owner = 'aparo' - repo = 'opensearch-learning-to-rank' + owner = 'gsingers' + repo = 'opensearch-learning-to-rank-base' token = System.getProperty('GITHUB_TOKEN') tagName = currentVersion assets = [ filename ] diff --git a/licenses/RankyMcRankFace-0.1.1.jar.sha1 b/licenses/RankyMcRankFace-0.1.1.jar.sha1 new file mode 100644 index 00000000..36e676a6 --- /dev/null +++ b/licenses/RankyMcRankFace-0.1.1.jar.sha1 @@ -0,0 +1 @@ +d8775154417bacbb6c81a247c3b37c78c86061f8 \ No newline at end of file diff --git a/licenses/asm-5.0.4.jar.sha1 b/licenses/asm-5.0.4.jar.sha1 deleted file mode 100644 index 9223dba3..00000000 --- a/licenses/asm-5.0.4.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -0da08b8cce7bbf903602a25a3a163ae252435795 diff --git a/licenses/asm-8.0.1.jar.sha1 b/licenses/asm-8.0.1.jar.sha1 new file mode 100644 index 00000000..b464db16 --- /dev/null +++ b/licenses/asm-8.0.1.jar.sha1 @@ -0,0 +1 @@ +3f5199523fb95304b44563f5d56d9f5a07270669 \ No newline at end of file diff --git a/licenses/asm-analysis-8.0.1.jar.sha1 b/licenses/asm-analysis-8.0.1.jar.sha1 new file mode 100644 index 00000000..12775aa7 --- /dev/null +++ b/licenses/asm-analysis-8.0.1.jar.sha1 @@ -0,0 +1 @@ +6c2c7b3006b3a54dd63467a020263c0756fd5e80 \ No newline at end of file diff --git a/licenses/asm-commons-5.0.4.jar.sha1 b/licenses/asm-commons-5.0.4.jar.sha1 deleted file mode 100644 index 94fe0cd9..00000000 --- a/licenses/asm-commons-5.0.4.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -5a556786086c23cd689a0328f8519db93821c04c diff --git a/licenses/asm-commons-8.0.1.jar.sha1 b/licenses/asm-commons-8.0.1.jar.sha1 new file mode 100644 index 00000000..d4bca8a0 --- /dev/null +++ b/licenses/asm-commons-8.0.1.jar.sha1 @@ -0,0 +1 @@ +019c7ba355f0737815205518e332a8dc08b417c6 \ No newline at end of file diff --git a/licenses/asm-tree-5.0.4.jar.sha1 b/licenses/asm-tree-5.0.4.jar.sha1 deleted file mode 100644 index 5822a485..00000000 --- a/licenses/asm-tree-5.0.4.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -396ce0c07ba2b481f25a70195c7c94922f0d1b0b \ No newline at end of file diff --git a/licenses/asm-tree-8.0.1.jar.sha1 b/licenses/asm-tree-8.0.1.jar.sha1 new file mode 100644 index 00000000..da382904 --- /dev/null +++ b/licenses/asm-tree-8.0.1.jar.sha1 @@ -0,0 +1 @@ +dfcad5abbcff36f8bdad5647fe6f4972e958ad59 \ No newline at end of file diff --git a/licenses/compiler-0.9.3.jar.sha1 b/licenses/compiler-0.9.3.jar.sha1 new file mode 100644 index 00000000..2b0fbbc5 --- /dev/null +++ b/licenses/compiler-0.9.3.jar.sha1 @@ -0,0 +1 @@ +2815e016c63bec4f18704ea4f5489106a5b01a99 \ No newline at end of file diff --git a/licenses/lucene-expressions-6.6.0.jar.sha1 b/licenses/lucene-expressions-6.6.0.jar.sha1 deleted file mode 100644 index 860f30cc..00000000 --- a/licenses/lucene-expressions-6.6.0.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -4edcafb90cef9428a6887b92ccb85ff410f1436b \ No newline at end of file diff --git a/licenses/lucene-expressions-8.10.1.jar.sha1 b/licenses/lucene-expressions-8.10.1.jar.sha1 new file mode 100644 index 00000000..f327cbcb --- /dev/null +++ b/licenses/lucene-expressions-8.10.1.jar.sha1 @@ -0,0 +1 @@ +24932a4be7064a99126d80776718845b356abae0 \ No newline at end of file diff --git a/src/javaRestTest/java/com/o19s/es/ltr/action/LTRStatsActionIT.java b/src/javaRestTest/java/com/o19s/es/ltr/action/LTRStatsActionIT.java index 5c0c4965..d4ad7310 100644 --- a/src/javaRestTest/java/com/o19s/es/ltr/action/LTRStatsActionIT.java +++ b/src/javaRestTest/java/com/o19s/es/ltr/action/LTRStatsActionIT.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.ltr.action; import com.o19s.es.ltr.LtrTestUtils; diff --git a/src/main/java/com/o19s/es/ltr/action/LTRStatsAction.java b/src/main/java/com/o19s/es/ltr/action/LTRStatsAction.java index 0052f80d..54959328 100644 --- a/src/main/java/com/o19s/es/ltr/action/LTRStatsAction.java +++ b/src/main/java/com/o19s/es/ltr/action/LTRStatsAction.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.action; import org.opensearch.action.ActionRequestBuilder; diff --git a/src/main/java/com/o19s/es/ltr/action/TransportLTRStatsAction.java b/src/main/java/com/o19s/es/ltr/action/TransportLTRStatsAction.java index e6f8613b..9ec5df03 100644 --- a/src/main/java/com/o19s/es/ltr/action/TransportLTRStatsAction.java +++ b/src/main/java/com/o19s/es/ltr/action/TransportLTRStatsAction.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.action; import com.o19s.es.ltr.action.LTRStatsAction.LTRStatsNodeRequest; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/ExtraLoggingSupplier.java b/src/main/java/com/o19s/es/ltr/feature/store/ExtraLoggingSupplier.java index de897fef..6279f217 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/ExtraLoggingSupplier.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/ExtraLoggingSupplier.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.feature.store; import java.util.Map; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/FeatureNormDefinition.java b/src/main/java/com/o19s/es/ltr/feature/store/FeatureNormDefinition.java index c131cd56..7e1009d5 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/FeatureNormDefinition.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/FeatureNormDefinition.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.feature.store; import com.o19s.es.ltr.ranker.normalizer.Normalizer; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/FeatureSupplier.java b/src/main/java/com/o19s/es/ltr/feature/store/FeatureSupplier.java index 08f82d4c..2f0e828f 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/FeatureSupplier.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/FeatureSupplier.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.feature.store; import com.o19s.es.ltr.feature.FeatureSet; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/MinMaxFeatureNormDefinition.java b/src/main/java/com/o19s/es/ltr/feature/store/MinMaxFeatureNormDefinition.java index 27de0948..fa4e44ef 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/MinMaxFeatureNormDefinition.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/MinMaxFeatureNormDefinition.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.feature.store; import com.o19s.es.ltr.ranker.normalizer.MinMaxFeatureNormalizer; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/ScriptFeature.java b/src/main/java/com/o19s/es/ltr/feature/store/ScriptFeature.java index 719dd52c..635543ac 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/ScriptFeature.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/ScriptFeature.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.feature.store; import com.o19s.es.ltr.LtrQueryContext; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/StandardFeatureNormDefinition.java b/src/main/java/com/o19s/es/ltr/feature/store/StandardFeatureNormDefinition.java index ac13889f..2a707448 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/StandardFeatureNormDefinition.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/StandardFeatureNormDefinition.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.feature.store; import com.o19s.es.ltr.ranker.normalizer.Normalizer; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/StoredFeatureNormalizers.java b/src/main/java/com/o19s/es/ltr/feature/store/StoredFeatureNormalizers.java index 616b6200..8a47c535 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/StoredFeatureNormalizers.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/StoredFeatureNormalizers.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.feature.store; import com.o19s.es.ltr.feature.FeatureSet; diff --git a/src/main/java/com/o19s/es/ltr/query/LtrRewritableQuery.java b/src/main/java/com/o19s/es/ltr/query/LtrRewritableQuery.java index d4b8baaa..5ce823f2 100644 --- a/src/main/java/com/o19s/es/ltr/query/LtrRewritableQuery.java +++ b/src/main/java/com/o19s/es/ltr/query/LtrRewritableQuery.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.query; import org.apache.lucene.search.Query; diff --git a/src/main/java/com/o19s/es/ltr/query/LtrRewriteContext.java b/src/main/java/com/o19s/es/ltr/query/LtrRewriteContext.java index 1ddea240..e6a44129 100644 --- a/src/main/java/com/o19s/es/ltr/query/LtrRewriteContext.java +++ b/src/main/java/com/o19s/es/ltr/query/LtrRewriteContext.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.query; import com.o19s.es.ltr.ranker.LogLtrRanker; diff --git a/src/main/java/com/o19s/es/ltr/ranker/normalizer/FeatureNormalizingRanker.java b/src/main/java/com/o19s/es/ltr/ranker/normalizer/FeatureNormalizingRanker.java index a3580dfe..999dc16e 100644 --- a/src/main/java/com/o19s/es/ltr/ranker/normalizer/FeatureNormalizingRanker.java +++ b/src/main/java/com/o19s/es/ltr/ranker/normalizer/FeatureNormalizingRanker.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.ranker.normalizer; import com.o19s.es.ltr.ranker.LtrRanker; diff --git a/src/main/java/com/o19s/es/ltr/ranker/normalizer/MinMaxFeatureNormalizer.java b/src/main/java/com/o19s/es/ltr/ranker/normalizer/MinMaxFeatureNormalizer.java index 9e41a88c..9e3773f7 100644 --- a/src/main/java/com/o19s/es/ltr/ranker/normalizer/MinMaxFeatureNormalizer.java +++ b/src/main/java/com/o19s/es/ltr/ranker/normalizer/MinMaxFeatureNormalizer.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.ranker.normalizer; /** diff --git a/src/main/java/com/o19s/es/ltr/ranker/normalizer/Normalizer.java b/src/main/java/com/o19s/es/ltr/ranker/normalizer/Normalizer.java index 46c0d0ab..fbf766b5 100644 --- a/src/main/java/com/o19s/es/ltr/ranker/normalizer/Normalizer.java +++ b/src/main/java/com/o19s/es/ltr/ranker/normalizer/Normalizer.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.ranker.normalizer; /** diff --git a/src/main/java/com/o19s/es/ltr/ranker/normalizer/Normalizers.java b/src/main/java/com/o19s/es/ltr/ranker/normalizer/Normalizers.java index 2ac1ae74..9567f11b 100644 --- a/src/main/java/com/o19s/es/ltr/ranker/normalizer/Normalizers.java +++ b/src/main/java/com/o19s/es/ltr/ranker/normalizer/Normalizers.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.ranker.normalizer; import java.util.Collections; diff --git a/src/main/java/com/o19s/es/ltr/ranker/normalizer/StandardFeatureNormalizer.java b/src/main/java/com/o19s/es/ltr/ranker/normalizer/StandardFeatureNormalizer.java index cf24f7d8..9bb9a948 100644 --- a/src/main/java/com/o19s/es/ltr/ranker/normalizer/StandardFeatureNormalizer.java +++ b/src/main/java/com/o19s/es/ltr/ranker/normalizer/StandardFeatureNormalizer.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.ranker.normalizer; public class StandardFeatureNormalizer implements Normalizer { diff --git a/src/main/java/com/o19s/es/ltr/rest/AutoDetectParser.java b/src/main/java/com/o19s/es/ltr/rest/AutoDetectParser.java index ca64bd9b..b487ccfa 100644 --- a/src/main/java/com/o19s/es/ltr/rest/AutoDetectParser.java +++ b/src/main/java/com/o19s/es/ltr/rest/AutoDetectParser.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.rest; import com.o19s.es.ltr.feature.FeatureValidation; diff --git a/src/main/java/com/o19s/es/ltr/rest/RestFeatureManager.java b/src/main/java/com/o19s/es/ltr/rest/RestFeatureManager.java index 867eef43..407302dd 100644 --- a/src/main/java/com/o19s/es/ltr/rest/RestFeatureManager.java +++ b/src/main/java/com/o19s/es/ltr/rest/RestFeatureManager.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.rest; import com.o19s.es.ltr.action.ClearCachesAction; diff --git a/src/main/java/com/o19s/es/ltr/rest/RestLTRStats.java b/src/main/java/com/o19s/es/ltr/rest/RestLTRStats.java index 1a0c8ec6..da8af554 100644 --- a/src/main/java/com/o19s/es/ltr/rest/RestLTRStats.java +++ b/src/main/java/com/o19s/es/ltr/rest/RestLTRStats.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.rest; import com.o19s.es.ltr.action.LTRStatsAction; diff --git a/src/main/java/com/o19s/es/ltr/rest/RestSearchStoreElements.java b/src/main/java/com/o19s/es/ltr/rest/RestSearchStoreElements.java index 043ccc88..ebdabc9c 100644 --- a/src/main/java/com/o19s/es/ltr/rest/RestSearchStoreElements.java +++ b/src/main/java/com/o19s/es/ltr/rest/RestSearchStoreElements.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.ltr.rest; import com.o19s.es.ltr.feature.store.index.IndexFeatureStore; diff --git a/src/main/java/com/o19s/es/ltr/rest/RestStoreManager.java b/src/main/java/com/o19s/es/ltr/rest/RestStoreManager.java index ba22b795..0b64902b 100644 --- a/src/main/java/com/o19s/es/ltr/rest/RestStoreManager.java +++ b/src/main/java/com/o19s/es/ltr/rest/RestStoreManager.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.ltr.rest; import com.o19s.es.ltr.action.ListStoresAction; diff --git a/src/main/java/com/o19s/es/ltr/stats/LTRStat.java b/src/main/java/com/o19s/es/ltr/stats/LTRStat.java index 43143252..8cc7bc2e 100644 --- a/src/main/java/com/o19s/es/ltr/stats/LTRStat.java +++ b/src/main/java/com/o19s/es/ltr/stats/LTRStat.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.ltr.stats; import java.util.function.Supplier; diff --git a/src/main/java/com/o19s/es/ltr/stats/LTRStats.java b/src/main/java/com/o19s/es/ltr/stats/LTRStats.java index 0181f5a8..7fc82738 100644 --- a/src/main/java/com/o19s/es/ltr/stats/LTRStats.java +++ b/src/main/java/com/o19s/es/ltr/stats/LTRStats.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.ltr.stats; import java.util.Map; diff --git a/src/main/java/com/o19s/es/ltr/stats/StatName.java b/src/main/java/com/o19s/es/ltr/stats/StatName.java index ba1c68d4..1a45473a 100644 --- a/src/main/java/com/o19s/es/ltr/stats/StatName.java +++ b/src/main/java/com/o19s/es/ltr/stats/StatName.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.ltr.stats; import java.util.Collections; diff --git a/src/main/java/com/o19s/es/ltr/stats/suppliers/CacheStatsOnNodeSupplier.java b/src/main/java/com/o19s/es/ltr/stats/suppliers/CacheStatsOnNodeSupplier.java index c08fd7bc..85a5bb61 100644 --- a/src/main/java/com/o19s/es/ltr/stats/suppliers/CacheStatsOnNodeSupplier.java +++ b/src/main/java/com/o19s/es/ltr/stats/suppliers/CacheStatsOnNodeSupplier.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.ltr.stats.suppliers; import com.o19s.es.ltr.feature.store.index.Caches; diff --git a/src/main/java/com/o19s/es/ltr/stats/suppliers/PluginHealthStatusSupplier.java b/src/main/java/com/o19s/es/ltr/stats/suppliers/PluginHealthStatusSupplier.java index 73b31d76..ebf588ab 100644 --- a/src/main/java/com/o19s/es/ltr/stats/suppliers/PluginHealthStatusSupplier.java +++ b/src/main/java/com/o19s/es/ltr/stats/suppliers/PluginHealthStatusSupplier.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.ltr.stats.suppliers; import com.o19s.es.ltr.feature.store.index.IndexFeatureStore; diff --git a/src/main/java/com/o19s/es/ltr/stats/suppliers/StoreStatsSupplier.java b/src/main/java/com/o19s/es/ltr/stats/suppliers/StoreStatsSupplier.java index ab4c7e33..730bfe06 100644 --- a/src/main/java/com/o19s/es/ltr/stats/suppliers/StoreStatsSupplier.java +++ b/src/main/java/com/o19s/es/ltr/stats/suppliers/StoreStatsSupplier.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.ltr.stats.suppliers; import com.o19s.es.ltr.feature.store.index.IndexFeatureStore; diff --git a/src/main/java/com/o19s/es/ltr/utils/AbstractQueryBuilderUtils.java b/src/main/java/com/o19s/es/ltr/utils/AbstractQueryBuilderUtils.java index 60f05326..cfd21f88 100644 --- a/src/main/java/com/o19s/es/ltr/utils/AbstractQueryBuilderUtils.java +++ b/src/main/java/com/o19s/es/ltr/utils/AbstractQueryBuilderUtils.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.ltr.utils; import org.opensearch.common.io.stream.StreamInput; diff --git a/src/main/java/com/o19s/es/termstat/TermStatQuery.java b/src/main/java/com/o19s/es/termstat/TermStatQuery.java index 926826dd..794b58e2 100644 --- a/src/main/java/com/o19s/es/termstat/TermStatQuery.java +++ b/src/main/java/com/o19s/es/termstat/TermStatQuery.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.termstat; import com.o19s.es.explore.StatisticsHelper; diff --git a/src/main/java/com/o19s/es/termstat/TermStatQueryBuilder.java b/src/main/java/com/o19s/es/termstat/TermStatQueryBuilder.java index e8933be3..fe34436e 100644 --- a/src/main/java/com/o19s/es/termstat/TermStatQueryBuilder.java +++ b/src/main/java/com/o19s/es/termstat/TermStatQueryBuilder.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.termstat; import com.o19s.es.explore.StatisticsHelper.AggrType; diff --git a/src/main/java/com/o19s/es/termstat/TermStatScorer.java b/src/main/java/com/o19s/es/termstat/TermStatScorer.java index 3669e0b5..c9abcde3 100644 --- a/src/main/java/com/o19s/es/termstat/TermStatScorer.java +++ b/src/main/java/com/o19s/es/termstat/TermStatScorer.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.termstat; import com.o19s.es.explore.StatisticsHelper; diff --git a/src/main/java/com/o19s/es/termstat/TermStatSupplier.java b/src/main/java/com/o19s/es/termstat/TermStatSupplier.java index 2f1c704e..c9c88d78 100644 --- a/src/main/java/com/o19s/es/termstat/TermStatSupplier.java +++ b/src/main/java/com/o19s/es/termstat/TermStatSupplier.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.termstat; import com.o19s.es.explore.StatisticsHelper; diff --git a/src/test/java/com/o19s/es/ltr/action/TransportLTRStatsActionTests.java b/src/test/java/com/o19s/es/ltr/action/TransportLTRStatsActionTests.java index b45c1250..ce8b98e8 100644 --- a/src/test/java/com/o19s/es/ltr/action/TransportLTRStatsActionTests.java +++ b/src/test/java/com/o19s/es/ltr/action/TransportLTRStatsActionTests.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.action; import com.o19s.es.ltr.action.LTRStatsAction.LTRStatsNodeRequest; diff --git a/src/test/java/com/o19s/es/ltr/feature/store/ExtraLoggingSupplierTests.java b/src/test/java/com/o19s/es/ltr/feature/store/ExtraLoggingSupplierTests.java index 7e44025e..f81718e8 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/ExtraLoggingSupplierTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/ExtraLoggingSupplierTests.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.feature.store; import com.o19s.es.ltr.ranker.LogLtrRanker; diff --git a/src/test/java/com/o19s/es/ltr/feature/store/FeatureSupplierTests.java b/src/test/java/com/o19s/es/ltr/feature/store/FeatureSupplierTests.java index e9ceb0ef..fdd4f68f 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/FeatureSupplierTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/FeatureSupplierTests.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.feature.store; import com.o19s.es.ltr.feature.FeatureSet; diff --git a/src/test/java/com/o19s/es/ltr/ranker/normalizer/NormalizersTests.java b/src/test/java/com/o19s/es/ltr/ranker/normalizer/NormalizersTests.java index 602b5c8e..d71b4662 100644 --- a/src/test/java/com/o19s/es/ltr/ranker/normalizer/NormalizersTests.java +++ b/src/test/java/com/o19s/es/ltr/ranker/normalizer/NormalizersTests.java @@ -1,3 +1,19 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package com.o19s.es.ltr.ranker.normalizer; import org.apache.lucene.util.LuceneTestCase; diff --git a/src/test/java/com/o19s/es/ltr/stats/LTRStatTests.java b/src/test/java/com/o19s/es/ltr/stats/LTRStatTests.java index a25f5650..c0a7cb83 100644 --- a/src/test/java/com/o19s/es/ltr/stats/LTRStatTests.java +++ b/src/test/java/com/o19s/es/ltr/stats/LTRStatTests.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.ltr.stats; import org.opensearch.test.OpenSearchTestCase; diff --git a/src/test/java/com/o19s/es/ltr/stats/LTRStatsTests.java b/src/test/java/com/o19s/es/ltr/stats/LTRStatsTests.java index 72c82285..032ae42d 100644 --- a/src/test/java/com/o19s/es/ltr/stats/LTRStatsTests.java +++ b/src/test/java/com/o19s/es/ltr/stats/LTRStatsTests.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.ltr.stats; import org.opensearch.test.OpenSearchTestCase; diff --git a/src/test/java/com/o19s/es/ltr/stats/suppliers/CacheStatsOnNodeSupplierTests.java b/src/test/java/com/o19s/es/ltr/stats/suppliers/CacheStatsOnNodeSupplierTests.java index 88238c1f..faea21f6 100644 --- a/src/test/java/com/o19s/es/ltr/stats/suppliers/CacheStatsOnNodeSupplierTests.java +++ b/src/test/java/com/o19s/es/ltr/stats/suppliers/CacheStatsOnNodeSupplierTests.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.ltr.stats.suppliers; import com.o19s.es.ltr.LtrTestUtils; diff --git a/src/test/java/com/o19s/es/ltr/stats/suppliers/PluginHealthStatusSupplierTests.java b/src/test/java/com/o19s/es/ltr/stats/suppliers/PluginHealthStatusSupplierTests.java index 9ce590c2..36f14730 100644 --- a/src/test/java/com/o19s/es/ltr/stats/suppliers/PluginHealthStatusSupplierTests.java +++ b/src/test/java/com/o19s/es/ltr/stats/suppliers/PluginHealthStatusSupplierTests.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.ltr.stats.suppliers; import com.o19s.es.ltr.feature.store.index.IndexFeatureStore; diff --git a/src/test/java/com/o19s/es/termstat/TermStatQueryBuilderTests.java b/src/test/java/com/o19s/es/termstat/TermStatQueryBuilderTests.java index e4cc13c9..9d2d7e61 100644 --- a/src/test/java/com/o19s/es/termstat/TermStatQueryBuilderTests.java +++ b/src/test/java/com/o19s/es/termstat/TermStatQueryBuilderTests.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.termstat; import com.o19s.es.explore.StatisticsHelper.AggrType; diff --git a/src/test/java/com/o19s/es/termstat/TermStatQueryTests.java b/src/test/java/com/o19s/es/termstat/TermStatQueryTests.java index c0b38921..e8738ac3 100644 --- a/src/test/java/com/o19s/es/termstat/TermStatQueryTests.java +++ b/src/test/java/com/o19s/es/termstat/TermStatQueryTests.java @@ -1,3 +1,18 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.o19s.es.termstat; import com.o19s.es.explore.StatisticsHelper.AggrType; From 5670372f7d22b333acee7da74be51840bbe9fb6e Mon Sep 17 00:00:00 2001 From: gsingers Date: Wed, 7 Sep 2022 13:47:07 -0400 Subject: [PATCH 03/81] upgrade gradle and upgrade OpenSearch version Signed-off-by: Mark Cohen --- build.gradle | 39 +++++++++++------------ gradle.properties | 6 ++-- gradle/wrapper/gradle-wrapper.jar | Bin 58694 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 ++ gradlew.bat | 22 +++---------- 6 files changed, 29 insertions(+), 42 deletions(-) diff --git a/build.gradle b/build.gradle index 6dec5a80..7ed8babe 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,6 @@ import java.nio.file.Files buildscript { repositories { mavenCentral() - jcenter() mavenLocal() } @@ -26,13 +25,22 @@ apply plugin: 'opensearch.opensearchplugin' apply plugin: 'opensearch.java-rest-test' apply plugin: 'opensearch.rest-resources' + +idea { + module { + downloadJavadoc = true + downloadSources = true + } +} + // license of this project licenseFile = rootProject.file('LICENSE.txt') // copyright notices noticeFile = rootProject.file('NOTICE.txt') // disable uploadArchives task for now, no upload happening currently -uploadArchives.enabled = false +//GSI TODO: disabled for now +//uploadArchives.enabled = false opensearchplugin { name 'ltr' @@ -49,30 +57,21 @@ opensearchplugin { repositories { mavenCentral() mavenLocal() - jcenter { - url "https://jcenter.bintray.com/" - metadataSources{ - artifact() - } - } } dependencies { - compile "org.apache.lucene:lucene-expressions:${luceneVersion}" - compile "org.antlr:antlr4-runtime:${antlrVersion}" - compile "org.ow2.asm:asm:${ow2Version}" - compile "org.ow2.asm:asm-commons:${ow2Version}" - compile "org.ow2.asm:asm-tree:${ow2Version}" - compile 'com.o19s:RankyMcRankFace:0.1.1' - compile "com.github.spullara.mustache.java:compiler:0.9.3" + implementation "org.apache.lucene:lucene-core:${luceneVersion}" + implementation "org.apache.lucene:lucene-expressions:${luceneVersion}" + implementation "org.antlr:antlr4-runtime:${antlrVersion}" + implementation "org.ow2.asm:asm:${ow2Version}" + implementation "org.ow2.asm:asm-commons:${ow2Version}" + implementation "org.ow2.asm:asm-tree:${ow2Version}" + implementation 'com.o19s:RankyMcRankFace:0.1.1' + implementation "com.github.spullara.mustache.java:compiler:0.9.3" } -//TODO: figure this out: validateNebulaPom fails -validateNebulaPom { - validateNebulaPom.enabled = false -} // see https://github.com/opensearch-project/OpenSearch/blob/0ba0e7cc26060f964fcbf6ee45bae53b3a9941d0/buildSrc/src/main/java/org/opensearch/gradle/precommit/DependencyLicensesTask.java dependencyLicenses { @@ -104,7 +103,7 @@ sourceSets { // licenseHeaders.enabled = false // No need to validate POM, as we do not upload to sonatype -// validateNebulaPom.enabled = false +validateNebulaPom.enabled = false // Elastic tried to remove the logging requirement for plugins, but didn't get it quite right so this is a short term fix until 7.11 // https://github.com/elastic/opensearch/issues/65247 diff --git a/gradle.properties b/gradle.properties index 7f4aa46d..5f42f6a5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ -ltrVersion = 1.5.4 -opensearchVersion = 1.2.4 -luceneVersion = 8.10.1 +ltrVersion = 2.0.0 +opensearchVersion = 2.2.1 +luceneVersion = 9.3.0 ow2Version = 8.0.1 antlrVersion=4.5.1-1 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 490fda8577df6c95960ba7077c43220e5bb2c0d9..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 100644 GIT binary patch delta 6763 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 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell From f69c4abe4ab14b4098abd7e86dbad9ac289bcb25 Mon Sep 17 00:00:00 2001 From: gsingers Date: Wed, 7 Sep 2022 14:48:32 -0400 Subject: [PATCH 04/81] begin fixing compile errors, only thing left are Query.visit() method implementations, which are going to require some more work Signed-off-by: Mark Cohen --- src/main/java/com/o19s/es/explore/ExplorerQuery.java | 12 +++++++----- .../com/o19s/es/explore/PostingsExplorerQuery.java | 9 +++++++++ .../ltr/action/TransportAddFeatureToSetAction.java | 3 +-- .../action/TransportCreateModelFromSetAction.java | 1 - .../es/ltr/action/TransportFeatureStoreAction.java | 2 +- .../ltr/feature/store/index/IndexFeatureStore.java | 4 ++-- 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/o19s/es/explore/ExplorerQuery.java b/src/main/java/com/o19s/es/explore/ExplorerQuery.java index 5b47e07e..0388557b 100644 --- a/src/main/java/com/o19s/es/explore/ExplorerQuery.java +++ b/src/main/java/com/o19s/es/explore/ExplorerQuery.java @@ -21,6 +21,7 @@ import org.apache.lucene.index.Term; import org.apache.lucene.index.TermStates; import org.apache.lucene.search.Query; +import org.apache.lucene.search.QueryVisitor; import org.apache.lucene.search.ScoreMode; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Weight; @@ -83,6 +84,12 @@ public Query rewrite(IndexReader reader) throws IOException { return this; } + @Override + public void visit(QueryVisitor visitor) { + //TODO: check this is right + query.visit(visitor); + } + @Override public int hashCode() { return Objects.hash(query, type); @@ -238,11 +245,6 @@ static class ExplorerWeight extends Weight { this.type = type; } - @Override - public void extractTerms(Set terms) { - weight.extractTerms(terms); - } - @Override public Explanation explain(LeafReaderContext context, int doc) throws IOException { Scorer scorer = scorer(context); diff --git a/src/main/java/com/o19s/es/explore/PostingsExplorerQuery.java b/src/main/java/com/o19s/es/explore/PostingsExplorerQuery.java index 807a7930..b4be5eaf 100644 --- a/src/main/java/com/o19s/es/explore/PostingsExplorerQuery.java +++ b/src/main/java/com/o19s/es/explore/PostingsExplorerQuery.java @@ -29,6 +29,7 @@ import org.apache.lucene.search.Explanation; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; +import org.apache.lucene.search.QueryVisitor; import org.apache.lucene.search.ScoreMode; import org.apache.lucene.search.Scorer; import org.apache.lucene.search.Weight; @@ -85,6 +86,14 @@ public Weight createWeight(IndexSearcher searcher, ScoreMode scoreMode, float bo this.type); } + @Override + public void visit(QueryVisitor visitor) { + //TODO + if (visitor.acceptField(term.field())) { + visitor.consumeTerms(this, term); + } + } + /** * Will eventually allow implementing more explorer techniques (e.g. some stats on positions) */ diff --git a/src/main/java/com/o19s/es/ltr/action/TransportAddFeatureToSetAction.java b/src/main/java/com/o19s/es/ltr/action/TransportAddFeatureToSetAction.java index 7e1130d0..477fcc55 100644 --- a/src/main/java/com/o19s/es/ltr/action/TransportAddFeatureToSetAction.java +++ b/src/main/java/com/o19s/es/ltr/action/TransportAddFeatureToSetAction.java @@ -144,7 +144,6 @@ private void start() { featuresRef.set(features); } GetRequest getRequest = new GetRequest(store) - .type(IndexFeatureStore.ES_TYPE) .id(StorableElement.generateId(StoredFeatureSet.TYPE, featureSetName)) .routing(routing); @@ -170,7 +169,7 @@ private void fetchFeaturesFromStore() { BoolQueryBuilder bq = QueryBuilders.boolQuery(); bq.must(nameQuery); bq.must(QueryBuilders.matchQuery("type", StoredFeature.TYPE)); - srequest.types(IndexFeatureStore.ES_TYPE); + //srequest.types(IndexFeatureStore.ES_TYPE); srequest.source().query(bq); srequest.source().fetchSource(true); srequest.source().size(StoredFeatureSet.MAX_FEATURES); diff --git a/src/main/java/com/o19s/es/ltr/action/TransportCreateModelFromSetAction.java b/src/main/java/com/o19s/es/ltr/action/TransportCreateModelFromSetAction.java index b0674774..28cc7ac2 100644 --- a/src/main/java/com/o19s/es/ltr/action/TransportCreateModelFromSetAction.java +++ b/src/main/java/com/o19s/es/ltr/action/TransportCreateModelFromSetAction.java @@ -62,7 +62,6 @@ protected void doExecute(Task task, CreateModelFromSetRequest request, ActionLis throw new IllegalArgumentException("Store [" + request.getStore() + "] does not exist, please create it first."); } GetRequest getRequest = new GetRequest(request.getStore()) - .type(IndexFeatureStore.ES_TYPE) .id(StorableElement.generateId(StoredFeatureSet.TYPE, request.getFeatureSetName())); getRequest.setParentTask(clusterService.localNode().getId(), task.getId()); getAction.execute(getRequest, ActionListener.wrap((r) -> this.doStore(task, r, request, listener), listener::onFailure)); diff --git a/src/main/java/com/o19s/es/ltr/action/TransportFeatureStoreAction.java b/src/main/java/com/o19s/es/ltr/action/TransportFeatureStoreAction.java index 08c254c9..951e1c28 100644 --- a/src/main/java/com/o19s/es/ltr/action/TransportFeatureStoreAction.java +++ b/src/main/java/com/o19s/es/ltr/action/TransportFeatureStoreAction.java @@ -104,7 +104,7 @@ private Optional buildClearCache(FeatureStoreRequest re private IndexRequest buildIndexRequest(Task parentTask, FeatureStoreRequest request) throws IOException { StorableElement elt = request.getStorableElement(); - IndexRequest indexRequest = client.prepareIndex(request.getStore(), IndexFeatureStore.ES_TYPE, elt.id()) + IndexRequest indexRequest = client.prepareIndex(request.getStore()) .setCreate(request.getAction() == FeatureStoreRequest.Action.CREATE) .setRouting(request.getRouting()) .setSource(IndexFeatureStore.toSource(elt)) diff --git a/src/main/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStore.java b/src/main/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStore.java index 5cb25904..6c3a3d4b 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStore.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStore.java @@ -195,7 +195,7 @@ public GetResponse getModel(String name) { } private Supplier internalGet(String id) { - return () -> clientSupplier.get().prepareGet(index, ES_TYPE, id).get(); + return () -> clientSupplier.get().prepareGet(index, id).get(); } /** @@ -264,7 +264,7 @@ void setElement(StorableElement element) { public static CreateIndexRequest buildIndexRequest(String indexName) { return new CreateIndexRequest(indexName) - .mapping(ES_TYPE, readResourceFile(indexName, MAPPING_FILE), XContentType.JSON) + .mapping(readResourceFile(indexName, MAPPING_FILE), XContentType.JSON) .settings(storeIndexSettings(indexName)); } From 8f0dea2dd7d48ebcb9b3b8d665272ddda77cbb85 Mon Sep 17 00:00:00 2001 From: gsingers Date: Wed, 7 Sep 2022 16:50:17 -0400 Subject: [PATCH 05/81] it compiles Signed-off-by: Mark Cohen --- build.gradle | 13 +- licenses/asm-analysis-8.0.1.jar.sha1 | 1 - licenses/lucene-expressions-8.10.1.jar.sha1 | 1 - licenses/lucene-expressions-9.3.0.jar.sha1 | 1 + .../es/ltr/action/BaseIntegrationTest.java | 1 - .../com/o19s/es/ltr/logging/LoggingIT.java | 45 +++--- .../o19s/es/ltr/query/StoredLtrQueryIT.java | 2 +- .../com/o19s/es/explore/ExplorerQuery.java | 32 ++-- .../es/explore/PostingsExplorerQuery.java | 25 ++-- .../o19s/es/ltr/feature/PrebuiltFeature.java | 11 +- .../es/ltr/feature/store/ScriptFeature.java | 53 +++++-- .../es/ltr/query/DerivedExpressionQuery.java | 33 +++-- .../com/o19s/es/ltr/query/RankerQuery.java | 138 +++++++++++++----- .../es/ltr/query/StoredLtrQueryBuilder.java | 32 +++- .../ltr/query/ValidatingLtrQueryBuilder.java | 4 +- .../o19s/es/ltr/rest/RestFeatureManager.java | 4 +- .../es/ltr/rest/RestSearchStoreElements.java | 1 - .../com/o19s/es/termstat/TermStatQuery.java | 52 ++++++- .../com/o19s/es/termstat/TermStatScorer.java | 9 +- .../o19s/es/termstat/TermStatSupplier.java | 16 +- .../o19s/es/explore/ExplorerQueryTests.java | 2 +- .../es/explore/StatisticsHelperTests.java | 2 +- .../com/o19s/es/ltr/LtrQueryContextTests.java | 2 +- .../java/com/o19s/es/ltr/LtrTestUtils.java | 4 +- .../store/ExtraLoggingSupplierTests.java | 2 +- .../feature/store/FeatureSupplierTests.java | 2 +- .../store/StoredFeatureParserTests.java | 2 +- .../store/StoredFeatureSetParserTests.java | 6 +- .../feature/store/StoredFeatureSetTests.java | 2 +- .../store/StoredLtrModelParserTests.java | 2 +- .../store/index/CachedFeatureStoreTests.java | 4 +- .../store/index/IndexFeatureStoreTests.java | 8 +- .../logging/LoggingFetchSubPhaseTests.java | 5 +- .../com/o19s/es/ltr/query/LtrQueryTests.java | 4 +- .../es/ltr/ranker/DenseLtrRankerTests.java | 2 +- .../o19s/es/ltr/ranker/LogLtrRankerTests.java | 4 +- .../NaiveAdditiveDecisionTreeTests.java | 6 +- .../ltr/ranker/linear/LinearRankerTests.java | 6 +- .../ranker/normalizer/NormalizersTests.java | 2 +- .../parser/LinearRankerParserTests.java | 2 +- .../parser/LtrRankerParserFactoryTests.java | 2 +- .../ranker/parser/XGBoostJsonParserTests.java | 2 +- .../o19s/es/ltr/rest/FeaturesParserTests.java | 2 +- .../o19s/es/termstat/TermStatQueryTests.java | 2 +- 44 files changed, 366 insertions(+), 185 deletions(-) delete mode 100644 licenses/asm-analysis-8.0.1.jar.sha1 delete mode 100644 licenses/lucene-expressions-8.10.1.jar.sha1 create mode 100644 licenses/lucene-expressions-9.3.0.jar.sha1 diff --git a/build.gradle b/build.gradle index 7ed8babe..89b76bcd 100644 --- a/build.gradle +++ b/build.gradle @@ -24,6 +24,7 @@ apply plugin: 'idea' apply plugin: 'opensearch.opensearchplugin' apply plugin: 'opensearch.java-rest-test' apply plugin: 'opensearch.rest-resources' +//apply plugin: 'opensearch.yaml-rest-test' idea { @@ -60,7 +61,6 @@ repositories { } dependencies { - implementation "org.apache.lucene:lucene-core:${luceneVersion}" implementation "org.apache.lucene:lucene-expressions:${luceneVersion}" implementation "org.antlr:antlr4-runtime:${antlrVersion}" implementation "org.ow2.asm:asm:${ow2Version}" @@ -68,6 +68,11 @@ dependencies { implementation "org.ow2.asm:asm-tree:${ow2Version}" implementation 'com.o19s:RankyMcRankFace:0.1.1' implementation "com.github.spullara.mustache.java:compiler:0.9.3" + + //testImplementation 'org.apache.lucene:lucene-test-framework:${luceneVersion}' + runtimeOnly 'org.locationtech.spatial4j:spatial4j:0.7' + runtimeOnly 'org.locationtech.jts:jts-core:1.15.0' + runtimeOnly 'org.apache.logging.log4j:log4j-core:2.17.1' } @@ -89,6 +94,12 @@ sourceSets { } } +java { + withJavadocJar() + withSourcesJar() +} + + // Set to false to not use opensearch checkstyle rules // checkstyleMain.enabled = true // checkstyleTest.enabled = true diff --git a/licenses/asm-analysis-8.0.1.jar.sha1 b/licenses/asm-analysis-8.0.1.jar.sha1 deleted file mode 100644 index 12775aa7..00000000 --- a/licenses/asm-analysis-8.0.1.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -6c2c7b3006b3a54dd63467a020263c0756fd5e80 \ No newline at end of file diff --git a/licenses/lucene-expressions-8.10.1.jar.sha1 b/licenses/lucene-expressions-8.10.1.jar.sha1 deleted file mode 100644 index f327cbcb..00000000 --- a/licenses/lucene-expressions-8.10.1.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -24932a4be7064a99126d80776718845b356abae0 \ No newline at end of file diff --git a/licenses/lucene-expressions-9.3.0.jar.sha1 b/licenses/lucene-expressions-9.3.0.jar.sha1 new file mode 100644 index 00000000..2d216277 --- /dev/null +++ b/licenses/lucene-expressions-9.3.0.jar.sha1 @@ -0,0 +1 @@ +5583bcd3a24d3aae40b0a3152458021844ac09aa \ No newline at end of file diff --git a/src/javaRestTest/java/com/o19s/es/ltr/action/BaseIntegrationTest.java b/src/javaRestTest/java/com/o19s/es/ltr/action/BaseIntegrationTest.java index 1c9e6745..68976180 100644 --- a/src/javaRestTest/java/com/o19s/es/ltr/action/BaseIntegrationTest.java +++ b/src/javaRestTest/java/com/o19s/es/ltr/action/BaseIntegrationTest.java @@ -125,7 +125,6 @@ public FeatureStoreResponse addElement(StorableElement element, builder.request().setValidation(validation); FeatureStoreResponse response = builder.execute().get(); assertEquals(1, response.getResponse().getVersion()); - assertEquals(IndexFeatureStore.ES_TYPE, response.getResponse().getType()); assertEquals(DocWriteResponse.Result.CREATED, response.getResponse().getResult()); assertEquals(element.id(), response.getResponse().getId()); assertEquals(store, response.getResponse().getIndex()); diff --git a/src/javaRestTest/java/com/o19s/es/ltr/logging/LoggingIT.java b/src/javaRestTest/java/com/o19s/es/ltr/logging/LoggingIT.java index 6eeb7721..4be44573 100644 --- a/src/javaRestTest/java/com/o19s/es/ltr/logging/LoggingIT.java +++ b/src/javaRestTest/java/com/o19s/es/ltr/logging/LoggingIT.java @@ -25,7 +25,7 @@ import com.o19s.es.ltr.query.StoredLtrQueryBuilder; import com.o19s.es.ltr.ranker.parser.LinearRankerParserTests; import org.apache.lucene.search.join.ScoreMode; -import org.apache.lucene.util.TestUtil; +import org.apache.lucene.tests.util.TestUtil; import org.opensearch.ExceptionsHelper; import org.opensearch.action.index.IndexResponse; import org.opensearch.action.search.SearchResponse; @@ -139,7 +139,6 @@ public void testFailures() throws Exception { .addQueryLogging("first_log", "test", false))); assertExcWithMessage(() -> client().prepareSearch("test_index") - .setTypes("test") .setSource(sourceBuilder).get(), IllegalArgumentException.class, "No query named [test] found"); SearchSourceBuilder sourceBuilder2 = new SearchSourceBuilder().query(query) @@ -150,7 +149,6 @@ public void testFailures() throws Exception { .addQueryLogging("first_log", "not_sltr", false))); assertExcWithMessage(() -> client().prepareSearch("test_index") - .setTypes("test") .setSource(sourceBuilder2).get(), IllegalArgumentException.class, "Query named [not_sltr] must be a " + "[sltr] query [TermQuery] found"); @@ -161,7 +159,6 @@ public void testFailures() throws Exception { new LoggingSearchExtBuilder() .addRescoreLogging("first_log", 0, false))); assertExcWithMessage(() -> client().prepareSearch("test_index") - .setTypes("test") .setSource(sourceBuilder3).get(), IllegalArgumentException.class, "rescore index [0] is out of bounds, " + "only [0]"); @@ -173,7 +170,6 @@ public void testFailures() throws Exception { new LoggingSearchExtBuilder() .addRescoreLogging("first_log", 0, false))); assertExcWithMessage(() -> client().prepareSearch("test_index") - .setTypes("test") .setSource(sourceBuilder4).get(), IllegalArgumentException.class, "Expected a [sltr] query but found " + "a [MatchAllDocsQuery] at index [0]"); } @@ -209,7 +205,7 @@ public void testLog() throws Exception { .boost(random().nextInt(3)); QueryBuilder query = QueryBuilders.boolQuery().must(new WrapperQueryBuilder(sbuilder.toString())) - .filter(QueryBuilders.idsQuery("test").addIds(ids)); + .filter(QueryBuilders.idsQuery().addIds(ids)); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(query) .fetchSource(false) .size(10) @@ -219,7 +215,7 @@ public void testLog() throws Exception { .addQueryLogging("first_log", "test", false) .addRescoreLogging("second_log", 0, true))); - SearchResponse resp = client().prepareSearch("test_index").setTypes("test").setSource(sourceBuilder).get(); + SearchResponse resp = client().prepareSearch("test_index").setSource(sourceBuilder).get(); assertSearchHits(docs, resp); sbuilder.featureSetName(null); sbuilder.modelName("my_model"); @@ -229,7 +225,7 @@ public void testLog() throws Exception { sbuilder_rescore.boost(random().nextInt(3)); query = QueryBuilders.boolQuery().must(new WrapperQueryBuilder(sbuilder.toString())) - .filter(QueryBuilders.idsQuery("test").addIds(ids)); + .filter(QueryBuilders.idsQuery().addIds(ids)); sourceBuilder = new SearchSourceBuilder().query(query) .fetchSource(false) .size(10) @@ -239,7 +235,7 @@ public void testLog() throws Exception { .addQueryLogging("first_log", "test", false) .addRescoreLogging("second_log", 0, true))); - SearchResponse resp2 = client().prepareSearch("test_index").setTypes("test").setSource(sourceBuilder).get(); + SearchResponse resp2 = client().prepareSearch("test_index").setSource(sourceBuilder).get(); assertSearchHits(docs, resp2); query = QueryBuilders.boolQuery() @@ -259,7 +255,7 @@ public void testLog() throws Exception { new LoggingSearchExtBuilder() .addQueryLogging("first_log", "test", false) .addRescoreLogging("second_log", 0, true))); - SearchResponse resp3 = client().prepareSearch("test_index").setTypes("test").setSource(sourceBuilder).get(); + SearchResponse resp3 = client().prepareSearch("test_index").setSource(sourceBuilder).get(); assertSearchHits(docs, resp3); } @@ -285,7 +281,7 @@ public void testLogExtraLogging() throws Exception { .boost(random().nextInt(3)); QueryBuilder query = QueryBuilders.boolQuery().must(new WrapperQueryBuilder(sbuilder.toString())) - .filter(QueryBuilders.idsQuery("test").addIds(ids)); + .filter(QueryBuilders.idsQuery().addIds(ids)); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(query) .fetchSource(false) .size(10) @@ -295,7 +291,7 @@ public void testLogExtraLogging() throws Exception { .addQueryLogging("first_log", "test", false) .addRescoreLogging("second_log", 0, true))); - SearchResponse resp = client().prepareSearch("test_index").setTypes("test").setSource(sourceBuilder).get(); + SearchResponse resp = client().prepareSearch("test_index").setSource(sourceBuilder).get(); assertSearchHitsExtraLogging(docs, resp); sbuilder.featureSetName(null); sbuilder.modelName("my_model"); @@ -305,7 +301,7 @@ public void testLogExtraLogging() throws Exception { sbuilder_rescore.boost(random().nextInt(3)); query = QueryBuilders.boolQuery().must(new WrapperQueryBuilder(sbuilder.toString())) - .filter(QueryBuilders.idsQuery("test").addIds(ids)); + .filter(QueryBuilders.idsQuery().addIds(ids)); sourceBuilder = new SearchSourceBuilder().query(query) .fetchSource(false) .size(10) @@ -315,7 +311,7 @@ public void testLogExtraLogging() throws Exception { .addQueryLogging("first_log", "test", false) .addRescoreLogging("second_log", 0, true))); - SearchResponse resp2 = client().prepareSearch("test_index").setTypes("test").setSource(sourceBuilder).get(); + SearchResponse resp2 = client().prepareSearch("test_index").setSource(sourceBuilder).get(); assertSearchHitsExtraLogging(docs, resp2); query = QueryBuilders.boolQuery() @@ -335,7 +331,7 @@ public void testLogExtraLogging() throws Exception { new LoggingSearchExtBuilder() .addQueryLogging("first_log", "test", false) .addRescoreLogging("second_log", 0, true))); - SearchResponse resp3 = client().prepareSearch("test_index").setTypes("test").setSource(sourceBuilder).get(); + SearchResponse resp3 = client().prepareSearch("test_index").setSource(sourceBuilder).get(); assertSearchHitsExtraLogging(docs, resp3); } @@ -356,7 +352,7 @@ public void testScriptLogInternalParams() throws Exception { .boost(random().nextInt(3)); QueryBuilder query = QueryBuilders.boolQuery().must(new WrapperQueryBuilder(sbuilder.toString())) - .filter(QueryBuilders.idsQuery("test").addIds(ids)); + .filter(QueryBuilders.idsQuery().addIds(ids)); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(query) .fetchSource(false) .size(10) @@ -364,7 +360,7 @@ public void testScriptLogInternalParams() throws Exception { new LoggingSearchExtBuilder() .addQueryLogging("first_log", "test", false))); - SearchResponse resp = client().prepareSearch("test_index").setTypes("test").setSource(sourceBuilder).get(); + SearchResponse resp = client().prepareSearch("test_index").setSource(sourceBuilder).get(); SearchHits hits = resp.getHits(); SearchHit testHit = hits.getAt(0); @@ -402,7 +398,7 @@ public void testScriptLogExternalParams() throws Exception { .boost(random().nextInt(3)); QueryBuilder query = QueryBuilders.boolQuery().must(new WrapperQueryBuilder(sbuilder.toString())) - .filter(QueryBuilders.idsQuery("test").addIds(ids)); + .filter(QueryBuilders.idsQuery().addIds(ids)); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(query) .fetchSource(false) .size(10) @@ -410,7 +406,7 @@ public void testScriptLogExternalParams() throws Exception { new LoggingSearchExtBuilder() .addQueryLogging("first_log", "test", false))); - SearchResponse resp = client().prepareSearch("test_index").setTypes("test").setSource(sourceBuilder).get(); + SearchResponse resp = client().prepareSearch("test_index").setSource(sourceBuilder).get(); SearchHits hits = resp.getHits(); SearchHit testHit = hits.getAt(0); @@ -440,7 +436,7 @@ public void testScriptLogInvalidExternalParams() throws Exception { .boost(random().nextInt(3)); QueryBuilder query = QueryBuilders.boolQuery().must(new WrapperQueryBuilder(sbuilder.toString())) - .filter(QueryBuilders.idsQuery("test").addIds(ids)); + .filter(QueryBuilders.idsQuery().addIds(ids)); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(query) .fetchSource(false) .size(10) @@ -449,7 +445,6 @@ public void testScriptLogInvalidExternalParams() throws Exception { .addQueryLogging("first_log", "test", false))); assertExcWithMessage(() -> client().prepareSearch("test_index") - .setTypes("test") .setSource(sourceBuilder).get(), IllegalArgumentException.class, "Term Stats injection requires fields and terms"); } @@ -583,10 +578,8 @@ protected void assertSearchHitsExtraLogging(Map docs, SearchRespons public Map buildIndex() { client().admin().indices().prepareCreate("test_index") - .addMapping( - "test", - "{\"properties\":{\"scorefield1\": {\"type\": \"float\"}, \"nesteddocs1\": {\"type\": \"nested\"}}}}", - XContentType.JSON) + .setMapping( + "{\"properties\":{\"scorefield1\": {\"type\": \"float\"}, \"nesteddocs1\": {\"type\": \"nested\"}}}}") .get(); int numDocs = TestUtil.nextInt(random(), 20, 100); @@ -614,7 +607,7 @@ public Map buildIndex() { } public void indexDoc(Doc d) { - IndexResponse resp = client().prepareIndex("test_index", "test") + IndexResponse resp = client().prepareIndex("test_index") .setSource("field1", d.field1, "field2", d.field2, "scorefield1", d.scorefield1, "nesteddocs1", d.getNesteddocs1()) .get(); d.id = resp.getId(); diff --git a/src/javaRestTest/java/com/o19s/es/ltr/query/StoredLtrQueryIT.java b/src/javaRestTest/java/com/o19s/es/ltr/query/StoredLtrQueryIT.java index f664b3ed..b5139c8e 100644 --- a/src/javaRestTest/java/com/o19s/es/ltr/query/StoredLtrQueryIT.java +++ b/src/javaRestTest/java/com/o19s/es/ltr/query/StoredLtrQueryIT.java @@ -296,7 +296,7 @@ public void testInvalidDerived() throws Exception { public void buildIndex() { client().admin().indices().prepareCreate("test_index").get(); - client().prepareIndex("test_index", "test") + client().prepareIndex("test_index") .setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE) .setSource("field1", "hello world", "field2", "bonjour world") .get(); diff --git a/src/main/java/com/o19s/es/explore/ExplorerQuery.java b/src/main/java/com/o19s/es/explore/ExplorerQuery.java index 0388557b..76556f0f 100644 --- a/src/main/java/com/o19s/es/explore/ExplorerQuery.java +++ b/src/main/java/com/o19s/es/explore/ExplorerQuery.java @@ -61,7 +61,6 @@ private boolean isCollectionScoped() { public String getType() { return this.type; } - @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") @Override public boolean equals(Object other) { return sameClassAs(other) && @@ -84,12 +83,6 @@ public Query rewrite(IndexReader reader) throws IOException { return this; } - @Override - public void visit(QueryVisitor visitor) { - //TODO: check this is right - query.visit(visitor); - } - @Override public int hashCode() { return Objects.hash(query, type); @@ -101,9 +94,8 @@ public Weight createWeight(IndexSearcher searcher, ScoreMode scoreMode, float bo if (!scoreMode.needsScores()) { return searcher.createWeight(query, scoreMode, boost); } - final Weight subWeight = searcher.createWeight(query, scoreMode, boost); - Set terms = new HashSet<>(); - subWeight.extractTerms(terms); + final Set terms = new HashSet<>(); + this.visit(QueryVisitor.termCollector(terms)); if (isCollectionScoped()) { ClassicSimilarity sim = new ClassicSimilarity(); StatisticsHelper df_stats = new StatisticsHelper(); @@ -112,12 +104,15 @@ public Weight createWeight(IndexSearcher searcher, ScoreMode scoreMode, float bo for (Term term : terms) { TermStates ctx = TermStates.build(searcher.getTopReaderContext(), term, scoreMode.needsScores()); - TermStatistics tStats = searcher.termStatistics(term, ctx); - if(tStats != null){ + if(ctx != null && ctx.docFreq() > 0){ + TermStatistics tStats = searcher.termStatistics(term, ctx.docFreq(), ctx.totalTermFreq()); df_stats.add(tStats.docFreq()); - idf_stats.add(sim.idf(tStats.docFreq(), searcher.getIndexReader().numDocs())); + idf_stats.add(sim.idf(tStats.docFreq(), searcher.collectionStatistics(term.field()).docCount())); ttf_stats.add(tStats.totalTermFreq()); - + } else { + df_stats.add(0.0f); + idf_stats.add(0.0f); + ttf_stats.add(0.0f); } } @@ -245,6 +240,10 @@ static class ExplorerWeight extends Weight { this.type = type; } + public void extractTerms(Set terms) { + QueryVisitor.termCollector(terms); + } + @Override public Explanation explain(LeafReaderContext context, int doc) throws IOException { Scorer scorer = scorer(context); @@ -278,4 +277,9 @@ public Scorer scorer(LeafReaderContext context) throws IOException { public String toString(String field) { return query.toString(); } + + @Override + public void visit(QueryVisitor visitor) { + this.query.visit(visitor.getSubVisitor(BooleanClause.Occur.MUST, this)); + } } diff --git a/src/main/java/com/o19s/es/explore/PostingsExplorerQuery.java b/src/main/java/com/o19s/es/explore/PostingsExplorerQuery.java index b4be5eaf..0ee2e930 100644 --- a/src/main/java/com/o19s/es/explore/PostingsExplorerQuery.java +++ b/src/main/java/com/o19s/es/explore/PostingsExplorerQuery.java @@ -25,14 +25,14 @@ import org.apache.lucene.index.TermState; import org.apache.lucene.index.TermStates; import org.apache.lucene.index.TermsEnum; -import org.apache.lucene.search.DocIdSetIterator; -import org.apache.lucene.search.Explanation; -import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.QueryVisitor; +import org.apache.lucene.search.Weight; +import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.ScoreMode; import org.apache.lucene.search.Scorer; -import org.apache.lucene.search.Weight; +import org.apache.lucene.search.Explanation; +import org.apache.lucene.search.DocIdSetIterator; import java.io.IOException; import java.util.ArrayList; @@ -63,7 +63,6 @@ public String toString(String field) { return buffer.toString(); } - @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") @Override public boolean equals(Object obj) { return this.sameClassAs(obj) @@ -86,14 +85,6 @@ public Weight createWeight(IndexSearcher searcher, ScoreMode scoreMode, float bo this.type); } - @Override - public void visit(QueryVisitor visitor) { - //TODO - if (visitor.acceptField(term.field())) { - visitor.consumeTerms(this, term); - } - } - /** * Will eventually allow implementing more explorer techniques (e.g. some stats on positions) */ @@ -126,7 +117,6 @@ static class PostingsExplorerWeight extends Weight { this.type = type; } - @Override public void extractTerms(Set terms) { terms.add(term); } @@ -254,4 +244,11 @@ public float getMaxScore(int upTo) throws IOException { return Float.POSITIVE_INFINITY; } } + + @Override + public void visit(QueryVisitor visitor) { + if (visitor.acceptField(this.term.field()) != false) { + visitor.consumeTerms(this, term); + } + } } diff --git a/src/main/java/com/o19s/es/ltr/feature/PrebuiltFeature.java b/src/main/java/com/o19s/es/ltr/feature/PrebuiltFeature.java index 912b4f76..74603b25 100644 --- a/src/main/java/com/o19s/es/ltr/feature/PrebuiltFeature.java +++ b/src/main/java/com/o19s/es/ltr/feature/PrebuiltFeature.java @@ -18,10 +18,12 @@ import com.o19s.es.ltr.LtrQueryContext; import org.apache.lucene.index.IndexReader; -import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.Query; -import org.apache.lucene.search.ScoreMode; +import org.apache.lucene.search.QueryVisitor; import org.apache.lucene.search.Weight; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.ScoreMode; import org.opensearch.common.Nullable; import java.io.IOException; @@ -84,4 +86,9 @@ public Weight createWeight(IndexSearcher searcher, ScoreMode scoreMode, float bo public Query rewrite(IndexReader reader) throws IOException { return query.rewrite(reader); } + + @Override + public void visit(QueryVisitor visitor) { + this.query.visit(visitor.getSubVisitor(BooleanClause.Occur.MUST, this)); + } } diff --git a/src/main/java/com/o19s/es/ltr/feature/store/ScriptFeature.java b/src/main/java/com/o19s/es/ltr/feature/store/ScriptFeature.java index 635543ac..1c78f5ac 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/ScriptFeature.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/ScriptFeature.java @@ -28,17 +28,22 @@ import org.apache.lucene.analysis.tokenattributes.TermToBytesRefAttribute; import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.Term; -import org.apache.lucene.search.DocIdSetIterator; -import org.apache.lucene.search.Explanation; -import org.apache.lucene.search.IndexSearcher; -import org.apache.lucene.search.MatchAllDocsQuery; +import org.apache.lucene.index.TermStates; +import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.Query; +import org.apache.lucene.search.QueryVisitor; +import org.apache.lucene.search.Weight; +import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.ScoreMode; import org.apache.lucene.search.Scorer; -import org.apache.lucene.search.Weight; +import org.apache.lucene.search.Explanation; +import org.apache.lucene.search.DocIdSetIterator; +import org.apache.lucene.search.MatchAllDocsQuery; + import org.opensearch.common.lucene.search.function.LeafScoreFunction; import org.opensearch.common.lucene.search.function.ScriptScoreFunction; import org.opensearch.common.xcontent.LoggingDeprecationHandler; + import org.opensearch.common.xcontent.NamedXContentRegistry; import org.opensearch.common.xcontent.XContentParser; import org.opensearch.common.xcontent.XContentType; @@ -189,8 +194,8 @@ public Query doToQuery(LtrQueryContext context, FeatureSet featureSet, Map fields = terms.stream().map(Term::field).collect(Collectors.toUnmodifiableSet()); + for (String field : fields) { + if (visitor.acceptField(field) == false) { + return; + } + } + visitor.getSubVisitor(BooleanClause.Occur.SHOULD, this).consumeTerms(this, terms.toArray(new Term[0])); + } } static class LtrScriptWeight extends Weight { @@ -302,18 +319,31 @@ static class LtrScriptWeight extends Weight { private final ScriptScoreFunction function; private final TermStatSupplier termStatSupplier; private final Set terms; + private final HashMap termContexts; LtrScriptWeight(Query query, ScriptScoreFunction function, TermStatSupplier termStatSupplier, Set terms, IndexSearcher searcher, - ScoreMode scoreMode) { + ScoreMode scoreMode) throws IOException { super(query); this.function = function; this.termStatSupplier = termStatSupplier; this.terms = terms; this.searcher = searcher; this.scoreMode = scoreMode; + this.termContexts = new HashMap<>(); + + if (scoreMode.needsScores()) { + for (Term t : terms) { + TermStates ctx = TermStates.build(searcher.getTopReaderContext(), t, true); + if (ctx != null && ctx.docFreq() > 0) { + searcher.collectionStatistics(t.field()); + searcher.termStatistics(t, ctx.docFreq(), ctx.totalTermFreq()); + } + termContexts.put(t, ctx); + } + } } @Override @@ -335,7 +365,7 @@ public int docID() { public float score() throws IOException { // Do the terms magic if the user asked for it if (terms.size() > 0) { - termStatSupplier.bump(searcher, context, docID(), terms, scoreMode); + termStatSupplier.bump(searcher, context, docID(), terms, scoreMode, termContexts); } return (float) leafScoreFunction.score(iterator.docID(), 0F); @@ -359,7 +389,6 @@ public float getMaxScore(int upTo) throws IOException { }; } - @Override public void extractTerms(Set terms) { } diff --git a/src/main/java/com/o19s/es/ltr/query/DerivedExpressionQuery.java b/src/main/java/com/o19s/es/ltr/query/DerivedExpressionQuery.java index d6ebab5b..07394c87 100644 --- a/src/main/java/com/o19s/es/ltr/query/DerivedExpressionQuery.java +++ b/src/main/java/com/o19s/es/ltr/query/DerivedExpressionQuery.java @@ -22,17 +22,23 @@ import org.apache.lucene.expressions.Expression; import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.Term; -import org.apache.lucene.search.ConstantScoreScorer; -import org.apache.lucene.search.ConstantScoreWeight; -import org.apache.lucene.search.DocIdSetIterator; -import org.apache.lucene.search.DoubleValues; -import org.apache.lucene.search.DoubleValuesSource; -import org.apache.lucene.search.Explanation; -import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.Query; +import org.apache.lucene.search.QueryVisitor; +import org.apache.lucene.search.Weight; +import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.ScoreMode; import org.apache.lucene.search.Scorer; -import org.apache.lucene.search.Weight; +import org.apache.lucene.search.Explanation; +import org.apache.lucene.search.DocIdSetIterator; +import org.apache.lucene.search.ConstantScoreWeight; +import org.apache.lucene.search.ConstantScoreScorer; +import org.apache.lucene.search.DoubleValuesSource; +import org.apache.lucene.search.DoubleValues; +import org.apache.lucene.search.ConstantScoreWeight; +import org.apache.lucene.search.ConstantScoreWeight; +import org.apache.lucene.search.ConstantScoreWeight; + import java.io.IOException; import java.util.Map; @@ -130,6 +136,11 @@ public int hashCode() { // Should not be called as it is likely an indication that it'll be cached but should not... return Objects.hash(classHash(), query, fvSupplier); } + + @Override + public void visit(QueryVisitor visitor) { + this.query.visit(visitor.getSubVisitor(BooleanClause.Occur.MUST, this)); + } } static class FVWeight extends Weight { @@ -146,7 +157,6 @@ static class FVWeight extends Weight { vectorSupplier = query.fvSupplier; } - @Override public void extractTerms(Set terms) { // No-op } @@ -298,4 +308,9 @@ public boolean isCacheable(LeafReaderContext ctx) { return false; } } + + @Override + public void visit(QueryVisitor visitor) { + // No-op + } } diff --git a/src/main/java/com/o19s/es/ltr/query/RankerQuery.java b/src/main/java/com/o19s/es/ltr/query/RankerQuery.java index b73fd4e7..f9938071 100644 --- a/src/main/java/com/o19s/es/ltr/query/RankerQuery.java +++ b/src/main/java/com/o19s/es/ltr/query/RankerQuery.java @@ -29,21 +29,24 @@ import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.Term; -import org.apache.lucene.search.ConstantScoreScorer; -import org.apache.lucene.search.ConstantScoreWeight; -import org.apache.lucene.search.DisiPriorityQueue; -import org.apache.lucene.search.DisiWrapper; -import org.apache.lucene.search.DocIdSetIterator; -import org.apache.lucene.search.Explanation; -import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.Query; +import org.apache.lucene.search.QueryVisitor; import org.apache.lucene.search.ScoreMode; -import org.apache.lucene.search.Scorer; +import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Weight; +import org.apache.lucene.search.ConstantScoreWeight; +import org.apache.lucene.search.Explanation; +import org.apache.lucene.search.Scorer; +import org.apache.lucene.search.ConstantScoreScorer; +import org.apache.lucene.search.DocIdSetIterator; +import org.apache.lucene.search.DisiPriorityQueue; +import org.apache.lucene.search.DisiWrapper; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -61,11 +64,14 @@ public class RankerQuery extends Query { private final List queries; private final FeatureSet features; private final LtrRanker ranker; + private final Map featureScoreCache; - private RankerQuery(List queries, FeatureSet features, LtrRanker ranker) { + private RankerQuery(List queries, FeatureSet features, LtrRanker ranker, + Map featureScoreCache) { this.queries = Objects.requireNonNull(queries); this.features = Objects.requireNonNull(features); this.ranker = Objects.requireNonNull(ranker); + this.featureScoreCache = featureScoreCache; } /** @@ -77,7 +83,7 @@ private RankerQuery(List queries, FeatureSet features, LtrRanker ranker) */ public static RankerQuery build(PrebuiltLtrModel model) { return build(model.ranker(), model.featureSet(), - new LtrQueryContext(null, Collections.emptySet()), Collections.emptyMap()); + new LtrQueryContext(null, Collections.emptySet()), Collections.emptyMap(), false); } /** @@ -88,26 +94,31 @@ public static RankerQuery build(PrebuiltLtrModel model) { * @param params the query params * @return the lucene query */ - public static RankerQuery build(LtrModel model, LtrQueryContext context, Map params) { - return build(model.ranker(), model.featureSet(), context, params); + public static RankerQuery build(LtrModel model, LtrQueryContext context, Map params, + Boolean featureScoreCacheFlag) { + return build(model.ranker(), model.featureSet(), context, params, featureScoreCacheFlag); } private static RankerQuery build(LtrRanker ranker, FeatureSet features, - LtrQueryContext context, Map params) { + LtrQueryContext context, Map params, Boolean featureScoreCacheFlag) { List queries = features.toQueries(context, params); - return new RankerQuery(queries, features, ranker); + Map featureScoreCache = null; + if (null != featureScoreCacheFlag && featureScoreCacheFlag) { + featureScoreCache = new HashMap<>(); + } + return new RankerQuery(queries, features, ranker, featureScoreCache); } public static RankerQuery buildLogQuery(LogLtrRanker.LogConsumer consumer, FeatureSet features, LtrQueryContext context, Map params) { List queries = features.toQueries(context, params); return new RankerQuery(queries, features, - new LogLtrRanker(consumer, features.size())); + new LogLtrRanker(consumer, features.size()), null); } public RankerQuery toLoggerQuery(LogLtrRanker.LogConsumer consumer) { NullRanker newRanker = new NullRanker(features.size()); - return new RankerQuery(queries, features, new LogLtrRanker(newRanker, consumer)); + return new RankerQuery(queries, features, new LogLtrRanker(newRanker, consumer), featureScoreCache); } @Override @@ -119,7 +130,7 @@ public Query rewrite(IndexReader reader) throws IOException { rewritten |= rewrittenQuery != query; rewrittenQueries.add(rewrittenQuery); } - return rewritten ? new RankerQuery(rewrittenQueries, features, ranker) : this; + return rewritten ? new RankerQuery(rewrittenQueries, features, ranker, featureScoreCache) : this; } @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") @@ -141,6 +152,7 @@ public boolean equals(Object obj) { Stream stream() { return queries.stream(); } + @Override public int hashCode() { return 31 * classHash() + Objects.hash(features, queries, ranker); @@ -177,7 +189,7 @@ public Weight createWeight(IndexSearcher searcher, ScoreMode scoreMode, float bo @Override public Scorer scorer(LeafReaderContext context) throws IOException { return new ConstantScoreScorer(this, score(), - scoreMode, DocIdSetIterator.all(context.reader().maxDoc())); + scoreMode, DocIdSetIterator.all(context.reader().maxDoc())); } @Override @@ -196,24 +208,27 @@ public boolean isCacheable(LeafReaderContext ctx) { LtrRewriteContext context = new LtrRewriteContext(ranker, vectorSupplier); for (Query q : queries) { if (q instanceof LtrRewritableQuery) { - q = ((LtrRewritableQuery)q).ltrRewrite(context); + q = ((LtrRewritableQuery) q).ltrRewrite(context); } weights.add(searcher.createWeight(q, ScoreMode.COMPLETE, boost)); } - return new RankerWeight(this, weights, ltrRankerWrapper, features); + return new RankerWeight(this, weights, ltrRankerWrapper, features, featureScoreCache); } public static class RankerWeight extends Weight { private final List weights; private final FVLtrRankerWrapper ranker; private final FeatureSet features; + private final Map featureScoreCache; - RankerWeight(RankerQuery query, List weights, FVLtrRankerWrapper ranker, FeatureSet features) { + RankerWeight(RankerQuery query, List weights, FVLtrRankerWrapper ranker, FeatureSet features, + Map featureScoreCache) { super(query); assert weights instanceof RandomAccess; this.weights = weights; this.ranker = Objects.requireNonNull(ranker); this.features = Objects.requireNonNull(features); + this.featureScoreCache = featureScoreCache; } @Override @@ -221,10 +236,10 @@ public boolean isCacheable(LeafReaderContext ctx) { return false; } - @Override public void extractTerms(Set terms) { for (Weight w : weights) { - w.extractTerms(terms); +// w.extractTerms(terms); + QueryVisitor.termCollector(terms); } } @@ -268,8 +283,8 @@ public RankerScorer scorer(LeafReaderContext context) throws IOException { } DisjunctionDISI rankerIterator = new DisjunctionDISI( - DocIdSetIterator.all(context.reader().maxDoc()), disiPriorityQueue); - return new RankerScorer(scorers, rankerIterator, ranker); + DocIdSetIterator.all(context.reader().maxDoc()), disiPriorityQueue, context.docBase, featureScoreCache); + return new RankerScorer(scorers, rankerIterator, ranker, context.docBase, featureScoreCache); } class RankerScorer extends Scorer { @@ -281,12 +296,17 @@ class RankerScorer extends Scorer { private final DisjunctionDISI iterator; private final FVLtrRankerWrapper ranker; private LtrRanker.FeatureVector fv; + private final int docBase; + private final Map featureScoreCache; - RankerScorer(List scorers, DisjunctionDISI iterator, FVLtrRankerWrapper ranker) { + RankerScorer(List scorers, DisjunctionDISI iterator, FVLtrRankerWrapper ranker, + int docBase, Map featureScoreCache) { super(RankerWeight.this); this.scorers = scorers; this.iterator = iterator; this.ranker = ranker; + this.docBase = docBase; + this.featureScoreCache = featureScoreCache; } @Override @@ -297,16 +317,43 @@ public int docID() { @Override public float score() throws IOException { fv = ranker.newFeatureVector(fv); - int ordinal = -1; - // a DisiPriorityQueue could help to avoid - // looping on all scorers - for (Scorer scorer : scorers) { - ordinal++; - // FIXME: Probably inefficient, again we loop over all scorers.. - if (scorer.docID() == docID()) { - // XXX: bold assumption that all models are dense - // do we need a some indirection to infer the featureId? - fv.setFeatureScore(ordinal, scorer.score()); + if (featureScoreCache == null) { // Cache disabled + int ordinal = -1; + // a DisiPriorityQueue could help to avoid + // looping on all scorers + for (Scorer scorer : scorers) { + ordinal++; + // FIXME: Probably inefficient, again we loop over all scorers.. + if (scorer.docID() == docID()) { + // XXX: bold assumption that all models are dense + // do we need a some indirection to infer the featureId? + fv.setFeatureScore(ordinal, scorer.score()); + } + } + } else { + int perShardDocId = docBase + docID(); + if (featureScoreCache.containsKey(perShardDocId)) { // Cache hit + float[] featureScores = featureScoreCache.get(perShardDocId); + int ordinal = -1; + for (float score : featureScores) { + ordinal++; + if (!Float.isNaN(score)) { + fv.setFeatureScore(ordinal, score); + } + } + } else { // Cache miss + int ordinal = -1; + float[] featureScores = new float[scorers.size()]; + for (Scorer scorer : scorers) { + ordinal++; + float score = Float.NaN; + if (scorer.docID() == docID()) { + score = scorer.score(); + fv.setFeatureScore(ordinal, score); + } + featureScores[ordinal] = score; + } + featureScoreCache.put(perShardDocId, featureScores); } } return ranker.score(fv); @@ -343,10 +390,15 @@ public float getMaxScore(int upTo) throws IOException { static class DisjunctionDISI extends DocIdSetIterator { private final DocIdSetIterator main; private final DisiPriorityQueue subIteratorsPriorityQueue; + private final int docBase; + private final Map featureScoreCache; - DisjunctionDISI(DocIdSetIterator main, DisiPriorityQueue subIteratorsPriorityQueue) { + DisjunctionDISI(DocIdSetIterator main, DisiPriorityQueue subIteratorsPriorityQueue, int docBase, + Map featureScoreCache) { this.main = main; this.subIteratorsPriorityQueue = subIteratorsPriorityQueue; + this.docBase = docBase; + this.featureScoreCache = featureScoreCache; } @Override @@ -364,6 +416,9 @@ public int nextDoc() throws IOException { @Override public int advance(int target) throws IOException { int docId = main.advance(target); + if (featureScoreCache != null && featureScoreCache.containsKey(docBase + target)) { + return docId; // Cache hit. No need to advance sub iterators + } advanceSubIterators(docId); return docId; } @@ -425,4 +480,13 @@ public int hashCode() { return Objects.hash(wrapped, vectorSupplier); } } + + @Override + public void visit(QueryVisitor visitor) { + QueryVisitor v = visitor.getSubVisitor(BooleanClause.Occur.SHOULD, this); + for (Query q : queries) { + q.visit(v); + } + } + } diff --git a/src/main/java/com/o19s/es/ltr/query/StoredLtrQueryBuilder.java b/src/main/java/com/o19s/es/ltr/query/StoredLtrQueryBuilder.java index 262b863d..98d6bcae 100644 --- a/src/main/java/com/o19s/es/ltr/query/StoredLtrQueryBuilder.java +++ b/src/main/java/com/o19s/es/ltr/query/StoredLtrQueryBuilder.java @@ -49,6 +49,7 @@ public class StoredLtrQueryBuilder extends AbstractQueryBuilder implements NamedWriteable { public static final String NAME = "sltr"; public static final ParseField MODEL_NAME = new ParseField("model"); + public static final ParseField FEATURE_CACHE_FLAG = new ParseField("cache"); public static final ParseField FEATURESET_NAME = new ParseField("featureset"); public static final ParseField STORE_NAME = new ParseField("store"); public static final ParseField PARAMS = new ParseField("params"); @@ -58,6 +59,7 @@ public class StoredLtrQueryBuilder extends AbstractQueryBuilder(NAME); PARSER.declareString(StoredLtrQueryBuilder::modelName, MODEL_NAME); + PARSER.declareBoolean(StoredLtrQueryBuilder::featureScoreCacheFlag, FEATURE_CACHE_FLAG); PARSER.declareString(StoredLtrQueryBuilder::featureSetName, FEATURESET_NAME); PARSER.declareString(StoredLtrQueryBuilder::storeName, STORE_NAME); PARSER.declareField(StoredLtrQueryBuilder::params, XContentParser::map, PARAMS, ObjectParser.ValueType.OBJECT); @@ -66,10 +68,11 @@ public class StoredLtrQueryBuilder extends AbstractQueryBuilder params; @@ -84,10 +87,13 @@ public StoredLtrQueryBuilder(FeatureStoreLoader storeLoader, StreamInput input) super(input); this.storeLoader = Objects.requireNonNull(storeLoader); modelName = input.readOptionalString(); + featureScoreCacheFlag = input.readOptionalBoolean(); featureSetName = input.readOptionalString(); params = input.readMap(); - String[] activeFeat = input.readOptionalStringArray(); - activeFeatures = activeFeat == null ? null : Arrays.asList(activeFeat); + if (input.getVersion().onOrAfter(Version.V_1_0_0)) {//TODO: check this. In the Elastic LTR plugin this is set to 7_0_0 + String[] activeFeat = input.readOptionalStringArray(); + activeFeatures = activeFeat == null ? null : Arrays.asList(activeFeat); + } storeName = input.readOptionalString(); } @@ -112,9 +118,12 @@ public static StoredLtrQueryBuilder fromXContent(FeatureStoreLoader storeLoader, @Override protected void doWriteTo(StreamOutput out) throws IOException { out.writeOptionalString(modelName); + out.writeOptionalBoolean(featureScoreCacheFlag); out.writeOptionalString(featureSetName); out.writeMap(params); - out.writeOptionalStringArray(activeFeatures != null ? activeFeatures.toArray(new String[0]) : null); + if (out.getVersion().onOrAfter(Version.V_1_0_0)) { + out.writeOptionalStringArray(activeFeatures != null ? activeFeatures.toArray(new String[0]) : null); + } out.writeOptionalString(storeName); } @@ -124,6 +133,9 @@ protected void doXContent(XContentBuilder builder, Params p) throws IOException if (modelName != null) { builder.field(MODEL_NAME.getPreferredName(), modelName); } + if (featureScoreCacheFlag != null) { + builder.field(FEATURE_CACHE_FLAG.getPreferredName(), featureScoreCacheFlag); + } if (featureSetName != null) { builder.field(FEATURESET_NAME.getPreferredName(), featureSetName); } @@ -157,7 +169,7 @@ protected RankerQuery doToQuery(QueryShardContext context) throws IOException { if (modelName != null) { CompiledLtrModel model = store.loadModel(modelName); validateActiveFeatures(model.featureSet(), ltrQueryContext); - return RankerQuery.build(model, ltrQueryContext, params); + return RankerQuery.build(model, ltrQueryContext, params, featureScoreCacheFlag); } else { assert featureSetName != null; FeatureSet set = store.loadSet(featureSetName); @@ -166,13 +178,14 @@ protected RankerQuery doToQuery(QueryShardContext context) throws IOException { LinearRanker ranker = new LinearRanker(weights); CompiledLtrModel model = new CompiledLtrModel("linear", set, ranker); validateActiveFeatures(model.featureSet(), ltrQueryContext); - return RankerQuery.build(model, ltrQueryContext, params); + return RankerQuery.build(model, ltrQueryContext, params, featureScoreCacheFlag); } } @Override protected boolean doEquals(StoredLtrQueryBuilder other) { return Objects.equals(modelName, other.modelName) && + Objects.equals(featureScoreCacheFlag, other.featureScoreCacheFlag) && Objects.equals(featureSetName, other.featureSetName) && Objects.equals(storeName, other.storeName) && Objects.equals(params, other.params) && @@ -181,7 +194,7 @@ protected boolean doEquals(StoredLtrQueryBuilder other) { @Override protected int doHashCode() { - return Objects.hash(modelName, featureSetName, storeName, params, activeFeatures); + return Objects.hash(modelName, featureScoreCacheFlag, featureSetName, storeName, params, activeFeatures); } @Override @@ -198,6 +211,11 @@ public StoredLtrQueryBuilder modelName(String modelName) { return this; } + public StoredLtrQueryBuilder featureScoreCacheFlag(Boolean featureScoreCacheFlag) { + this.featureScoreCacheFlag = featureScoreCacheFlag; + return this; + } + public String featureSetName() { return featureSetName; } diff --git a/src/main/java/com/o19s/es/ltr/query/ValidatingLtrQueryBuilder.java b/src/main/java/com/o19s/es/ltr/query/ValidatingLtrQueryBuilder.java index 874c6f6f..a6f0363a 100644 --- a/src/main/java/com/o19s/es/ltr/query/ValidatingLtrQueryBuilder.java +++ b/src/main/java/com/o19s/es/ltr/query/ValidatingLtrQueryBuilder.java @@ -173,10 +173,10 @@ protected Query doToQuery(QueryShardContext queryShardContext) throws IOExceptio FeatureSet set = ((StoredFeatureSet) element).optimize(); LinearRanker ranker = new LinearRanker(new float[set.size()]); CompiledLtrModel model = new CompiledLtrModel("validation", set, ranker); - return RankerQuery.build(model, context, validation.getParams()); + return RankerQuery.build(model, context, validation.getParams(), false); } else if (StoredLtrModel.TYPE.equals(element.type())) { CompiledLtrModel model = ((StoredLtrModel) element).compile(factory); - return RankerQuery.build(model, context, validation.getParams()); + return RankerQuery.build(model, context, validation.getParams(), false); } else { throw new QueryShardException(queryShardContext, "Unknown element type [" + element.type() + "]"); } diff --git a/src/main/java/com/o19s/es/ltr/rest/RestFeatureManager.java b/src/main/java/com/o19s/es/ltr/rest/RestFeatureManager.java index 407302dd..9b2d8a4b 100644 --- a/src/main/java/com/o19s/es/ltr/rest/RestFeatureManager.java +++ b/src/main/java/com/o19s/es/ltr/rest/RestFeatureManager.java @@ -90,7 +90,7 @@ RestChannelConsumer delete(NodeClient client, String type, String indexName, Res String routing = request.param("routing"); return (channel) -> { RestStatusToXContentListener restR = new RestStatusToXContentListener<>(channel, (r) -> r.getLocation(routing)); - client.prepareDelete(indexName, ES_TYPE, id) + client.prepareDelete(indexName, id) .setRouting(routing) .execute(ActionListener.wrap((deleteResponse) -> { // wrap the response so we can send another request to clear the cache @@ -124,7 +124,7 @@ RestChannelConsumer get(NodeClient client, String type, String indexName, RestRe String name = request.param("name"); String routing = request.param("routing"); String id = generateId(type, name); - return (channel) -> client.prepareGet(indexName, ES_TYPE, id) + return (channel) -> client.prepareGet(indexName, id) .setRouting(routing) .execute(new RestToXContentListener(channel) { @Override diff --git a/src/main/java/com/o19s/es/ltr/rest/RestSearchStoreElements.java b/src/main/java/com/o19s/es/ltr/rest/RestSearchStoreElements.java index ebdabc9c..beef4101 100644 --- a/src/main/java/com/o19s/es/ltr/rest/RestSearchStoreElements.java +++ b/src/main/java/com/o19s/es/ltr/rest/RestSearchStoreElements.java @@ -63,7 +63,6 @@ RestChannelConsumer search(NodeClient client, String type, String indexName, Res qb.must(matchQuery("name.prefix", prefix)); } return (channel) -> client.prepareSearch(indexName) - .setTypes(IndexFeatureStore.ES_TYPE) .setQuery(qb) .setSize(size) .setFrom(from) diff --git a/src/main/java/com/o19s/es/termstat/TermStatQuery.java b/src/main/java/com/o19s/es/termstat/TermStatQuery.java index 794b58e2..c124f19d 100644 --- a/src/main/java/com/o19s/es/termstat/TermStatQuery.java +++ b/src/main/java/com/o19s/es/termstat/TermStatQuery.java @@ -13,6 +13,7 @@ * limitations under the License. * */ + package com.o19s.es.termstat; import com.o19s.es.explore.StatisticsHelper; @@ -21,14 +22,19 @@ import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.Term; -import org.apache.lucene.search.Explanation; -import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.index.TermStates; +import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.Query; +import org.apache.lucene.search.QueryVisitor; import org.apache.lucene.search.ScoreMode; -import org.apache.lucene.search.Scorer; +import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Weight; +import org.apache.lucene.search.Explanation; +import org.apache.lucene.search.Scorer; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; import java.util.Set; @@ -96,8 +102,14 @@ static class TermStatWeight extends Weight { private final AggrType aggr; private final AggrType posAggr; private final Set terms; - - TermStatWeight(IndexSearcher searcher, TermStatQuery tsq, Set terms, ScoreMode scoreMode, AggrType aggr, AggrType posAggr) { + private final Map termContexts; + + TermStatWeight(IndexSearcher searcher, + TermStatQuery tsq, + Set terms, + ScoreMode scoreMode, + AggrType aggr, + AggrType posAggr) throws IOException { super(tsq); this.searcher = searcher; this.expression = tsq.expr; @@ -105,9 +117,23 @@ static class TermStatWeight extends Weight { this.scoreMode = scoreMode; this.aggr = aggr; this.posAggr = posAggr; + this.termContexts = new HashMap<>(); + + // This is needed for proper DFS_QUERY_THEN_FETCH support + if (scoreMode.needsScores()) { + for (Term t : terms) { + TermStates ctx = TermStates.build(searcher.getTopReaderContext(), t, true); + + if (ctx != null && ctx.docFreq() > 0) { + searcher.collectionStatistics(t.field()); + searcher.termStatistics(t, ctx.docFreq(), ctx.totalTermFreq()); + } + + termContexts.put(t, ctx); + } + } } - @Override public void extractTerms(Set terms) { terms.addAll(terms); } @@ -125,7 +151,7 @@ public Explanation explain(LeafReaderContext context, int doc) throws IOExceptio @Override public Scorer scorer(LeafReaderContext context) throws IOException { - return new TermStatScorer(this, searcher, context, expression, terms, scoreMode, aggr, posAggr); + return new TermStatScorer(this, searcher, context, expression, terms, scoreMode, aggr, posAggr, termContexts); } @Override @@ -133,4 +159,16 @@ public boolean isCacheable(LeafReaderContext ctx) { return true; } } + + @Override + public void visit(QueryVisitor visitor) { + Term[] acceptedTerms = terms.stream().filter( + t -> visitor.acceptField(t.field()) + ).toArray(Term[]::new); + + if (acceptedTerms.length > 0) { + QueryVisitor v = visitor.getSubVisitor(BooleanClause.Occur.SHOULD, this); + v.consumeTerms(this, acceptedTerms); + } + } } diff --git a/src/main/java/com/o19s/es/termstat/TermStatScorer.java b/src/main/java/com/o19s/es/termstat/TermStatScorer.java index c9abcde3..8382ba71 100644 --- a/src/main/java/com/o19s/es/termstat/TermStatScorer.java +++ b/src/main/java/com/o19s/es/termstat/TermStatScorer.java @@ -22,6 +22,7 @@ import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.Term; +import org.apache.lucene.index.TermStates; import org.apache.lucene.search.DocIdSetIterator; import org.apache.lucene.search.DoubleValues; import org.apache.lucene.search.DoubleValuesSource; @@ -31,6 +32,7 @@ import java.io.IOException; import java.util.HashMap; +import java.util.Map; import java.util.Set; public class TermStatScorer extends Scorer { @@ -44,6 +46,7 @@ public class TermStatScorer extends Scorer { private final IndexSearcher searcher; private final Set terms; private final ScoreMode scoreMode; + private final Map termContexts; public TermStatScorer(TermStatQuery.TermStatWeight weight, IndexSearcher searcher, @@ -52,7 +55,8 @@ public TermStatScorer(TermStatQuery.TermStatWeight weight, Set terms, ScoreMode scoreMode, AggrType aggr, - AggrType posAggr) { + AggrType posAggr, + Map termContexts) { super(weight); this.context = context; this.compiledExpression = compiledExpression; @@ -61,6 +65,7 @@ public TermStatScorer(TermStatQuery.TermStatWeight weight, this.scoreMode = scoreMode; this.aggr = aggr; this.posAggr = posAggr; + this.termContexts = termContexts; this.iter = DocIdSetIterator.all(context.reader().maxDoc()); } @@ -80,7 +85,7 @@ public float score() throws IOException { // Refresh the term stats tsq.setPosAggr(posAggr); - tsq.bump(searcher, context, docID(), terms, scoreMode); + tsq.bump(searcher, context, docID(), terms, scoreMode, termContexts); // Prepare computed statistics StatisticsHelper computed = new StatisticsHelper(); diff --git a/src/main/java/com/o19s/es/termstat/TermStatSupplier.java b/src/main/java/com/o19s/es/termstat/TermStatSupplier.java index c9c88d78..6167b27f 100644 --- a/src/main/java/com/o19s/es/termstat/TermStatSupplier.java +++ b/src/main/java/com/o19s/es/termstat/TermStatSupplier.java @@ -28,6 +28,7 @@ import org.apache.lucene.search.DocIdSetIterator; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.ScoreMode; +import org.apache.lucene.search.TermStatistics; import org.apache.lucene.search.similarities.ClassicSimilarity; import java.io.IOException; @@ -37,6 +38,7 @@ import java.util.Arrays; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; @@ -62,7 +64,7 @@ public TermStatSupplier() { public void bump (IndexSearcher searcher, LeafReaderContext context, int docID, Set terms, - ScoreMode scoreMode) throws IOException { + ScoreMode scoreMode, Map termContexts) throws IOException { df_stats.getData().clear(); idf_stats.getData().clear(); tf_stats.getData().clear(); @@ -76,22 +78,24 @@ public void bump (IndexSearcher searcher, LeafReaderContext context, break; } - TermStates termStates = TermStates.build(searcher.getTopReaderContext(), term, scoreMode.needsScores()); + TermStates termStates = termContexts.get(term); assert termStates != null && termStates .wasBuiltFor(ReaderUtil.getTopLevelContext(context)); TermState state = termStates.get(context); - if (state == null) { + if (state == null || termStates.docFreq() == 0) { insertZeroes(); // Zero out stats for terms we don't know about in the index continue; } + TermStatistics indexStats = searcher.termStatistics(term, termStates.docFreq(), termStates.totalTermFreq()); + // Collection Statistics - df_stats.add(termStates.docFreq()); - idf_stats.add(sim.idf(termStates.docFreq(), searcher.getIndexReader().numDocs())); - ttf_stats.add(termStates.totalTermFreq()); + df_stats.add(indexStats.docFreq()); + idf_stats.add(sim.idf(indexStats.docFreq(), searcher.collectionStatistics(term.field()).docCount())); + ttf_stats.add(indexStats.totalTermFreq()); // Doc specifics TermsEnum termsEnum = context.reader().terms(term.field()).iterator(); diff --git a/src/test/java/com/o19s/es/explore/ExplorerQueryTests.java b/src/test/java/com/o19s/es/explore/ExplorerQueryTests.java index 2ebaa990..ede0ab7b 100644 --- a/src/test/java/com/o19s/es/explore/ExplorerQueryTests.java +++ b/src/test/java/com/o19s/es/explore/ExplorerQueryTests.java @@ -32,7 +32,7 @@ import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.ByteBuffersDirectory; import org.apache.lucene.store.Directory; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import org.opensearch.common.lucene.Lucene; import org.junit.After; import org.junit.Before; diff --git a/src/test/java/com/o19s/es/explore/StatisticsHelperTests.java b/src/test/java/com/o19s/es/explore/StatisticsHelperTests.java index febb0aa9..bd79eb0b 100644 --- a/src/test/java/com/o19s/es/explore/StatisticsHelperTests.java +++ b/src/test/java/com/o19s/es/explore/StatisticsHelperTests.java @@ -15,7 +15,7 @@ */ package com.o19s.es.explore; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; public class StatisticsHelperTests extends LuceneTestCase { private final float[] dataset = new float[] { diff --git a/src/test/java/com/o19s/es/ltr/LtrQueryContextTests.java b/src/test/java/com/o19s/es/ltr/LtrQueryContextTests.java index 848055bf..7cdf8652 100644 --- a/src/test/java/com/o19s/es/ltr/LtrQueryContextTests.java +++ b/src/test/java/com/o19s/es/ltr/LtrQueryContextTests.java @@ -1,6 +1,6 @@ package com.o19s.es.ltr; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import java.util.Arrays; import java.util.Collections; diff --git a/src/test/java/com/o19s/es/ltr/LtrTestUtils.java b/src/test/java/com/o19s/es/ltr/LtrTestUtils.java index 0be01199..c6cfd94c 100644 --- a/src/test/java/com/o19s/es/ltr/LtrTestUtils.java +++ b/src/test/java/com/o19s/es/ltr/LtrTestUtils.java @@ -36,7 +36,7 @@ import com.o19s.es.ltr.ranker.normalizer.Normalizer; import com.o19s.es.ltr.ranker.parser.LinearRankerParser; import com.o19s.es.ltr.utils.FeatureStoreLoader; -import org.apache.lucene.util.TestUtil; +import org.apache.lucene.tests.util.TestUtil; import org.opensearch.common.CheckedFunction; import org.opensearch.common.Strings; import org.opensearch.common.xcontent.XContentBuilder; @@ -50,7 +50,7 @@ import java.util.function.Function; import java.util.function.IntFunction; -import static org.apache.lucene.util.LuceneTestCase.random; +import static org.apache.lucene.tests.util.LuceneTestCase.random; public class LtrTestUtils { diff --git a/src/test/java/com/o19s/es/ltr/feature/store/ExtraLoggingSupplierTests.java b/src/test/java/com/o19s/es/ltr/feature/store/ExtraLoggingSupplierTests.java index f81718e8..245ed8bf 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/ExtraLoggingSupplierTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/ExtraLoggingSupplierTests.java @@ -17,7 +17,7 @@ package com.o19s.es.ltr.feature.store; import com.o19s.es.ltr.ranker.LogLtrRanker; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import java.util.HashMap; import java.util.Map; diff --git a/src/test/java/com/o19s/es/ltr/feature/store/FeatureSupplierTests.java b/src/test/java/com/o19s/es/ltr/feature/store/FeatureSupplierTests.java index fdd4f68f..0c54be7d 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/FeatureSupplierTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/FeatureSupplierTests.java @@ -20,7 +20,7 @@ import com.o19s.es.ltr.ranker.DenseFeatureVector; import com.o19s.es.ltr.ranker.LtrRanker; import com.o19s.es.ltr.utils.Suppliers; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import org.opensearch.index.query.QueryBuilders; import java.util.Collections; diff --git a/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureParserTests.java b/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureParserTests.java index 61f61e93..86bcd36b 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureParserTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureParserTests.java @@ -16,7 +16,7 @@ package com.o19s.es.ltr.feature.store; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import org.opensearch.common.ParsingException; import org.opensearch.common.Strings; import org.opensearch.common.xcontent.LoggingDeprecationHandler; diff --git a/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureSetParserTests.java b/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureSetParserTests.java index 15e3eac4..d4815d3f 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureSetParserTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureSetParserTests.java @@ -18,7 +18,7 @@ import com.o19s.es.ltr.feature.FeatureSet; import com.o19s.es.ltr.query.DerivedExpressionQuery; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import org.opensearch.common.ParsingException; import org.opensearch.common.Strings; import org.opensearch.common.xcontent.LoggingDeprecationHandler; @@ -37,8 +37,8 @@ import java.util.Set; import java.util.function.Consumer; -import static org.apache.lucene.util.TestUtil.randomRealisticUnicodeString; -import static org.apache.lucene.util.TestUtil.randomSimpleString; +import static org.apache.lucene.tests.util.TestUtil.randomRealisticUnicodeString; +import static org.apache.lucene.tests.util.TestUtil.randomSimpleString; import static org.opensearch.common.xcontent.NamedXContentRegistry.EMPTY; import static org.opensearch.common.xcontent.json.JsonXContent.jsonXContent; import static org.hamcrest.CoreMatchers.allOf; diff --git a/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureSetTests.java b/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureSetTests.java index c5508f1c..3436a0fd 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureSetTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureSetTests.java @@ -16,7 +16,7 @@ package com.o19s.es.ltr.feature.store; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import java.io.IOException; import java.util.List; diff --git a/src/test/java/com/o19s/es/ltr/feature/store/StoredLtrModelParserTests.java b/src/test/java/com/o19s/es/ltr/feature/store/StoredLtrModelParserTests.java index 062eb0e7..d14f2896 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/StoredLtrModelParserTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/StoredLtrModelParserTests.java @@ -23,7 +23,7 @@ import com.o19s.es.ltr.ranker.normalizer.StandardFeatureNormalizer; import com.o19s.es.ltr.ranker.parser.LtrRankerParserFactory; import org.apache.lucene.util.BytesRef; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import org.opensearch.Version; import org.opensearch.common.ParsingException; import org.opensearch.common.Randomness; diff --git a/src/test/java/com/o19s/es/ltr/feature/store/index/CachedFeatureStoreTests.java b/src/test/java/com/o19s/es/ltr/feature/store/index/CachedFeatureStoreTests.java index e1773cfb..1b0b417e 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/index/CachedFeatureStoreTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/index/CachedFeatureStoreTests.java @@ -21,8 +21,8 @@ import com.o19s.es.ltr.feature.store.MemStore; import com.o19s.es.ltr.feature.store.StoredFeature; import com.o19s.es.ltr.feature.store.StoredFeatureSet; -import org.apache.lucene.util.LuceneTestCase; -import org.apache.lucene.util.TestUtil; +import org.apache.lucene.tests.util.LuceneTestCase; +import org.apache.lucene.tests.util.TestUtil; import org.opensearch.common.settings.Settings; import org.opensearch.common.unit.ByteSizeValue; import org.opensearch.common.unit.TimeValue; diff --git a/src/test/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStoreTests.java b/src/test/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStoreTests.java index b192fbf9..53d77a07 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStoreTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStoreTests.java @@ -23,8 +23,8 @@ import com.o19s.es.ltr.feature.store.StoredFeatureSet; import com.o19s.es.ltr.feature.store.StoredLtrModel; import org.apache.lucene.util.BytesRef; -import org.apache.lucene.util.LuceneTestCase; -import org.apache.lucene.util.TestUtil; +import org.apache.lucene.tests.util.LuceneTestCase; +import org.apache.lucene.tests.util.TestUtil; import org.opensearch.client.Requests; import org.opensearch.common.bytes.BytesReference; import org.opensearch.common.xcontent.LoggingDeprecationHandler; @@ -41,8 +41,8 @@ import static com.o19s.es.ltr.feature.store.index.IndexFeatureStore.indexName; import static com.o19s.es.ltr.feature.store.index.IndexFeatureStore.isIndexStore; import static com.o19s.es.ltr.feature.store.index.IndexFeatureStore.storeName; -import static org.apache.lucene.util.TestUtil.randomRealisticUnicodeString; -import static org.apache.lucene.util.TestUtil.randomSimpleString; +import static org.apache.lucene.tests.util.TestUtil.randomRealisticUnicodeString; +import static org.apache.lucene.tests.util.TestUtil.randomSimpleString; import static org.hamcrest.CoreMatchers.equalTo; public class IndexFeatureStoreTests extends LuceneTestCase { diff --git a/src/test/java/com/o19s/es/ltr/logging/LoggingFetchSubPhaseTests.java b/src/test/java/com/o19s/es/ltr/logging/LoggingFetchSubPhaseTests.java index 8aa3f5e0..1f35207d 100644 --- a/src/test/java/com/o19s/es/ltr/logging/LoggingFetchSubPhaseTests.java +++ b/src/test/java/com/o19s/es/ltr/logging/LoggingFetchSubPhaseTests.java @@ -42,8 +42,8 @@ import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.Weight; import org.apache.lucene.store.Directory; -import org.apache.lucene.util.LuceneTestCase; -import org.apache.lucene.util.TestUtil; +import org.apache.lucene.tests.util.LuceneTestCase; +import org.apache.lucene.tests.util.TestUtil; import org.opensearch.common.lucene.search.function.CombineFunction; import org.opensearch.common.lucene.search.function.FieldValueFactorFunction; import org.opensearch.common.lucene.search.function.FunctionScoreQuery; @@ -182,7 +182,6 @@ public void collect(int doc) throws IOException { SearchHit hit = new SearchHit( doc, id, - new Text("text"), random().nextBoolean() ? new HashMap<>() : null, null ); diff --git a/src/test/java/com/o19s/es/ltr/query/LtrQueryTests.java b/src/test/java/com/o19s/es/ltr/query/LtrQueryTests.java index 5e67a584..f970db45 100644 --- a/src/test/java/com/o19s/es/ltr/query/LtrQueryTests.java +++ b/src/test/java/com/o19s/es/ltr/query/LtrQueryTests.java @@ -42,7 +42,7 @@ import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.LeafReaderContext; -import org.apache.lucene.index.RandomIndexWriter; +import org.apache.lucene.tests.index.RandomIndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.misc.SweetSpotSimilarity; import org.apache.lucene.queries.BlendedTermQuery; @@ -76,7 +76,7 @@ import org.apache.lucene.search.similarities.Similarity; import org.apache.lucene.search.similarities.TFIDFSimilarity; import org.apache.lucene.store.Directory; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import org.opensearch.common.lucene.search.function.FunctionScoreQuery; import org.opensearch.common.lucene.search.function.WeightFactorFunction; import org.junit.After; diff --git a/src/test/java/com/o19s/es/ltr/ranker/DenseLtrRankerTests.java b/src/test/java/com/o19s/es/ltr/ranker/DenseLtrRankerTests.java index aa7e9f20..a3ba1d3e 100644 --- a/src/test/java/com/o19s/es/ltr/ranker/DenseLtrRankerTests.java +++ b/src/test/java/com/o19s/es/ltr/ranker/DenseLtrRankerTests.java @@ -16,7 +16,7 @@ package com.o19s.es.ltr.ranker; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; public class DenseLtrRankerTests extends LuceneTestCase { public void newFeatureVector() throws Exception { diff --git a/src/test/java/com/o19s/es/ltr/ranker/LogLtrRankerTests.java b/src/test/java/com/o19s/es/ltr/ranker/LogLtrRankerTests.java index 358b8eed..9e003f32 100644 --- a/src/test/java/com/o19s/es/ltr/ranker/LogLtrRankerTests.java +++ b/src/test/java/com/o19s/es/ltr/ranker/LogLtrRankerTests.java @@ -17,8 +17,8 @@ package com.o19s.es.ltr.ranker; import com.o19s.es.ltr.ranker.linear.LinearRankerTests; -import org.apache.lucene.util.LuceneTestCase; -import org.apache.lucene.util.TestUtil; +import org.apache.lucene.tests.util.LuceneTestCase; +import org.apache.lucene.tests.util.TestUtil; public class LogLtrRankerTests extends LuceneTestCase { public void testNewFeatureVector() throws Exception { diff --git a/src/test/java/com/o19s/es/ltr/ranker/dectree/NaiveAdditiveDecisionTreeTests.java b/src/test/java/com/o19s/es/ltr/ranker/dectree/NaiveAdditiveDecisionTreeTests.java index 6abb1f25..9606a6e2 100644 --- a/src/test/java/com/o19s/es/ltr/ranker/dectree/NaiveAdditiveDecisionTreeTests.java +++ b/src/test/java/com/o19s/es/ltr/ranker/dectree/NaiveAdditiveDecisionTreeTests.java @@ -26,8 +26,8 @@ import com.o19s.es.ltr.ranker.normalizer.Normalizers; import org.apache.logging.log4j.Logger; import org.apache.lucene.search.MatchAllDocsQuery; -import org.apache.lucene.util.LuceneTestCase; -import org.apache.lucene.util.TestUtil; +import org.apache.lucene.tests.util.LuceneTestCase; +import org.apache.lucene.tests.util.TestUtil; import org.apache.logging.log4j.LogManager; import java.io.BufferedReader; @@ -47,7 +47,7 @@ import static org.apache.lucene.util.RamUsageEstimator.NUM_BYTES_ARRAY_HEADER; import static org.apache.lucene.util.RamUsageEstimator.NUM_BYTES_OBJECT_HEADER; import static org.apache.lucene.util.RamUsageEstimator.NUM_BYTES_OBJECT_REF; -import static org.apache.lucene.util.TestUtil.nextInt; +import static org.apache.lucene.tests.util.TestUtil.nextInt; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.lessThan; import static org.hamcrest.core.AllOf.allOf; diff --git a/src/test/java/com/o19s/es/ltr/ranker/linear/LinearRankerTests.java b/src/test/java/com/o19s/es/ltr/ranker/linear/LinearRankerTests.java index a02c25ee..ce0d1c17 100644 --- a/src/test/java/com/o19s/es/ltr/ranker/linear/LinearRankerTests.java +++ b/src/test/java/com/o19s/es/ltr/ranker/linear/LinearRankerTests.java @@ -21,12 +21,12 @@ import com.o19s.es.ltr.ranker.dectree.NaiveAdditiveDecisionTreeTests; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.apache.lucene.util.LuceneTestCase; -import org.apache.lucene.util.TestUtil; +import org.apache.lucene.tests.util.LuceneTestCase; +import org.apache.lucene.tests.util.TestUtil; import static org.apache.lucene.util.RamUsageEstimator.NUM_BYTES_ARRAY_HEADER; import static org.apache.lucene.util.RamUsageEstimator.NUM_BYTES_OBJECT_HEADER; -import static org.apache.lucene.util.TestUtil.nextInt; +import static org.apache.lucene.tests.util.TestUtil.nextInt; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.lessThan; import static org.hamcrest.core.AllOf.allOf; diff --git a/src/test/java/com/o19s/es/ltr/ranker/normalizer/NormalizersTests.java b/src/test/java/com/o19s/es/ltr/ranker/normalizer/NormalizersTests.java index d71b4662..b360ec9b 100644 --- a/src/test/java/com/o19s/es/ltr/ranker/normalizer/NormalizersTests.java +++ b/src/test/java/com/o19s/es/ltr/ranker/normalizer/NormalizersTests.java @@ -16,7 +16,7 @@ package com.o19s.es.ltr.ranker.normalizer; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import org.hamcrest.CoreMatchers; public class NormalizersTests extends LuceneTestCase { diff --git a/src/test/java/com/o19s/es/ltr/ranker/parser/LinearRankerParserTests.java b/src/test/java/com/o19s/es/ltr/ranker/parser/LinearRankerParserTests.java index 5d2ad359..94e78eaf 100644 --- a/src/test/java/com/o19s/es/ltr/ranker/parser/LinearRankerParserTests.java +++ b/src/test/java/com/o19s/es/ltr/ranker/parser/LinearRankerParserTests.java @@ -22,7 +22,7 @@ import com.o19s.es.ltr.ranker.DenseFeatureVector; import com.o19s.es.ltr.ranker.linear.LinearRanker; import com.o19s.es.ltr.ranker.linear.LinearRankerTests; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import org.opensearch.common.ParsingException; import org.opensearch.common.Strings; import org.opensearch.common.xcontent.XContentBuilder; diff --git a/src/test/java/com/o19s/es/ltr/ranker/parser/LtrRankerParserFactoryTests.java b/src/test/java/com/o19s/es/ltr/ranker/parser/LtrRankerParserFactoryTests.java index 08ffa9c5..0d329746 100644 --- a/src/test/java/com/o19s/es/ltr/ranker/parser/LtrRankerParserFactoryTests.java +++ b/src/test/java/com/o19s/es/ltr/ranker/parser/LtrRankerParserFactoryTests.java @@ -16,7 +16,7 @@ package com.o19s.es.ltr.ranker.parser; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import static org.hamcrest.CoreMatchers.containsString; diff --git a/src/test/java/com/o19s/es/ltr/ranker/parser/XGBoostJsonParserTests.java b/src/test/java/com/o19s/es/ltr/ranker/parser/XGBoostJsonParserTests.java index ec73f0c1..39ae446e 100644 --- a/src/test/java/com/o19s/es/ltr/ranker/parser/XGBoostJsonParserTests.java +++ b/src/test/java/com/o19s/es/ltr/ranker/parser/XGBoostJsonParserTests.java @@ -24,7 +24,7 @@ import com.o19s.es.ltr.ranker.LtrRanker.FeatureVector; import com.o19s.es.ltr.ranker.dectree.NaiveAdditiveDecisionTree; import com.o19s.es.ltr.ranker.linear.LinearRankerTests; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import org.opensearch.common.ParsingException; import org.opensearch.core.internal.io.Streams; import org.hamcrest.CoreMatchers; diff --git a/src/test/java/com/o19s/es/ltr/rest/FeaturesParserTests.java b/src/test/java/com/o19s/es/ltr/rest/FeaturesParserTests.java index 36679527..2e491643 100644 --- a/src/test/java/com/o19s/es/ltr/rest/FeaturesParserTests.java +++ b/src/test/java/com/o19s/es/ltr/rest/FeaturesParserTests.java @@ -16,7 +16,7 @@ package com.o19s.es.ltr.rest; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import org.opensearch.common.xcontent.LoggingDeprecationHandler; import org.opensearch.common.xcontent.NamedXContentRegistry; import org.opensearch.common.xcontent.XContentParser; diff --git a/src/test/java/com/o19s/es/termstat/TermStatQueryTests.java b/src/test/java/com/o19s/es/termstat/TermStatQueryTests.java index e8738ac3..dd953ebc 100644 --- a/src/test/java/com/o19s/es/termstat/TermStatQueryTests.java +++ b/src/test/java/com/o19s/es/termstat/TermStatQueryTests.java @@ -32,7 +32,7 @@ import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.ByteBuffersDirectory; import org.apache.lucene.store.Directory; -import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.tests.util.LuceneTestCase; import org.opensearch.common.lucene.Lucene; import org.junit.After; From 51ed085b0c1124d1441e31beff44ff9e0aeac667 Mon Sep 17 00:00:00 2001 From: Flax Date: Wed, 7 Sep 2022 21:52:31 +0100 Subject: [PATCH 06/81] The original plugin powers Wikimedia, not the fork (#1) Signed-off-by: Mark Cohen --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2defe7e0..d3f5d379 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ This is a fork of https://github.com/o19s/elasticsearch-learning-to-rank to work with OpenSearch. It's a rewrite of some parts to be able to work with OpenSearch 1.x. Please refer to official documentation of [Elasticsearch Learning to Rank](http://elasticsearch-learning-to-rank.readthedocs.io) for usage. -The OpenSearch Learning to Rank plugin uses machine learning to improve search relevance ranking. It's powering search at places like Wikimedia Foundation and Snagajob! +The OpenSearch Learning to Rank plugin uses machine learning to improve search relevance ranking. The original Elasticsearch LTR plugin powers search at places like Wikimedia Foundation and Snagajob. # Installing From ad951dea6abf5cf8c090c3db1f69f402e558836b Mon Sep 17 00:00:00 2001 From: Matthias Krueger Date: Tue, 13 Sep 2022 16:41:26 +0200 Subject: [PATCH 07/81] Add id back to index request, remove mapping type param from YAML test cases (#3) Signed-off-by: Mark Cohen --- .../com/o19s/es/ltr/action/TransportFeatureStoreAction.java | 1 + .../rest-api-spec/test/fstore/80_search_w_partial_models.yml | 2 -- src/test/resources/rest-api-spec/test/fstore/90_get_stats.yml | 2 -- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/o19s/es/ltr/action/TransportFeatureStoreAction.java b/src/main/java/com/o19s/es/ltr/action/TransportFeatureStoreAction.java index 951e1c28..7e7c7440 100644 --- a/src/main/java/com/o19s/es/ltr/action/TransportFeatureStoreAction.java +++ b/src/main/java/com/o19s/es/ltr/action/TransportFeatureStoreAction.java @@ -105,6 +105,7 @@ private IndexRequest buildIndexRequest(Task parentTask, FeatureStoreRequest requ StorableElement elt = request.getStorableElement(); IndexRequest indexRequest = client.prepareIndex(request.getStore()) + .setId(elt.id()) .setCreate(request.getAction() == FeatureStoreRequest.Action.CREATE) .setRouting(request.getRouting()) .setSource(IndexFeatureStore.toSource(elt)) diff --git a/src/test/resources/rest-api-spec/test/fstore/80_search_w_partial_models.yml b/src/test/resources/rest-api-spec/test/fstore/80_search_w_partial_models.yml index 4434990e..eccc948a 100644 --- a/src/test/resources/rest-api-spec/test/fstore/80_search_w_partial_models.yml +++ b/src/test/resources/rest-api-spec/test/fstore/80_search_w_partial_models.yml @@ -7,14 +7,12 @@ setup: - do: index: index: test - type: test id: 1 body: { "field1": "v1", "field2": "v2", "field3": "some text", "user_rating": 5.2 } - do: index: index: test - type: test id: 2 body: { "field1": "v1 aoeu", "field2": " ua u v2", "field3": "foo bar text", "user_rating": 0.0 } diff --git a/src/test/resources/rest-api-spec/test/fstore/90_get_stats.yml b/src/test/resources/rest-api-spec/test/fstore/90_get_stats.yml index 7bcab57e..3b8347e7 100644 --- a/src/test/resources/rest-api-spec/test/fstore/90_get_stats.yml +++ b/src/test/resources/rest-api-spec/test/fstore/90_get_stats.yml @@ -7,14 +7,12 @@ setup: - do: index: index: test - type: test id: 1 body: { "field1": "v1", "field2": "v2", "field3": "some text", "user_rating": 5.2 } - do: index: index: test - type: test id: 2 body: { "field1": "v1 aoeu", "field2": " ua u v2", "field3": "foo bar text", "user_rating": 0.0 } From aa8d8890a95f6385e9b21027125400431a39f1fd Mon Sep 17 00:00:00 2001 From: gsingers Date: Tue, 13 Sep 2022 11:55:55 -0400 Subject: [PATCH 08/81] update java version in workflows and start updating the readme Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 4 ++-- .github/workflows/test.yml | 4 ++-- README.md | 27 ++++++++++++++++++++------- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b72199b0..a5e1d638 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,10 +15,10 @@ jobs: - uses: actions/checkout@v2 - name: Set release version Name run: echo ::set-env name=RELEASE_VERSION::${GITHUB_REF#refs/*/} - - name: Set up JDK 14.0 + - name: Set up JDK 17.0 uses: actions/setup-java@v1 with: - java-version: 14.0 + java-version: 17.0 - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index dd90f7c8..f0cbdb53 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,10 +14,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Set up JDK 14.0 + - name: Set up JDK 17.0 uses: actions/setup-java@v1 with: - java-version: 14.0 + java-version: 17.0 - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle diff --git a/README.md b/README.md index d3f5d379..c24ea193 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,14 @@ The OpenSearch Learning to Rank plugin uses machine learning to improve search r To install, you'd run a command like this but replacing with the appropriate prebuilt version zip: -| OS | Command | -| ------ | ------- | -| 1.0.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.0.0/ltr-1.5.4-os1.0.0.zip` | -| 1.1.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.1.0/ltr-1.5.4-os1.1.0.zip` | -| 1.2.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.0/ltr-1.5.4-os1.2.0.zip` | -| 1.2.2 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.2/ltr-1.5.4-os1.2.2.zip` | -| 1.2.3 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.3/ltr-1.5.4-os1.2.3.zip` | +| OS | Command | +|-------|------------------------------------------------------------------------------------------------------------------------------------| +| 1.0.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.0.0/ltr-1.5.4-os1.0.0.zip` | +| 1.1.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.1.0/ltr-1.5.4-os1.1.0.zip` | +| 1.2.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.0/ltr-1.5.4-os1.2.0.zip` | +| 1.2.2 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.2/ltr-1.5.4-os1.2.2.zip` | +| 1.2.3 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.3/ltr-1.5.4-os1.2.3.zip` | +| 2.2.1 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/2.2.1/ltr-2.0.0-os2.2.1.zip` | (It's expected you'll confirm some security exceptions, you can pass `-b` to `opensearch-plugin` to automatically install) @@ -23,6 +24,18 @@ To install, you'd run a command like this but replacing with the appropriate pre If you already are running OpenSearch, don't forget to restart! + +# Building + +To build, you need to disable the Java security manager + + ./gradlew -Dtests.security.manager=false clean build + +# Releasing/Packaging + + + + ## About alpha releases These releases are alpha because some issues with the tests due to securemock that depends on ElasticSearch security stuff. From 072a6df01d126ef6f93544de1cbd56d95e617968 Mon Sep 17 00:00:00 2001 From: gsingers Date: Tue, 13 Sep 2022 13:43:17 -0400 Subject: [PATCH 09/81] update to main branch Signed-off-by: Mark Cohen --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f0cbdb53..e1f5100c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,9 +5,9 @@ name: Run CI tests with Gradle on: push: - branches: [ master ] + branches: [ main ] pull_request: - branches: [ master ] + branches: [ main ] jobs: test: From ed267cb69f92b1ae7f8c35938fb6dace0be540e3 Mon Sep 17 00:00:00 2001 From: gsingers Date: Tue, 13 Sep 2022 13:43:53 -0400 Subject: [PATCH 10/81] add sec manager flag Signed-off-by: Mark Cohen --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e1f5100c..ab7f221a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,4 +21,4 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle - run: ./gradlew clean check + run: ./gradlew -Dtests.security.manager=false clean check From 2e9a7b09ac90d2da378337e81f54bed38b84462d Mon Sep 17 00:00:00 2001 From: gsingers Date: Tue, 13 Sep 2022 13:55:21 -0400 Subject: [PATCH 11/81] add test target to gh action Signed-off-by: Mark Cohen --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ab7f221a..fc2a094f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,4 +21,4 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle - run: ./gradlew -Dtests.security.manager=false clean check + run: ./gradlew -Dtests.security.manager=false clean test From 3dd5cf7cf863d61485069aa9c0f05dd1ce32e2ee Mon Sep 17 00:00:00 2001 From: gsingers Date: Tue, 13 Sep 2022 14:16:16 -0400 Subject: [PATCH 12/81] fix environment vars Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a5e1d638..5495ca47 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Set release version Name - run: echo ::set-env name=RELEASE_VERSION::${GITHUB_REF#refs/*/} + run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - name: Set up JDK 17.0 uses: actions/setup-java@v1 with: From 22098a0e65b53fdfc738a9a2f7e32e1b80e23fc7 Mon Sep 17 00:00:00 2001 From: gsingers Date: Tue, 13 Sep 2022 14:27:44 -0400 Subject: [PATCH 13/81] turn off sec. mgr in the dist Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5495ca47..486c1d65 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,7 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle - run: ./gradlew build + run: ./gradlew -Dtests.security.manager=false build - name: Rename build assets run: mv ./build/distributions/ltr-*.zip ./ltr-plugin-${{ env.RELEASE_VERSION }}.zip - name: Create Release From 0849692a442656552883e49b51235199965fc166 Mon Sep 17 00:00:00 2001 From: gsingers Date: Tue, 13 Sep 2022 14:40:56 -0400 Subject: [PATCH 14/81] add permissions Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 486c1d65..955afe0e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -28,6 +28,8 @@ jobs: - name: Create Release id: create_release uses: actions/create-release@v1 + permissions: + issues: write env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From 74219e76d62848c63a357edda08e40409296032d Mon Sep 17 00:00:00 2001 From: gsingers Date: Tue, 13 Sep 2022 14:46:27 -0400 Subject: [PATCH 15/81] attempt permissions Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 955afe0e..968052d7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,6 +8,9 @@ on: tags: - 'v*.*.*' +permissions: + actions: write + jobs: release: runs-on: ubuntu-latest @@ -28,8 +31,6 @@ jobs: - name: Create Release id: create_release uses: actions/create-release@v1 - permissions: - issues: write env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From a0e27c99c98030fc481efea084504e07c369ffc1 Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 11:56:08 -0400 Subject: [PATCH 16/81] try new release action Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 968052d7..3b10a60e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,13 +7,13 @@ on: push: tags: - 'v*.*.*' - -permissions: - actions: write + - 'test-release' jobs: release: runs-on: ubuntu-latest + permissions: + contents: write steps: - uses: actions/checkout@v2 - name: Set release version Name @@ -30,14 +30,12 @@ jobs: run: mv ./build/distributions/ltr-*.zip ./ltr-plugin-${{ env.RELEASE_VERSION }}.zip - name: Create Release id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + uses: ncipollo/release-action@v1 with: tag_name: ${{ env.RELEASE_VERSION }} + artifacts: "./ltr-plugin-${{ env.RELEASE_VERSION }}.zip" release_name: Release ${{ env.RELEASE_VERSION }} - draft: false - prerelease: false + token: ${{ secrets.GITHUB_TOKEN }} - name: Upload Release Asset id: upload-release-asset uses: actions/upload-release-asset@v1 From bccfd1019e9fe5b56d9883d258e83ee4d41443ae Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 11:58:26 -0400 Subject: [PATCH 17/81] add branch for testing Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3b10a60e..ce814aab 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,7 +7,7 @@ on: push: tags: - 'v*.*.*' - - 'test-release' + branches: [ test-release ] jobs: release: From db938c129b847320dd1e8d0c79f0760efaccce1e Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 12:02:33 -0400 Subject: [PATCH 18/81] remove tag-name Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ce814aab..c813aa4f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,7 +32,6 @@ jobs: id: create_release uses: ncipollo/release-action@v1 with: - tag_name: ${{ env.RELEASE_VERSION }} artifacts: "./ltr-plugin-${{ env.RELEASE_VERSION }}.zip" release_name: Release ${{ env.RELEASE_VERSION }} token: ${{ secrets.GITHUB_TOKEN }} From 5dcf9674f14e5ad86b83d26a712e0b11141ad36d Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 12:06:37 -0400 Subject: [PATCH 19/81] clean up tags Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c813aa4f..986548e7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -33,7 +33,6 @@ jobs: uses: ncipollo/release-action@v1 with: artifacts: "./ltr-plugin-${{ env.RELEASE_VERSION }}.zip" - release_name: Release ${{ env.RELEASE_VERSION }} token: ${{ secrets.GITHUB_TOKEN }} - name: Upload Release Asset id: upload-release-asset From bf836e2fd872b7e3bf6cfcb9cee405d6a24570cd Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 12:12:56 -0400 Subject: [PATCH 20/81] tag Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 986548e7..b5d9af37 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,6 +34,7 @@ jobs: with: artifacts: "./ltr-plugin-${{ env.RELEASE_VERSION }}.zip" token: ${{ secrets.GITHUB_TOKEN }} + tag: 'test-release' - name: Upload Release Asset id: upload-release-asset uses: actions/upload-release-asset@v1 From baedeb5880c9062ef8ee18af3370cbaf6174816c Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 12:27:44 -0400 Subject: [PATCH 21/81] upload release asset fixes Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b5d9af37..3c349b27 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,14 +34,13 @@ jobs: with: artifacts: "./ltr-plugin-${{ env.RELEASE_VERSION }}.zip" token: ${{ secrets.GITHUB_TOKEN }} - tag: 'test-release' + tag: ${{ env.RELEASE_VERSION }} - name: Upload Release Asset id: upload-release-asset - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + uses: softprops/action-gh-release@v1 with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./ltr-plugin-${{ env.RELEASE_VERSION }}.zip - asset_name: ltr-plugin-${{ env.RELEASE_VERSION }}.zip - asset_content_type: application/zip + token: ${{ secrets.GITHUB_TOKEN }} + #upload_url: ${{ steps.create_release.outputs.upload_url }} + files: ./ltr-plugin-${{ env.RELEASE_VERSION }}.zip + name: ${{ env.RELEASE_VERSION }} + From c799acee68b78b2c471be7f47e8a76d5739f6bc5 Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 12:33:29 -0400 Subject: [PATCH 22/81] release tag name Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3c349b27..bb12cbab 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,7 +34,7 @@ jobs: with: artifacts: "./ltr-plugin-${{ env.RELEASE_VERSION }}.zip" token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ env.RELEASE_VERSION }} + tag: "release-${{ env.RELEASE_VERSION }}" - name: Upload Release Asset id: upload-release-asset uses: softprops/action-gh-release@v1 From b78765eff99ac8e56a0d581a94e5aad93334283d Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 12:36:41 -0400 Subject: [PATCH 23/81] tag name for upload Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bb12cbab..e1be428a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -40,6 +40,7 @@ jobs: uses: softprops/action-gh-release@v1 with: token: ${{ secrets.GITHUB_TOKEN }} + tag_name: "release-${{ env.RELEASE_VERSION }}" #upload_url: ${{ steps.create_release.outputs.upload_url }} files: ./ltr-plugin-${{ env.RELEASE_VERSION }}.zip name: ${{ env.RELEASE_VERSION }} From 34b5367a38fa9e796a2ea48e624fb0d7ed80cc38 Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 13:24:44 -0400 Subject: [PATCH 24/81] test release Signed-off-by: Mark Cohen --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c24ea193..bce95ca5 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,9 @@ To install, you'd run a command like this but replacing with the appropriate pre If you already are running OpenSearch, don't forget to restart! +# Releases + +Releases can be found at https://github.com/gsingers/opensearch-learning-to-rank-base/releases. # Building @@ -33,7 +36,10 @@ To build, you need to disable the Java security manager # Releasing/Packaging - + +Releases are done through Github Workflows (see `.github/workflows` in the root directory) on an as needed basis. If you do `./gradlew build` as per above under building, +it will build all the artifacts that are in the release. + ## About alpha releases From e8abfe11df3945e1e8649b700c9afbc9810e75d8 Mon Sep 17 00:00:00 2001 From: Grant Ingersoll Date: Thu, 15 Sep 2022 16:15:35 -0400 Subject: [PATCH 25/81] Docker (#5) * bring in dockerfile * bring in dockerfile * add in docker actions * remove docker branch for push action Signed-off-by: Mark Cohen --- .github/workflows/docker.yml | 32 +++++++++++++++++++ .github/workflows/release.yml | 2 +- README.md | 59 +++++++++++++++++++++++++++++------ docker/Dockerfile | 8 +++++ docker/local.Dockerfile | 13 ++++++++ 5 files changed, 103 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/docker.yml create mode 100644 docker/Dockerfile create mode 100644 docker/local.Dockerfile diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 00000000..4c30c9b4 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,32 @@ +name: Publish a Docker Image + +on: + release: + types: [published] + workflow_dispatch: + + +jobs: + release: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + + - name: Set up Docker Buildx + id: setup-docker-buildx + uses: docker/setup-buildx-action@v2 + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v3 + with: + file: docker/Dockerfile + # TODO: fix this so it isn't hardcoded + build-args: opensearch_version=2.2.1 ltrversion=2.0.0 + push: true + tags: gsingers/opensearch-learning-to-rank + github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e1be428a..e8905680 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -44,4 +44,4 @@ jobs: #upload_url: ${{ steps.create_release.outputs.upload_url }} files: ./ltr-plugin-${{ env.RELEASE_VERSION }}.zip name: ${{ env.RELEASE_VERSION }} - + diff --git a/README.md b/README.md index bce95ca5..2d324e58 100644 --- a/README.md +++ b/README.md @@ -27,20 +27,11 @@ If you already are running OpenSearch, don't forget to restart! Releases can be found at https://github.com/gsingers/opensearch-learning-to-rank-base/releases. - -# Building - -To build, you need to disable the Java security manager - - ./gradlew -Dtests.security.manager=false clean build - -# Releasing/Packaging +## Releasing/Packaging Releases are done through Github Workflows (see `.github/workflows` in the root directory) on an as needed basis. If you do `./gradlew build` as per above under building, it will build all the artifacts that are in the release. - - ## About alpha releases @@ -66,3 +57,51 @@ Tests with failures: 228 tests completed, 14 failed ``` + + +# Building + +To build, you need to disable the Java security manager + +./gradlew -Dtests.security.manager=false clean build + + +# OpenSearch with Learning to Rank Docker Image + +A custom image of [OpenSearch](https://hub.docker.com/r/opensearchproject/opensearch) with the [OpenSearch Learning to Rank plugin](https://github.com/gsingers/opensearch-learning-to-rank-base) installed. + +This image was created for the [Search with Machine Learning](https://corise.com/course/search-with-machine-learning?utm_source=daniel) course and [Search Fundamentals](https://corise.com/course/search-fundamentals?utm_source=daniel) taught by Grant Ingersoll and Daniel Tunkelang. + +See the [Elasticsearch Learning to Rank](https://elasticsearch-learning-to-rank.readthedocs.io/en/latest/index.html) documentation for details on how to us. + +## Building + +Building the docker image is triggered via the Github Actions workflows automatically (for releases) or via the commands below. + +Note, we are use Docker ARGs to pass through variables via the --build-arg. All args have defaults + +### Using local artifacts + + docker build -f docker/local.Dockerfile + +### Using official releases, built locally + +#### Using defaults + + docker build -f docker/Dockerfile --tag=YOUR/IMAGE_NAME + +#### From Versions + + docker build -f docker/Dockerfile --tag=YOUR/IMAGE_NAME --build-arg opensearch_version=2.2.1 --build-arg ltrversion=2.0.0 . + + +#### From a URL + + docker build -f docker/Dockerfile --tag=YOUR/IMAGE_NAME --build-arg plugin="https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-test-release/ltr-plugin-test-release.zip" . + + +## Running the docker image + +See the OpenSearch docs for official instructions, but this should work: + + docker run -p 9200:9200 -p 9600:9600 -e "discovery.type=single-node" YOUR/IMAGE_NAME:latest \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 00000000..4b21f9e2 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,8 @@ +ARG opensearch_version=2.2.1 +ARG ltrversion=2.0.0 +ARG plugin=https://github.com/gsingers/opensearch-learning-to-rank/releases/download/${opensearch_version}/ltr-${ltrversion}-os${opensearch_version}.zip + +FROM opensearchproject/opensearch:${opensearch_version} +RUN /usr/share/opensearch/bin/opensearch-plugin install -b ${plugin} + + diff --git a/docker/local.Dockerfile b/docker/local.Dockerfile new file mode 100644 index 00000000..18744553 --- /dev/null +++ b/docker/local.Dockerfile @@ -0,0 +1,13 @@ +# Build an image from a local distribution + +ARG opensearch_version=2.2.1 +FROM opensearchproject/opensearch:${opensearch_version} +ARG ltrversion=2.0.0 +ARG opensearch_version=2.2.1 +ARG zip_file=ltr-${ltrversion}-os${opensearch_version}.zip +ARG plugin_file=/usr/share/opensearch/${zip_file} + +COPY --chown=opensearch:opensearch build/distributions/${zip_file} ${plugin_file} +RUN /usr/share/opensearch/bin/opensearch-plugin install -b file:${plugin_file} +# check in to see if there is a better way to do this so we don't have duplicate RUN commands + From 6ee8fd0cb3d8812852f36506e71ee00441846634 Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 16:32:12 -0400 Subject: [PATCH 26/81] fix build-args Signed-off-by: Mark Cohen --- .github/workflows/docker.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 4c30c9b4..0a24b7c3 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -4,6 +4,15 @@ on: release: types: [published] workflow_dispatch: + inputs: + opensearch-version: + description: 'OpenSearch Version to use' + required: true + default: 2.2.1 + ltrversion: + description: 'LTR Plugin Version' + required: true + default: 2.0.0 jobs: @@ -26,7 +35,9 @@ jobs: with: file: docker/Dockerfile # TODO: fix this so it isn't hardcoded - build-args: opensearch_version=2.2.1 ltrversion=2.0.0 + build-args: | + opensearch_version=${{inputs.opensearch-version}} + ltrversion=${{ltrversion}} push: true tags: gsingers/opensearch-learning-to-rank github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 7466f4684922423c7a56db7ddb5ce594ba5a28cd Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 16:34:36 -0400 Subject: [PATCH 27/81] fix build-args, but this time try harder Signed-off-by: Mark Cohen --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 0a24b7c3..cb02b081 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -37,7 +37,7 @@ jobs: # TODO: fix this so it isn't hardcoded build-args: | opensearch_version=${{inputs.opensearch-version}} - ltrversion=${{ltrversion}} + ltrversion=${{inputs.ltrversion}} push: true tags: gsingers/opensearch-learning-to-rank github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 9cfdef63864797dd4b06bc27a032abb98117121f Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 16:38:49 -0400 Subject: [PATCH 28/81] docker tweaks Signed-off-by: Mark Cohen --- .github/workflows/docker.yml | 2 +- docker/Dockerfile | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index cb02b081..50a4427e 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -16,7 +16,7 @@ on: jobs: - release: + build_push_image: runs-on: ubuntu-latest permissions: contents: write diff --git a/docker/Dockerfile b/docker/Dockerfile index 4b21f9e2..adab879f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,8 +1,7 @@ ARG opensearch_version=2.2.1 ARG ltrversion=2.0.0 -ARG plugin=https://github.com/gsingers/opensearch-learning-to-rank/releases/download/${opensearch_version}/ltr-${ltrversion}-os${opensearch_version}.zip FROM opensearchproject/opensearch:${opensearch_version} -RUN /usr/share/opensearch/bin/opensearch-plugin install -b ${plugin} +RUN /usr/share/opensearch/bin/opensearch-plugin install -b https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/${opensearch_version}/ltr-${ltrversion}-os${opensearch_version}.zip From cee48fedfe496b591b6dc801667f82a23c8125ae Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 16:39:40 -0400 Subject: [PATCH 29/81] rc Signed-off-by: Mark Cohen --- .github/workflows/docker.yml | 2 +- docker/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 50a4427e..6213877f 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -12,7 +12,7 @@ on: ltrversion: description: 'LTR Plugin Version' required: true - default: 2.0.0 + default: 2.0.0rc1 jobs: diff --git a/docker/Dockerfile b/docker/Dockerfile index adab879f..e05374c2 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ ARG opensearch_version=2.2.1 -ARG ltrversion=2.0.0 +ARG ltrversion=2.0.0rc1 FROM opensearchproject/opensearch:${opensearch_version} RUN /usr/share/opensearch/bin/opensearch-plugin install -b https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/${opensearch_version}/ltr-${ltrversion}-os${opensearch_version}.zip From a03a54031fa4f9069b33e3d6bd1a1fe307377246 Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 16:45:52 -0400 Subject: [PATCH 30/81] ARGGGGGGGG Signed-off-by: Mark Cohen --- docker/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index e05374c2..3a7921f0 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,7 +1,8 @@ ARG opensearch_version=2.2.1 -ARG ltrversion=2.0.0rc1 FROM opensearchproject/opensearch:${opensearch_version} +ARG opensearch_version=2.2.1 +ARG ltrversion=2.0.0rc1 RUN /usr/share/opensearch/bin/opensearch-plugin install -b https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/${opensearch_version}/ltr-${ltrversion}-os${opensearch_version}.zip From 2a1866875c9f935b6c54865350b0b9ff72697cf8 Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 16:54:38 -0400 Subject: [PATCH 31/81] would help if we got the version/path right Signed-off-by: Mark Cohen --- docker/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 3a7921f0..82652a5f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -3,6 +3,7 @@ ARG opensearch_version=2.2.1 FROM opensearchproject/opensearch:${opensearch_version} ARG opensearch_version=2.2.1 ARG ltrversion=2.0.0rc1 -RUN /usr/share/opensearch/bin/opensearch-plugin install -b https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/${opensearch_version}/ltr-${ltrversion}-os${opensearch_version}.zip +RUN /usr/share/opensearch/bin/opensearch-plugin install -b https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v${ltrversion}/ltr-plugin-v${ltrversion}.zip +#https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.0.0rc1/ltr-plugin-v2.0.0rc1.zip \ No newline at end of file From 3ae786b2da664f7e23220333e4894209fdfaba5c Mon Sep 17 00:00:00 2001 From: gsingers Date: Mon, 30 Jan 2023 20:28:48 -0500 Subject: [PATCH 32/81] upgrades for 2.5.0: new versions of things, add some docs, upgrade gradlew Signed-off-by: Mark Cohen --- README.md | 45 ++-- docker/Dockerfile | 6 +- docker/local.Dockerfile | 6 +- gradle.properties | 10 +- gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 263 +++++++++++++-------- gradlew.bat | 14 +- licenses/antlr4-runtime-4.5.1-1.jar.sha1 | 1 - licenses/antlr4-runtime-4.9.3.jar.sha1 | 1 + licenses/asm-8.0.1.jar.sha1 | 1 - licenses/asm-9.4.jar.sha1 | 1 + licenses/asm-commons-8.0.1.jar.sha1 | 1 - licenses/asm-commons-9.4.jar.sha1 | 1 + licenses/asm-tree-8.0.1.jar.sha1 | 1 - licenses/asm-tree-9.4.jar.sha1 | 1 + licenses/lucene-expressions-9.3.0.jar.sha1 | 1 - licenses/lucene-expressions-9.4.2.jar.sha1 | 1 + 18 files changed, 214 insertions(+), 142 deletions(-) delete mode 100644 licenses/antlr4-runtime-4.5.1-1.jar.sha1 create mode 100644 licenses/antlr4-runtime-4.9.3.jar.sha1 delete mode 100644 licenses/asm-8.0.1.jar.sha1 create mode 100644 licenses/asm-9.4.jar.sha1 delete mode 100644 licenses/asm-commons-8.0.1.jar.sha1 create mode 100644 licenses/asm-commons-9.4.jar.sha1 delete mode 100644 licenses/asm-tree-8.0.1.jar.sha1 create mode 100644 licenses/asm-tree-9.4.jar.sha1 delete mode 100644 licenses/lucene-expressions-9.3.0.jar.sha1 create mode 100644 licenses/lucene-expressions-9.4.2.jar.sha1 diff --git a/README.md b/README.md index 2d324e58..dade44a9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Important Notice -This is a fork of https://github.com/o19s/elasticsearch-learning-to-rank to work with OpenSearch. It's a rewrite of some parts to be able to work with OpenSearch 1.x. Please refer to official documentation of [Elasticsearch Learning to Rank](http://elasticsearch-learning-to-rank.readthedocs.io) for usage. +This is a fork of https://github.com/o19s/elasticsearch-learning-to-rank to work with OpenSearch. It's a rewrite of some parts to be able to work with OpenSearch. Please refer to official documentation of [Elasticsearch Learning to Rank](http://elasticsearch-learning-to-rank.readthedocs.io) for usage. The OpenSearch Learning to Rank plugin uses machine learning to improve search relevance ranking. The original Elasticsearch LTR plugin powers search at places like Wikimedia Foundation and Snagajob. @@ -9,14 +9,15 @@ The OpenSearch Learning to Rank plugin uses machine learning to improve search r To install, you'd run a command like this but replacing with the appropriate prebuilt version zip: -| OS | Command | -|-------|------------------------------------------------------------------------------------------------------------------------------------| -| 1.0.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.0.0/ltr-1.5.4-os1.0.0.zip` | -| 1.1.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.1.0/ltr-1.5.4-os1.1.0.zip` | -| 1.2.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.0/ltr-1.5.4-os1.2.0.zip` | -| 1.2.2 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.2/ltr-1.5.4-os1.2.2.zip` | -| 1.2.3 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.3/ltr-1.5.4-os1.2.3.zip` | -| 2.2.1 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/2.2.1/ltr-2.0.0-os2.2.1.zip` | +| OS | Command | +|-------|---------------------------------------------------------------------------------------------------------------------------------------| +| 1.0.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.0.0/ltr-1.5.4-os1.0.0.zip` | +| 1.1.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.1.0/ltr-1.5.4-os1.1.0.zip` | +| 1.2.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.0/ltr-1.5.4-os1.2.0.zip` | +| 1.2.2 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.2/ltr-1.5.4-os1.2.2.zip` | +| 1.2.3 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.3/ltr-1.5.4-os1.2.3.zip` | +| 2.2.1 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/2.2.1/ltr-2.0.0-os2.2.1.zip` | +| 2.5.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank/releases/download/2.5.0/ltr-2.1.0-os2.5.0.zip` | (It's expected you'll confirm some security exceptions, you can pass `-b` to `opensearch-plugin` to automatically install) @@ -59,14 +60,25 @@ Tests with failures: ``` -# Building +# Development To build, you need to disable the Java security manager -./gradlew -Dtests.security.manager=false clean build +./gradlew -Dtests.security.manager=false clean build +# Upgrading the OpenSearch Versions -# OpenSearch with Learning to Rank Docker Image +1. Edit `gradle.properties` to have the appropriate versions (it's often easiest to go download the latest tarball from OpenSearch and simply check the versions that ship) and to increment the version of this plugin +2. Build and test as above +3. Update this README with the version info in the table above +4. Upgrade the Docker file versions in the `docker` directory +4. Test the docker image, per below. + +## Development Notes + + + +# Docker A custom image of [OpenSearch](https://hub.docker.com/r/opensearchproject/opensearch) with the [OpenSearch Learning to Rank plugin](https://github.com/gsingers/opensearch-learning-to-rank-base) installed. @@ -82,13 +94,13 @@ Note, we are use Docker ARGs to pass through variables via the --build-arg. All ### Using local artifacts - docker build -f docker/local.Dockerfile + docker build -f docker/local.Dockerfile . ### Using official releases, built locally #### Using defaults - docker build -f docker/Dockerfile --tag=YOUR/IMAGE_NAME + docker build -f docker/Dockerfile --tag=YOUR/IMAGE_NAME . #### From Versions @@ -104,4 +116,7 @@ Note, we are use Docker ARGs to pass through variables via the --build-arg. All See the OpenSearch docs for official instructions, but this should work: - docker run -p 9200:9200 -p 9600:9600 -e "discovery.type=single-node" YOUR/IMAGE_NAME:latest \ No newline at end of file + docker run -p 9200:9200 -p 9600:9600 -e "discovery.type=single-node" YOUR/IMAGE_NAME:latest + + + diff --git a/docker/Dockerfile b/docker/Dockerfile index 82652a5f..44904dec 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,8 +1,8 @@ -ARG opensearch_version=2.2.1 +ARG opensearch_version=2.5.0 FROM opensearchproject/opensearch:${opensearch_version} -ARG opensearch_version=2.2.1 -ARG ltrversion=2.0.0rc1 +ARG opensearch_version=2.5.0 +ARG ltrversion=2.1.0 RUN /usr/share/opensearch/bin/opensearch-plugin install -b https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v${ltrversion}/ltr-plugin-v${ltrversion}.zip diff --git a/docker/local.Dockerfile b/docker/local.Dockerfile index 18744553..0e0c5e21 100644 --- a/docker/local.Dockerfile +++ b/docker/local.Dockerfile @@ -1,9 +1,9 @@ # Build an image from a local distribution -ARG opensearch_version=2.2.1 +ARG opensearch_version=2.5.0 FROM opensearchproject/opensearch:${opensearch_version} -ARG ltrversion=2.0.0 -ARG opensearch_version=2.2.1 +ARG ltrversion=2.1.0 +ARG opensearch_version=2.5.0 ARG zip_file=ltr-${ltrversion}-os${opensearch_version}.zip ARG plugin_file=/usr/share/opensearch/${zip_file} diff --git a/gradle.properties b/gradle.properties index 5f42f6a5..694a5403 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ -ltrVersion = 2.0.0 -opensearchVersion = 2.2.1 -luceneVersion = 9.3.0 -ow2Version = 8.0.1 -antlrVersion=4.5.1-1 +ltrVersion = 2.1.0 +opensearchVersion = 2.5.0 +luceneVersion = 9.4.2 +ow2Version = 9.4 +antlrVersion=4.9.3 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..249e5832f090a2944b7473328c07c9755baa3196 100644 GIT binary patch delta 21931 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 delta 20228 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,101 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index ac1b06f9..53a6b238 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +75,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/licenses/antlr4-runtime-4.5.1-1.jar.sha1 b/licenses/antlr4-runtime-4.5.1-1.jar.sha1 deleted file mode 100644 index f15e5006..00000000 --- a/licenses/antlr4-runtime-4.5.1-1.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -66144204f9d6d7d3f3f775622c2dd7e9bd511d97 diff --git a/licenses/antlr4-runtime-4.9.3.jar.sha1 b/licenses/antlr4-runtime-4.9.3.jar.sha1 new file mode 100644 index 00000000..13a23674 --- /dev/null +++ b/licenses/antlr4-runtime-4.9.3.jar.sha1 @@ -0,0 +1 @@ +81befc16ebedb8b8aea3e4c0835dd5ca7e8523a8 \ No newline at end of file diff --git a/licenses/asm-8.0.1.jar.sha1 b/licenses/asm-8.0.1.jar.sha1 deleted file mode 100644 index b464db16..00000000 --- a/licenses/asm-8.0.1.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -3f5199523fb95304b44563f5d56d9f5a07270669 \ No newline at end of file diff --git a/licenses/asm-9.4.jar.sha1 b/licenses/asm-9.4.jar.sha1 new file mode 100644 index 00000000..75f2b0fe --- /dev/null +++ b/licenses/asm-9.4.jar.sha1 @@ -0,0 +1 @@ +b4e0e2d2e023aa317b7cfcfc916377ea348e07d1 \ No newline at end of file diff --git a/licenses/asm-commons-8.0.1.jar.sha1 b/licenses/asm-commons-8.0.1.jar.sha1 deleted file mode 100644 index d4bca8a0..00000000 --- a/licenses/asm-commons-8.0.1.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -019c7ba355f0737815205518e332a8dc08b417c6 \ No newline at end of file diff --git a/licenses/asm-commons-9.4.jar.sha1 b/licenses/asm-commons-9.4.jar.sha1 new file mode 100644 index 00000000..e0e2a2f4 --- /dev/null +++ b/licenses/asm-commons-9.4.jar.sha1 @@ -0,0 +1 @@ +8fc2810ddbcbbec0a8bbccb3f8eda58321839912 \ No newline at end of file diff --git a/licenses/asm-tree-8.0.1.jar.sha1 b/licenses/asm-tree-8.0.1.jar.sha1 deleted file mode 100644 index da382904..00000000 --- a/licenses/asm-tree-8.0.1.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -dfcad5abbcff36f8bdad5647fe6f4972e958ad59 \ No newline at end of file diff --git a/licenses/asm-tree-9.4.jar.sha1 b/licenses/asm-tree-9.4.jar.sha1 new file mode 100644 index 00000000..50ce6d74 --- /dev/null +++ b/licenses/asm-tree-9.4.jar.sha1 @@ -0,0 +1 @@ +a99175a17d7fdc18cbcbd0e8ea6a5d276844190a \ No newline at end of file diff --git a/licenses/lucene-expressions-9.3.0.jar.sha1 b/licenses/lucene-expressions-9.3.0.jar.sha1 deleted file mode 100644 index 2d216277..00000000 --- a/licenses/lucene-expressions-9.3.0.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -5583bcd3a24d3aae40b0a3152458021844ac09aa \ No newline at end of file diff --git a/licenses/lucene-expressions-9.4.2.jar.sha1 b/licenses/lucene-expressions-9.4.2.jar.sha1 new file mode 100644 index 00000000..61cd306d --- /dev/null +++ b/licenses/lucene-expressions-9.4.2.jar.sha1 @@ -0,0 +1 @@ +f433ede87302221b48703a890e5f5701cf1b021d \ No newline at end of file From e6fc0464e79ccd02deec77c1c1c0dc429f4aae9c Mon Sep 17 00:00:00 2001 From: gsingers Date: Mon, 30 Jan 2023 21:05:49 -0500 Subject: [PATCH 33/81] update versions, add some more readme Signed-off-by: Mark Cohen --- .github/workflows/docker.yml | 4 ++-- README.md | 25 ++++++++++++++++--------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 6213877f..600ac988 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -8,11 +8,11 @@ on: opensearch-version: description: 'OpenSearch Version to use' required: true - default: 2.2.1 + default: 2.5.0 ltrversion: description: 'LTR Plugin Version' required: true - default: 2.0.0rc1 + default: 2.1.0 jobs: diff --git a/README.md b/README.md index dade44a9..a15db81a 100644 --- a/README.md +++ b/README.md @@ -9,15 +9,15 @@ The OpenSearch Learning to Rank plugin uses machine learning to improve search r To install, you'd run a command like this but replacing with the appropriate prebuilt version zip: -| OS | Command | -|-------|---------------------------------------------------------------------------------------------------------------------------------------| -| 1.0.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.0.0/ltr-1.5.4-os1.0.0.zip` | -| 1.1.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.1.0/ltr-1.5.4-os1.1.0.zip` | -| 1.2.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.0/ltr-1.5.4-os1.2.0.zip` | -| 1.2.2 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.2/ltr-1.5.4-os1.2.2.zip` | -| 1.2.3 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.3/ltr-1.5.4-os1.2.3.zip` | -| 2.2.1 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/2.2.1/ltr-2.0.0-os2.2.1.zip` | -| 2.5.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank/releases/download/2.5.0/ltr-2.1.0-os2.5.0.zip` | +| OS | Command | +|-------|--------------------------------------------------------------------------------------------------------------------------------------------| +| 1.0.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.0.0/ltr-1.5.4-os1.0.0.zip` | +| 1.1.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.1.0/ltr-1.5.4-os1.1.0.zip` | +| 1.2.0 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.0/ltr-1.5.4-os1.2.0.zip` | +| 1.2.2 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.2/ltr-1.5.4-os1.2.2.zip` | +| 1.2.3 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.3/ltr-1.5.4-os1.2.3.zip` | +| 2.2.1 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/2.2.1/ltr-2.0.0-os2.2.1.zip` | +| 2.5.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.1.0/ltr-plugin-v2.1.0.zip` | (It's expected you'll confirm some security exceptions, you can pass `-b` to `opensearch-plugin` to automatically install) @@ -117,6 +117,13 @@ Note, we are use Docker ARGs to pass through variables via the --build-arg. All See the OpenSearch docs for official instructions, but this should work: docker run -p 9200:9200 -p 9600:9600 -e "discovery.type=single-node" YOUR/IMAGE_NAME:latest + + +## Publishing the Docker Image + +To publish the Docker image to Docker Hub, you need to kick off the Docker action workflow: + + gh workflow run .github/workflows/docker.yml From d72ee5fd6aab2b4c95c2129f8c2b78687afa1f17 Mon Sep 17 00:00:00 2001 From: gsingers Date: Mon, 30 Jan 2023 21:25:41 -0500 Subject: [PATCH 34/81] push version Signed-off-by: Mark Cohen --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 600ac988..88082f53 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -39,5 +39,5 @@ jobs: opensearch_version=${{inputs.opensearch-version}} ltrversion=${{inputs.ltrversion}} push: true - tags: gsingers/opensearch-learning-to-rank + tags: gsingers/opensearch-learning-to-rank:${{inputs.ltrversion}} github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 753ab7d9b7d547e1460ba0e82f2a6e16cb78f2d7 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Wed, 14 Jun 2023 10:19:10 -0400 Subject: [PATCH 35/81] adding standard OpenSearch issue templates and ADMIN/MAINTAINERS/CODEOWNERS list Signed-off-by: Mark Cohen --- .github/CODEOWNERS | 1 + .github/ISSUE_TEMPLATE/BUG_TEMPLATE.md | 24 +++++++++++ .../FEATURE_REQUEST_TEMPLATE.md | 18 +++++++++ .github/ISSUE_TEMPLATE/PROPOSAL_TEMPLATE.md | 40 +++++++++++++++++++ .github/config.yml | 7 ++++ ADMIN.md | 39 ++++++++++++++++++ MAINTAINERS.md | 18 +++++++++ 7 files changed, 147 insertions(+) create mode 100644 .github/CODEOWNERS create mode 100644 .github/ISSUE_TEMPLATE/BUG_TEMPLATE.md create mode 100644 .github/ISSUE_TEMPLATE/FEATURE_REQUEST_TEMPLATE.md create mode 100644 .github/ISSUE_TEMPLATE/PROPOSAL_TEMPLATE.md create mode 100644 .github/config.yml create mode 100644 ADMIN.md create mode 100644 MAINTAINERS.md diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..1e435d27 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @gsingers @macohen \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/BUG_TEMPLATE.md b/.github/ISSUE_TEMPLATE/BUG_TEMPLATE.md new file mode 100644 index 00000000..1d2ea2d2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/BUG_TEMPLATE.md @@ -0,0 +1,24 @@ +--- +name: 🐛 Bug report +about: Create a report to help us improve +title: '[BUG]' +labels: 'bug, untriaged' +assignees: '' +--- +### What is the bug? +_A clear and concise description of the bug._ + +### How can one reproduce the bug? +_Steps to reproduce the behavior._ + +### What is the expected behavior? +_A clear and concise description of what you expected to happen._ + +### What is your host/environment? +_Operating system, version._ + +### Do you have any screenshots? +_If applicable, add screenshots to help explain your problem._ + +### Do you have any additional context? +_Add any other context about the problem._ diff --git a/.github/ISSUE_TEMPLATE/FEATURE_REQUEST_TEMPLATE.md b/.github/ISSUE_TEMPLATE/FEATURE_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..55b3ddf3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/FEATURE_REQUEST_TEMPLATE.md @@ -0,0 +1,18 @@ +--- +name: 🎆 Feature request +about: Request a feature in this project +title: '[FEATURE]' +labels: 'enhancement, untriaged' +assignees: '' +--- +### Is your feature request related to a problem? +_A clear and concise description of what the problem is, e.g. I'm always frustrated when [...]._ + +### What solution would you like? +_A clear and concise description of what you want to happen._ + +### What alternatives have you considered? +_A clear and concise description of any alternative solutions or features you've considered._ + +### Do you have any additional context? +_Add any other context or screenshots about the feature request here._ diff --git a/.github/ISSUE_TEMPLATE/PROPOSAL_TEMPLATE.md b/.github/ISSUE_TEMPLATE/PROPOSAL_TEMPLATE.md new file mode 100644 index 00000000..9276d050 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/PROPOSAL_TEMPLATE.md @@ -0,0 +1,40 @@ +--- +name: 💭 Proposal +about: Suggest an idea for a specific feature you wish to propose to the community for comment +title: '[PROPOSAL]' +labels: proposal +assignees: '' +--- +## What/Why +### What are you proposing? +_In a few sentences, describe the feature and its core capabilities._ + +### What users have asked for this feature? +_Highlight any research, proposals, requests or anecdotes that signal this is the right thing to build. Include links to GitHub Issues, Forums, Stack Overflow, Twitter, Etc_ + +### What problems are you trying to solve? +_Summarize the core use cases and user problems and needs you are trying to solve. Describe the most important user needs, pain points and jobs as expressed by the user asks above. Template: When \ , a \ wants to \, so they can \. (Example: When **searching by postal code**, **a buyer** wants to **be required to enter a valid code** so they **don’t waste time searching for a clearly invalid postal code.**)_ + +### What is the developer experience going to be? +_Does this have a REST API? If so, please describe the API and any impact it may have to existing APIs. In a brief summary (not a spec), highlight what new REST APIs or changes to REST APIs are planned. as well as any other API, CLI or Configuration changes that are planned as part of this feature._ + +#### Are there any security considerations? +_Describe if the feature has any security considerations or impact. What is the security model of the new APIs? Features should be integrated into the OpenSearch security suite and so if they are not, we should highlight the reasons here._ + +#### Are there any breaking changes to the API +_If this feature will require breaking changes to any APIs, ouline what those are and why they are needed. What is the path to minimizing impact? (example, add new API and deprecate the old one)_ + +### What is the user experience going to be? +_Describe the feature requirements and or user stories. You may include low-fidelity sketches, wireframes, APIs stubs, or other examples of how a user would use the feature via CLI, OpenSearch Dashboards, REST API, etc. Using a bulleted list or simple diagrams to outline features is okay. If this is net new functionality, call this out as well._ + +#### Are there breaking changes to the User Experience? +_Will this change the existing user experience? Will this be a breaking change from a user flow or user experience perspective?_ + +### Why should it be built? Any reason not to? +_Describe the value that this feature will bring to the OpenSearch community, as well as what impact it has if it isn't built, or new risks if it is. Highlight opportunities for additional research._ + +### What will it take to execute? +_Describe what it will take to build this feature. Are there any assumptions you may be making that could limit scope or add limitations? Are there performance, cost, or technical constraints that may impact the user experience? Does this feature depend on other feature work? What additional risks are there?_ + +### Any remaining open questions? +_What are known enhancements to this feature? Any enhancements that may be out of scope but that we will want to track long term? List any other open questions that may need to be answered before proceeding with an implementation._ diff --git a/.github/config.yml b/.github/config.yml new file mode 100644 index 00000000..52a7630c --- /dev/null +++ b/.github/config.yml @@ -0,0 +1,7 @@ +contact_links: + - name: OpenSearch Community Support + url: https://forum.opensearch.org + about: Please ask and answer questions here. + - name: AWS/Amazon Security + url: https://aws.amazon.com/security/vulnerability-reporting/ + about: Please report security vulnerabilities here. \ No newline at end of file diff --git a/ADMIN.md b/ADMIN.md new file mode 100644 index 00000000..92290667 --- /dev/null +++ b/ADMIN.md @@ -0,0 +1,39 @@ +- [Overview](#overview) +- [Current Admins](#current-admins) +- [Admin Responsibilities](#admin-responsibilities) + - [Prioritize Security](#prioritize-security) + - [Enforce Code of Conduct](#enforce-code-of-conduct) + - [Add/Remove Maintainers](#addremove-maintainers) + - [Adopt Organizational Best Practices](#adopt-organizational-best-practices) + +## Overview + +This document explains who the admins are (see below), what they do in this repo, and how they should be doing it. If you're interested in becoming a maintainer, see [MAINTAINERS](MAINTAINERS.md). If you're interested in contributing, see [CONTRIBUTING](CONTRIBUTING.md). + +## Current Admins + +| Admin | GitHub ID | Affiliation | +| ------------------ | --------------------------------------- | ----------- | +| Grant Ingersoll | [gsingers](https://github.com/gsingers) | Develomentor + +## Admin Responsibilities + +As an admin you own stewardship of the repository and its settings. Admins have [admin-level permissions on a repository](https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-permission-levels-for-an-organization). Use those privileges to serve the community and protect the repository as follows. + +### Prioritize Security + +Security is your number one priority. Manage security keys and safeguard access to the repository. + +Note that this repository is monitored and supported 24/7 by Amazon Security, see [Reporting a Vulnerability](SECURITY.md) for details. + +### Enforce Code of Conduct + +Act on [CODE_OF_CONDUCT](CODE_OF_CONDUCT.md) violations by revoking access, and blocking malicious actors. + +### Add/Remove Maintainers + +Perform administrative tasks, such as [adding](MAINTAINERS.md#adding-a-new-maintainer) and [removing maintainers](MAINTAINERS.md#removing-a-maintainer). + +### Adopt Organizational Best Practices + +Adopt organizational best practices, work in the open, and collaborate with other admins by opening issues before making process changes. Prefer consistency, and avoid diverging from practices in the opensearch-project organization. diff --git a/MAINTAINERS.md b/MAINTAINERS.md new file mode 100644 index 00000000..1eaef582 --- /dev/null +++ b/MAINTAINERS.md @@ -0,0 +1,18 @@ +- [Overview](#overview) +- [Current Maintainers](#current-maintainers) +- [Emeritus](#emeritus) + +## Overview + +This document contains a list of maintainers in this repo. See [opensearch-project/.github/RESPONSIBILITIES.md](https://github.com/opensearch-project/.github/blob/main/RESPONSIBILITIES.md#maintainer-responsibilities) that explains what the role of maintainer means, what maintainers do in this and other repos, and how they should be doing it. If you're interested in contributing, and becoming a maintainer, see [CONTRIBUTING](CONTRIBUTING.md). + +## Current Maintainers + +| Maintainer | GitHub ID | Affiliation | +| ------------------ | --------------------------------------------------------- | ----------- | +| Mark Cohen | [macohen](https://github.com/macohen) | Amazon | + +## Emeritus + +| Maintainer | GitHub ID | Affiliation | +| ------------------ | --------------------------------------------------------- | ----------- | From 753b8581e9d30207c014bd431a1c540c9068fdc8 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Wed, 14 Jun 2023 10:28:30 -0400 Subject: [PATCH 36/81] replacing .github repo references with refs to this repo Signed-off-by: Mark Cohen --- MAINTAINERS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 1eaef582..72d48c3a 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -4,7 +4,7 @@ ## Overview -This document contains a list of maintainers in this repo. See [opensearch-project/.github/RESPONSIBILITIES.md](https://github.com/opensearch-project/.github/blob/main/RESPONSIBILITIES.md#maintainer-responsibilities) that explains what the role of maintainer means, what maintainers do in this and other repos, and how they should be doing it. If you're interested in contributing, and becoming a maintainer, see [CONTRIBUTING](CONTRIBUTING.md). +This document contains a list of maintainers in this repo. See [opensearch-project/opensearch-learning-to-rank-base/RESPONSIBILITIES.md](https://github.com/opensearch-project/opensearch-learning-to-rank-base/blob/main/RESPONSIBILITIES.md#maintainer-responsibilities) that explains what the role of maintainer means, what maintainers do in this and other repos, and how they should be doing it. If you're interested in contributing, and becoming a maintainer, see [CONTRIBUTING](CONTRIBUTING.md). ## Current Maintainers From 9fea2ec9b74d38cff6567ea198e3e91b15728055 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Thu, 15 Jun 2023 11:21:07 -0400 Subject: [PATCH 37/81] adding standard opensearch code of conduct Signed-off-by: Mark Cohen --- CODE_OF_CONDUCT.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..8c09f91d --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,24 @@ + +This code of conduct applies to all spaces provided by the OpenSource project including in code, documentation, issue trackers, mailing lists, chat channels, wikis, blogs, social media and any other communication channels used by the project. + +**Our open source communities endeavor to:** + +* Be Inclusive: We are committed to being a community where everyone can join and contribute. This means using inclusive and welcoming language. +* Be Welcoming: We are committed to maintaining a safe space for everyone to be able to contribute. +* Be Respectful: We are committed to encouraging differing viewpoints, accepting constructive criticism and work collaboratively towards decisions that help the project grow. Disrespectful and unacceptable behavior will not be tolerated. +* Be Collaborative: We are committed to supporting what is best for our community and users. When we build anything for the benefit of the project, we should document the work we do and communicate to others on how this affects their work. + +**Our Responsibility. As contributors, members, or bystanders we each individually have the responsibility to behave professionally and respectfully at all times. Disrespectful and unacceptable behaviors include, but are not limited to:** + +* The use of violent threats, abusive, discriminatory, or derogatory language; +* Offensive comments related to gender, gender identity and expression, sexual orientation, disability, mental illness, race, political or religious affiliation; +* Posting of sexually explicit or violent content; +* The use of sexualized language and unwelcome sexual attention or advances; +* Public or private harassment of any kind; +* Publishing private information, such as physical or electronic address, without permission; +* Other conduct which could reasonably be considered inappropriate in a professional setting; +* Advocating for or encouraging any of the above behaviors. + +**Enforcement and Reporting Code of Conduct Issues:** + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported. [Contact us](mailto:opensource-codeofconduct@amazon.com). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. From 2c0bf1cf268f36ef1304a3f461d89b0b1d09dab7 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Thu, 29 Jun 2023 12:55:39 -0400 Subject: [PATCH 38/81] adding Grant Ingersoll as a maintainer Signed-off-by: Mark Cohen --- MAINTAINERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 72d48c3a..b1638394 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -11,6 +11,7 @@ This document contains a list of maintainers in this repo. See [opensearch-proje | Maintainer | GitHub ID | Affiliation | | ------------------ | --------------------------------------------------------- | ----------- | | Mark Cohen | [macohen](https://github.com/macohen) | Amazon | +| Grant Ingersoll | [gsingers](https://github.com/gsingers) | Develomentor| ## Emeritus From ac38ec7f2d4f3f73c247dfce5b50fed940cacdb7 Mon Sep 17 00:00:00 2001 From: "mend-for-github-com[bot]" <50673670+mend-for-github-com[bot]@users.noreply.github.com> Date: Tue, 13 Jun 2023 17:06:58 +0000 Subject: [PATCH 39/81] Add .whitesource configuration file Signed-off-by: Mark Cohen --- .whitesource | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .whitesource diff --git a/.whitesource b/.whitesource new file mode 100644 index 00000000..d465069a --- /dev/null +++ b/.whitesource @@ -0,0 +1,33 @@ +{ + "scanSettings": { + "configMode": "AUTO", + "configExternalURL": "", + "projectToken": "", + "baseBranches": [] + }, + "scanSettingsSAST": { + "enableScan": false, + "scanPullRequests": false, + "incrementalScan": true, + "baseBranches": [], + "snippetSize": 10 + }, + "checkRunSettings": { + "vulnerableCheckRunConclusionLevel": "failure", + "displayMode": "diff", + "useMendCheckNames": true + }, + "checkRunSettingsSAST": { + "checkRunConclusionLevel": "failure", + "severityThreshold": "high" + }, + "issueSettings": { + "minSeverityLevel": "LOW", + "issueType": "DEPENDENCY" + }, + "remediateSettings": { + "workflowRules": { + "enabled": true + } + } +} \ No newline at end of file From 0c048306d8a2c81aa219a36d99c548ea5041eee0 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Mon, 10 Jul 2023 11:29:02 -0400 Subject: [PATCH 40/81] starting to build against OpenSearch 2.7.0 with several updates in core and a TODO regarding the Strings class Signed-off-by: Mark Cohen --- NOTICE | 2 + build.gradle | 227 +++++++++--------- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 61574 bytes gradle/wrapper/gradle-wrapper.properties | 1 + gradlew | 12 +- gradlew.bat | 1 + .../o19s/es/explore/ExplorerQueryBuilder.java | 8 +- .../com/o19s/es/ltr/LtrQueryParserPlugin.java | 6 +- .../es/ltr/action/AddFeaturesToSetAction.java | 2 +- .../o19s/es/ltr/action/CachesStatsAction.java | 4 +- .../ltr/action/CreateModelFromSetAction.java | 2 +- .../es/ltr/action/FeatureStoreAction.java | 2 +- .../o19s/es/ltr/action/LTRStatsAction.java | 6 +- .../o19s/es/ltr/action/ListStoresAction.java | 6 +- .../es/ltr/feature/FeatureValidation.java | 12 +- .../feature/store/FeatureNormDefinition.java | 2 +- .../store/MinMaxFeatureNormDefinition.java | 6 +- .../store/PrecompiledTemplateFeature.java | 2 +- .../es/ltr/feature/store/ScriptFeature.java | 4 +- .../store/StandardFeatureNormDefinition.java | 8 +- .../es/ltr/feature/store/StorableElement.java | 4 +- .../es/ltr/feature/store/StoredFeature.java | 10 +- .../store/StoredFeatureNormalizers.java | 10 +- .../ltr/feature/store/StoredFeatureSet.java | 8 +- .../es/ltr/feature/store/StoredLtrModel.java | 10 +- .../store/index/IndexFeatureStore.java | 10 +- .../ltr/logging/LoggingSearchExtBuilder.java | 10 +- .../o19s/es/ltr/query/LtrQueryBuilder.java | 8 +- .../es/ltr/query/StoredLtrQueryBuilder.java | 8 +- .../ltr/query/ValidatingLtrQueryBuilder.java | 8 +- .../ltr/ranker/parser/LinearRankerParser.java | 4 +- .../ltr/ranker/parser/XGBoostJsonParser.java | 10 +- .../o19s/es/ltr/rest/AutoDetectParser.java | 6 +- .../o19s/es/ltr/rest/RestAddFeatureToSet.java | 6 +- .../es/ltr/rest/RestCreateModelFromSet.java | 6 +- .../es/ltr/rest/RestFeatureStoreCaches.java | 2 +- .../o19s/es/ltr/rest/RestStoreManager.java | 2 +- .../mustache/CustomMustacheFactory.java | 2 +- .../es/termstat/TermStatQueryBuilder.java | 8 +- .../o19s/es/ltr/LearningToRankPluginIT.java | 26 ++ .../java/com/o19s/es/ltr/LtrTestUtils.java | 2 +- .../store/StoredFeatureParserTests.java | 9 +- .../store/StoredFeatureSetParserTests.java | 6 +- .../store/StoredLtrModelParserTests.java | 8 +- .../store/index/IndexFeatureStoreTests.java | 6 +- .../logging/LoggingSearchExtBuilderTests.java | 6 +- .../parser/LinearRankerParserTests.java | 2 +- .../o19s/es/ltr/rest/FeaturesParserTests.java | 4 +- .../LearningToRankClientYamlTestSuiteIT.java | 25 ++ 50 files changed, 306 insertions(+), 235 deletions(-) create mode 100644 NOTICE create mode 100644 src/test/java/com/o19s/es/ltr/LearningToRankPluginIT.java create mode 100644 src/yamlRestTest/java/com/o19s/es/ltr/LearningToRankClientYamlTestSuiteIT.java diff --git a/NOTICE b/NOTICE new file mode 100644 index 00000000..46ffe3ba --- /dev/null +++ b/NOTICE @@ -0,0 +1,2 @@ +OpenSearch (https://opensearch.org/) +Copyright OpenSearch Contributors \ No newline at end of file diff --git a/build.gradle b/build.gradle index 89b76bcd..11387f23 100644 --- a/build.gradle +++ b/build.gradle @@ -1,145 +1,156 @@ -import java.nio.file.Files +import org.opensearch.gradle.test.RestIntegTestTask -buildscript { - repositories { - mavenCentral() - mavenLocal() - } - - dependencies { - classpath "org.opensearch.gradle:build-tools:${opensearchVersion}" +apply plugin: 'java' +apply plugin: 'idea' +apply plugin: 'opensearch.opensearchplugin' +apply plugin: 'opensearch.yaml-rest-test' +apply plugin: 'opensearch.pluginzip' +apply plugin: 'jacoco' + +group = 'org.opensearch' + +def pluginName = 'ltr' +def pluginDescription = 'Make Opensearch results more relevant.' +def projectPath = 'org.opensearch' +def pathToPlugin = 'ltr' +def pluginClassName = 'LtrQueryParserPlugin' + +publishing { + publications { + pluginZip(MavenPublication) { publication -> + pom { + name = pluginName + description = pluginDescription + licenses { + license { + name = "The Apache License, Version 2.0" + url = "http://www.apache.org/licenses/LICENSE-2.0.txt" + } + } + developers { + developer { + name = "OpenSearch" + url = "https://github.com/opensearch-project/search-processor" + } + } + } + } } } - -plugins { - id "co.riiid.gradle" version "0.4.2" +opensearchplugin { + name "opensearch-${pluginName}-${plugin_version}.0" + description pluginDescription + classname "${projectPath}.${pathToPlugin}.${pluginClassName}" + licenseFile rootProject.file('LICENSE') + noticeFile rootProject.file('NOTICE') } +// This requires an additional Jar not published as part of build-tools +loggerUsageCheck.enabled = false -group = 'com.o19s' -version = "${ltrVersion}-os${opensearchVersion}" - -apply plugin: 'java' -apply plugin: 'idea' -apply plugin: 'opensearch.opensearchplugin' -apply plugin: 'opensearch.java-rest-test' -apply plugin: 'opensearch.rest-resources' -//apply plugin: 'opensearch.yaml-rest-test' - +// No need to validate pom, as we do not upload to maven/sonatype +validateNebulaPom.enabled = false -idea { - module { - downloadJavadoc = true - downloadSources = true +buildscript { + ext { + isSnapshot = "true" == System.getProperty("build.snapshot", "true") + opensearch_version = System.getProperty("opensearch.version", "2.7.0") + lucene_version = "9.5.0" + plugin_version = opensearch_version + ".0" + if (isSnapshot) { + opensearch_version += "-SNAPSHOT" + plugin_version += "-SNAPSHOT" } -} - -// license of this project -licenseFile = rootProject.file('LICENSE.txt') -// copyright notices -noticeFile = rootProject.file('NOTICE.txt') + println("opensearch_version ${opensearch_version}") + println("plugin_version ${plugin_version}") + } -// disable uploadArchives task for now, no upload happening currently -//GSI TODO: disabled for now -//uploadArchives.enabled = false + repositories { + mavenLocal() + maven { url "https://aws.oss.sonatype.org/content/repositories/snapshots" } + mavenCentral() + maven { url "https://plugins.gradle.org/m2/" } + } -opensearchplugin { - name 'ltr' - description 'Learning to Rank Query w/ RankLib Models' - classname 'com.o19s.es.ltr.LtrQueryParserPlugin' - // license of the plugin, may be different than the above license - licenseFile = rootProject.file('LICENSE.txt') - // copyright notices, may be different than the above notice - noticeFile = rootProject.file('NOTICE.txt') + dependencies { + classpath "org.opensearch.gradle:build-tools:${opensearch_version}" + } } -// In this section you declare the dependencies for your production and test code -// OpenSearch dependency is included due to the build-tools, test-framework as well repositories { - mavenCentral() mavenLocal() + maven { url "https://aws.oss.sonatype.org/content/repositories/snapshots" } + mavenCentral() + maven { url "https://plugins.gradle.org/m2/" } } dependencies { + implementation "com.github.spullara.mustache.java:compiler:0.9.3" + implementation "org.opensearch:opensearch:${opensearch_version}" + implementation "org.opensearch:opensearch-x-content:${opensearch_version}" + implementation "org.opensearch:opensearch-common:${opensearch_version}" + implementation "org.opensearch:opensearch-core:${opensearch_version}" + implementation "org.opensearch:common-utils:${plugin_version}" implementation "org.apache.lucene:lucene-expressions:${luceneVersion}" - implementation "org.antlr:antlr4-runtime:${antlrVersion}" - implementation "org.ow2.asm:asm:${ow2Version}" - implementation "org.ow2.asm:asm-commons:${ow2Version}" - implementation "org.ow2.asm:asm-tree:${ow2Version}" implementation 'com.o19s:RankyMcRankFace:0.1.1' - implementation "com.github.spullara.mustache.java:compiler:0.9.3" - - //testImplementation 'org.apache.lucene:lucene-test-framework:${luceneVersion}' - runtimeOnly 'org.locationtech.spatial4j:spatial4j:0.7' - runtimeOnly 'org.locationtech.jts:jts-core:1.15.0' - runtimeOnly 'org.apache.logging.log4j:log4j-core:2.17.1' } +allprojects { + plugins.withId('jacoco') { + jacoco.toolVersion = '0.8.9' + } +} -// see https://github.com/opensearch-project/OpenSearch/blob/0ba0e7cc26060f964fcbf6ee45bae53b3a9941d0/buildSrc/src/main/java/org/opensearch/gradle/precommit/DependencyLicensesTask.java -dependencyLicenses { - mapping from: /lucene-.*/, to: 'lucene' - mapping from: /asm-.*/, to: 'asm' - mapping from: /RankyMcRankFace.*/, to: 'lucene' - //mapping from: /Ranky.*/, to: 'lucene' - mapping from: /compiler.*/, to: 'lucene' +test { + include '**/*Tests.class' + finalizedBy jacocoTestReport } -sourceSets { - javaRestTest { - compileClasspath += sourceSets["main"].output + sourceSets["test"].output + configurations["testRuntimeClasspath"] - runtimeClasspath += output + compileClasspath - } +task integTest(type: RestIntegTestTask) { + description = "Run tests against a cluster" + testClassesDirs = sourceSets.test.output.classesDirs + classpath = sourceSets.test.runtimeClasspath } +tasks.named("check").configure { dependsOn(integTest) } -java { - withJavadocJar() - withSourcesJar() +integTest { + // The --debug-jvm command-line option makes the cluster debuggable; this makes the tests debuggable + if (System.getProperty("test.debug") != null) { + jvmArgs '-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005' + } } +testClusters.integTest { + testDistribution = "INTEG_TEST" -// Set to false to not use opensearch checkstyle rules -// checkstyleMain.enabled = true -// checkstyleTest.enabled = true - -// FIXME dependency license check needs to be enabled -// dependencyLicenses.enabled = false - -// FIXME thirdparty audit needs to be enabled -// thirdPartyAudit.enabled = false - -// Uncomment this to skip license header checks -// licenseHeaders.enabled = false - -// No need to validate POM, as we do not upload to sonatype -validateNebulaPom.enabled = false + // This installs our plugin into the testClusters + plugin(project.tasks.bundlePlugin.archiveFile) +} -// Elastic tried to remove the logging requirement for plugins, but didn't get it quite right so this is a short term fix until 7.11 -// https://github.com/elastic/opensearch/issues/65247 -loggerUsageCheck.enabled = false +run { + useCluster testClusters.integTest +} -githubRelease.doFirst { - if (!System.getProperty('GITHUB_TOKEN', '')) { - throw new Exception('Missing property GITHUB_TOKEN') +sourceSets { + main { + resources { + srcDirs = ["config"] + includes = ["**/*.yml"] + } } +} - // check if zip file is there - assert file("build/distributions/ltr-${version}.zip").exists() - - // rename zip file - def currentVersion = version.replace('-SNAPSHOT', '') - def filename = "build/distributions/ltr-${currentVersion}.zip" - Files.copy(file("build/distributions/ltr-${version}.zip").toPath(), file(filename).toPath()) - - // configuration - github { - owner = 'gsingers' - repo = 'opensearch-learning-to-rank-base' - token = System.getProperty('GITHUB_TOKEN') - tagName = currentVersion - assets = [ filename ] - targetCommitish = 'main' +jacocoTestReport { + dependsOn test + reports { + xml.required = true + html.required = true } } + +// TODO: Enable these checks +dependencyLicenses.enabled = false +thirdPartyAudit.enabled = false +loggerUsageCheck.enabled = false \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 694a5403..6652c7ad 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ ltrVersion = 2.1.0 -opensearchVersion = 2.5.0 +#opensearchVersion = 2.5.0 luceneVersion = 9.4.2 ow2Version = 9.4 antlrVersion=4.9.3 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832f090a2944b7473328c07c9755baa3196..943f0cbfa754578e88a3dae77fce6e3dea56edbf 100644 GIT binary patch delta 36524 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%0DGK?7GHTj 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 VwlMN}`%er%aGR6olj~j${vQ;P=LY}) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 070cb702..f398c33c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index a69d9cb6..65dcd68d 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,10 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -143,12 +143,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac diff --git a/gradlew.bat b/gradlew.bat index 53a6b238..6689b85b 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% diff --git a/src/main/java/com/o19s/es/explore/ExplorerQueryBuilder.java b/src/main/java/com/o19s/es/explore/ExplorerQueryBuilder.java index 9a85ea6e..51e49e47 100644 --- a/src/main/java/com/o19s/es/explore/ExplorerQueryBuilder.java +++ b/src/main/java/com/o19s/es/explore/ExplorerQueryBuilder.java @@ -16,14 +16,14 @@ package com.o19s.es.explore; import org.apache.lucene.search.Query; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.ParsingException; import org.opensearch.common.io.stream.NamedWriteable; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentBuilder; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.index.query.AbstractQueryBuilder; import org.opensearch.index.query.QueryBuilder; import org.opensearch.index.query.QueryRewriteContext; diff --git a/src/main/java/com/o19s/es/ltr/LtrQueryParserPlugin.java b/src/main/java/com/o19s/es/ltr/LtrQueryParserPlugin.java index d0353036..1428a24f 100644 --- a/src/main/java/com/o19s/es/ltr/LtrQueryParserPlugin.java +++ b/src/main/java/com/o19s/es/ltr/LtrQueryParserPlugin.java @@ -75,7 +75,7 @@ import org.opensearch.cluster.node.DiscoveryNodes; import org.opensearch.cluster.service.ClusterService; import org.opensearch.common.CheckedFunction; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.io.stream.NamedWriteableRegistry; import org.opensearch.common.io.stream.NamedWriteableRegistry.Entry; import org.opensearch.common.settings.ClusterSettings; @@ -83,8 +83,8 @@ import org.opensearch.common.settings.Setting; import org.opensearch.common.settings.Settings; import org.opensearch.common.settings.SettingsFilter; -import org.opensearch.common.xcontent.NamedXContentRegistry; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.NamedXContentRegistry; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.env.Environment; import org.opensearch.env.NodeEnvironment; import org.opensearch.index.Index; diff --git a/src/main/java/com/o19s/es/ltr/action/AddFeaturesToSetAction.java b/src/main/java/com/o19s/es/ltr/action/AddFeaturesToSetAction.java index 3dea24d9..04ee4e4a 100644 --- a/src/main/java/com/o19s/es/ltr/action/AddFeaturesToSetAction.java +++ b/src/main/java/com/o19s/es/ltr/action/AddFeaturesToSetAction.java @@ -30,7 +30,7 @@ import org.opensearch.common.io.stream.StreamOutput; import org.opensearch.common.io.stream.Writeable.Reader; import org.opensearch.common.xcontent.StatusToXContentObject; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.rest.RestStatus; import java.io.IOException; diff --git a/src/main/java/com/o19s/es/ltr/action/CachesStatsAction.java b/src/main/java/com/o19s/es/ltr/action/CachesStatsAction.java index 30963d6b..8e353499 100644 --- a/src/main/java/com/o19s/es/ltr/action/CachesStatsAction.java +++ b/src/main/java/com/o19s/es/ltr/action/CachesStatsAction.java @@ -30,8 +30,8 @@ import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; import org.opensearch.common.io.stream.Writeable; -import org.opensearch.common.xcontent.ToXContent; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.ToXContent; +import org.opensearch.core.xcontent.XContentBuilder; import java.io.IOException; import java.util.HashMap; diff --git a/src/main/java/com/o19s/es/ltr/action/CreateModelFromSetAction.java b/src/main/java/com/o19s/es/ltr/action/CreateModelFromSetAction.java index bf28f2b6..c19c6e23 100644 --- a/src/main/java/com/o19s/es/ltr/action/CreateModelFromSetAction.java +++ b/src/main/java/com/o19s/es/ltr/action/CreateModelFromSetAction.java @@ -29,7 +29,7 @@ import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; import org.opensearch.common.xcontent.StatusToXContentObject; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.rest.RestStatus; import java.io.IOException; diff --git a/src/main/java/com/o19s/es/ltr/action/FeatureStoreAction.java b/src/main/java/com/o19s/es/ltr/action/FeatureStoreAction.java index 5c7ca5fb..4e3b1033 100644 --- a/src/main/java/com/o19s/es/ltr/action/FeatureStoreAction.java +++ b/src/main/java/com/o19s/es/ltr/action/FeatureStoreAction.java @@ -31,7 +31,7 @@ import org.opensearch.common.io.stream.StreamOutput; import org.opensearch.common.io.stream.Writeable.Reader; import org.opensearch.common.xcontent.StatusToXContentObject; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.rest.RestStatus; import java.io.IOException; diff --git a/src/main/java/com/o19s/es/ltr/action/LTRStatsAction.java b/src/main/java/com/o19s/es/ltr/action/LTRStatsAction.java index 54959328..3564cb8d 100644 --- a/src/main/java/com/o19s/es/ltr/action/LTRStatsAction.java +++ b/src/main/java/com/o19s/es/ltr/action/LTRStatsAction.java @@ -28,9 +28,9 @@ import org.opensearch.cluster.node.DiscoveryNode; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; -import org.opensearch.common.xcontent.ToXContent; -import org.opensearch.common.xcontent.ToXContentFragment; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.ToXContent; +import org.opensearch.core.xcontent.ToXContentFragment; +import org.opensearch.core.xcontent.XContentBuilder; import java.io.IOException; import java.util.HashSet; diff --git a/src/main/java/com/o19s/es/ltr/action/ListStoresAction.java b/src/main/java/com/o19s/es/ltr/action/ListStoresAction.java index d1c604ec..1137e035 100644 --- a/src/main/java/com/o19s/es/ltr/action/ListStoresAction.java +++ b/src/main/java/com/o19s/es/ltr/action/ListStoresAction.java @@ -28,9 +28,9 @@ import org.opensearch.common.io.stream.StreamOutput; import org.opensearch.common.io.stream.Writeable; import org.opensearch.common.io.stream.Writeable.Reader; -import org.opensearch.common.xcontent.ToXContent; -import org.opensearch.common.xcontent.ToXContentObject; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.ToXContent; +import org.opensearch.core.xcontent.ToXContentObject; +import org.opensearch.core.xcontent.XContentBuilder; import java.io.IOException; import java.util.List; diff --git a/src/main/java/com/o19s/es/ltr/feature/FeatureValidation.java b/src/main/java/com/o19s/es/ltr/feature/FeatureValidation.java index d63b7b85..7d615256 100644 --- a/src/main/java/com/o19s/es/ltr/feature/FeatureValidation.java +++ b/src/main/java/com/o19s/es/ltr/feature/FeatureValidation.java @@ -16,15 +16,15 @@ package com.o19s.es.ltr.feature; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; import org.opensearch.common.io.stream.Writeable; -import org.opensearch.common.xcontent.ConstructingObjectParser; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.ToXContentObject; -import org.opensearch.common.xcontent.XContentBuilder; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.ConstructingObjectParser; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.ToXContentObject; +import org.opensearch.core.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentParser; import java.io.IOException; import java.util.Map; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/FeatureNormDefinition.java b/src/main/java/com/o19s/es/ltr/feature/store/FeatureNormDefinition.java index 7e1009d5..31bb917d 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/FeatureNormDefinition.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/FeatureNormDefinition.java @@ -18,7 +18,7 @@ import com.o19s.es.ltr.ranker.normalizer.Normalizer; import org.opensearch.common.io.stream.Writeable; -import org.opensearch.common.xcontent.ToXContent; +import org.opensearch.core.xcontent.ToXContent; /** * Parsed feature norm from model definition diff --git a/src/main/java/com/o19s/es/ltr/feature/store/MinMaxFeatureNormDefinition.java b/src/main/java/com/o19s/es/ltr/feature/store/MinMaxFeatureNormDefinition.java index fa4e44ef..b43c236d 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/MinMaxFeatureNormDefinition.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/MinMaxFeatureNormDefinition.java @@ -18,11 +18,11 @@ import com.o19s.es.ltr.ranker.normalizer.MinMaxFeatureNormalizer; import com.o19s.es.ltr.ranker.normalizer.Normalizer; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentBuilder; import java.io.IOException; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/PrecompiledTemplateFeature.java b/src/main/java/com/o19s/es/ltr/feature/store/PrecompiledTemplateFeature.java index 7e200c70..396ca312 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/PrecompiledTemplateFeature.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/PrecompiledTemplateFeature.java @@ -27,7 +27,7 @@ import org.opensearch.common.ParsingException; import org.opensearch.common.xcontent.LoggingDeprecationHandler; import org.opensearch.common.xcontent.XContentFactory; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.index.query.QueryBuilder; import org.opensearch.index.query.QueryShardException; import org.opensearch.index.query.Rewriteable; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/ScriptFeature.java b/src/main/java/com/o19s/es/ltr/feature/store/ScriptFeature.java index 1c78f5ac..b7763dd2 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/ScriptFeature.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/ScriptFeature.java @@ -44,8 +44,8 @@ import org.opensearch.common.lucene.search.function.ScriptScoreFunction; import org.opensearch.common.xcontent.LoggingDeprecationHandler; -import org.opensearch.common.xcontent.NamedXContentRegistry; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.NamedXContentRegistry; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.common.xcontent.XContentType; import org.opensearch.index.mapper.MappedFieldType; import org.opensearch.script.ScoreScript; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/StandardFeatureNormDefinition.java b/src/main/java/com/o19s/es/ltr/feature/store/StandardFeatureNormDefinition.java index 2a707448..b4c9b91d 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/StandardFeatureNormDefinition.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/StandardFeatureNormDefinition.java @@ -19,12 +19,12 @@ import com.o19s.es.ltr.ranker.normalizer.Normalizer; import com.o19s.es.ltr.ranker.normalizer.StandardFeatureNormalizer; import org.opensearch.OpenSearchException; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentBuilder; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentParser; import java.io.IOException; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/StorableElement.java b/src/main/java/com/o19s/es/ltr/feature/store/StorableElement.java index c14b35d1..34ac4d94 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/StorableElement.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/StorableElement.java @@ -18,8 +18,8 @@ import org.opensearch.common.ParsingException; import org.opensearch.common.io.stream.NamedWriteable; -import org.opensearch.common.xcontent.ToXContent; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.ToXContent; +import org.opensearch.core.xcontent.XContentParser; public interface StorableElement extends ToXContent, NamedWriteable { /** diff --git a/src/main/java/com/o19s/es/ltr/feature/store/StoredFeature.java b/src/main/java/com/o19s/es/ltr/feature/store/StoredFeature.java index 565a9ca6..a69e88c4 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/StoredFeature.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/StoredFeature.java @@ -24,18 +24,18 @@ import org.apache.lucene.util.Accountable; import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.RamUsageEstimator; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.ParsingException; import org.opensearch.common.Strings; import org.opensearch.common.bytes.BytesReference; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; import org.opensearch.common.xcontent.LoggingDeprecationHandler; -import org.opensearch.common.xcontent.NamedXContentRegistry; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.NamedXContentRegistry; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.common.xcontent.XContentFactory; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.common.xcontent.XContentType; import org.opensearch.index.query.QueryShardException; import org.opensearch.index.query.ScriptQueryBuilder; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/StoredFeatureNormalizers.java b/src/main/java/com/o19s/es/ltr/feature/store/StoredFeatureNormalizers.java index 8a47c535..8aac603a 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/StoredFeatureNormalizers.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/StoredFeatureNormalizers.java @@ -19,13 +19,13 @@ import com.o19s.es.ltr.feature.FeatureSet; import com.o19s.es.ltr.ranker.normalizer.Normalizer; import org.opensearch.OpenSearchException; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.ToXContent; -import org.opensearch.common.xcontent.XContentBuilder; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.ToXContent; +import org.opensearch.core.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentParser; import java.io.IOException; import java.util.HashMap; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/StoredFeatureSet.java b/src/main/java/com/o19s/es/ltr/feature/store/StoredFeatureSet.java index afe3620f..65fa328c 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/StoredFeatureSet.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/StoredFeatureSet.java @@ -23,13 +23,13 @@ import org.apache.lucene.search.Query; import org.apache.lucene.util.Accountable; import org.apache.lucene.util.RamUsageEstimator; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.ParsingException; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentBuilder; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentParser; import java.io.IOException; import java.util.ArrayList; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/StoredLtrModel.java b/src/main/java/com/o19s/es/ltr/feature/store/StoredLtrModel.java index 4bed9c04..37954b60 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/StoredLtrModel.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/StoredLtrModel.java @@ -23,16 +23,16 @@ import com.o19s.es.ltr.ranker.parser.LtrRankerParser; import com.o19s.es.ltr.ranker.parser.LtrRankerParserFactory; import org.opensearch.Version; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.ParsingException; import org.opensearch.common.Strings; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; import org.opensearch.common.io.stream.Writeable; import org.opensearch.common.xcontent.LoggingDeprecationHandler; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentBuilder; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.common.xcontent.json.JsonXContent; import java.io.IOException; @@ -40,7 +40,7 @@ import java.util.Map; import java.util.Objects; -import static org.opensearch.common.xcontent.NamedXContentRegistry.EMPTY; +import static org.opensearch.core.xcontent.NamedXContentRegistry.EMPTY; public class StoredLtrModel implements StorableElement { public static final String TYPE = "model"; diff --git a/src/main/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStore.java b/src/main/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStore.java index 6c3a3d4b..7829c02d 100644 --- a/src/main/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStore.java +++ b/src/main/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStore.java @@ -35,17 +35,17 @@ import org.opensearch.cluster.metadata.IndexMetadata; import org.opensearch.cluster.metadata.MetadataCreateIndexService; import org.opensearch.common.CheckedFunction; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.bytes.BytesReference; import org.apache.logging.log4j.LogManager; import org.opensearch.common.settings.Setting; import org.opensearch.common.settings.Settings; import org.opensearch.common.xcontent.LoggingDeprecationHandler; -import org.opensearch.common.xcontent.NamedXContentRegistry; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.NamedXContentRegistry; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.common.xcontent.XContentFactory; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.common.xcontent.XContentType; import org.opensearch.core.internal.io.Streams; diff --git a/src/main/java/com/o19s/es/ltr/logging/LoggingSearchExtBuilder.java b/src/main/java/com/o19s/es/ltr/logging/LoggingSearchExtBuilder.java index 88ce4760..05e0bb2c 100644 --- a/src/main/java/com/o19s/es/ltr/logging/LoggingSearchExtBuilder.java +++ b/src/main/java/com/o19s/es/ltr/logging/LoggingSearchExtBuilder.java @@ -17,15 +17,15 @@ package com.o19s.es.ltr.logging; import org.opensearch.common.Nullable; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.ParsingException; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; import org.opensearch.common.io.stream.Writeable; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.ToXContentObject; -import org.opensearch.common.xcontent.XContentBuilder; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.ToXContentObject; +import org.opensearch.core.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.search.SearchExtBuilder; import java.io.IOException; diff --git a/src/main/java/com/o19s/es/ltr/query/LtrQueryBuilder.java b/src/main/java/com/o19s/es/ltr/query/LtrQueryBuilder.java index 17cb4394..342ef2b8 100644 --- a/src/main/java/com/o19s/es/ltr/query/LtrQueryBuilder.java +++ b/src/main/java/com/o19s/es/ltr/query/LtrQueryBuilder.java @@ -24,13 +24,13 @@ import com.o19s.es.ltr.ranker.ranklib.RankLibScriptEngine; import com.o19s.es.ltr.utils.AbstractQueryBuilderUtils; import org.apache.lucene.search.Query; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.ParsingException; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentBuilder; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.index.query.AbstractQueryBuilder; import org.opensearch.index.query.MatchAllQueryBuilder; import org.opensearch.index.query.QueryBuilder; diff --git a/src/main/java/com/o19s/es/ltr/query/StoredLtrQueryBuilder.java b/src/main/java/com/o19s/es/ltr/query/StoredLtrQueryBuilder.java index 98d6bcae..abcc2584 100644 --- a/src/main/java/com/o19s/es/ltr/query/StoredLtrQueryBuilder.java +++ b/src/main/java/com/o19s/es/ltr/query/StoredLtrQueryBuilder.java @@ -24,14 +24,14 @@ import com.o19s.es.ltr.ranker.linear.LinearRanker; import com.o19s.es.ltr.utils.FeatureStoreLoader; import org.opensearch.Version; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.ParsingException; import org.opensearch.common.io.stream.NamedWriteable; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentBuilder; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.index.query.AbstractQueryBuilder; import org.opensearch.index.query.QueryShardContext; diff --git a/src/main/java/com/o19s/es/ltr/query/ValidatingLtrQueryBuilder.java b/src/main/java/com/o19s/es/ltr/query/ValidatingLtrQueryBuilder.java index a6f0363a..30f8d07f 100644 --- a/src/main/java/com/o19s/es/ltr/query/ValidatingLtrQueryBuilder.java +++ b/src/main/java/com/o19s/es/ltr/query/ValidatingLtrQueryBuilder.java @@ -30,13 +30,13 @@ import com.o19s.es.ltr.ranker.parser.LtrRankerParserFactory; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.ParsingException; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentBuilder; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.index.query.AbstractQueryBuilder; import org.opensearch.index.query.QueryShardContext; import org.opensearch.index.query.QueryShardException; diff --git a/src/main/java/com/o19s/es/ltr/ranker/parser/LinearRankerParser.java b/src/main/java/com/o19s/es/ltr/ranker/parser/LinearRankerParser.java index 8b747d6c..fc81cbc8 100644 --- a/src/main/java/com/o19s/es/ltr/ranker/parser/LinearRankerParser.java +++ b/src/main/java/com/o19s/es/ltr/ranker/parser/LinearRankerParser.java @@ -20,12 +20,12 @@ import com.o19s.es.ltr.ranker.linear.LinearRanker; import org.opensearch.common.ParsingException; import org.opensearch.common.xcontent.LoggingDeprecationHandler; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.common.xcontent.json.JsonXContent; import java.io.IOException; -import static org.opensearch.common.xcontent.NamedXContentRegistry.EMPTY; +import static org.opensearch.core.xcontent.NamedXContentRegistry.EMPTY; public class LinearRankerParser implements LtrRankerParser { public static final String TYPE = "model/linear"; diff --git a/src/main/java/com/o19s/es/ltr/ranker/parser/XGBoostJsonParser.java b/src/main/java/com/o19s/es/ltr/ranker/parser/XGBoostJsonParser.java index 536f7e2b..9d81bd1d 100644 --- a/src/main/java/com/o19s/es/ltr/ranker/parser/XGBoostJsonParser.java +++ b/src/main/java/com/o19s/es/ltr/ranker/parser/XGBoostJsonParser.java @@ -21,13 +21,13 @@ import com.o19s.es.ltr.ranker.dectree.NaiveAdditiveDecisionTree.Node; import com.o19s.es.ltr.ranker.normalizer.Normalizer; import com.o19s.es.ltr.ranker.normalizer.Normalizers; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.ParsingException; import org.opensearch.common.xcontent.LoggingDeprecationHandler; -import org.opensearch.common.xcontent.NamedXContentRegistry; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentParseException; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.NamedXContentRegistry; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentParseException; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.common.xcontent.json.JsonXContent; import java.io.IOException; diff --git a/src/main/java/com/o19s/es/ltr/rest/AutoDetectParser.java b/src/main/java/com/o19s/es/ltr/rest/AutoDetectParser.java index b487ccfa..274c305a 100644 --- a/src/main/java/com/o19s/es/ltr/rest/AutoDetectParser.java +++ b/src/main/java/com/o19s/es/ltr/rest/AutoDetectParser.java @@ -21,10 +21,10 @@ import com.o19s.es.ltr.feature.store.StoredFeature; import com.o19s.es.ltr.feature.store.StoredFeatureSet; import com.o19s.es.ltr.feature.store.StoredLtrModel; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.ParsingException; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentParser; import java.io.IOException; diff --git a/src/main/java/com/o19s/es/ltr/rest/RestAddFeatureToSet.java b/src/main/java/com/o19s/es/ltr/rest/RestAddFeatureToSet.java index 89a6efc7..0da780c7 100644 --- a/src/main/java/com/o19s/es/ltr/rest/RestAddFeatureToSet.java +++ b/src/main/java/com/o19s/es/ltr/rest/RestAddFeatureToSet.java @@ -20,9 +20,9 @@ import com.o19s.es.ltr.feature.FeatureValidation; import com.o19s.es.ltr.feature.store.StoredFeature; import org.opensearch.client.node.NodeClient; -import org.opensearch.common.ParseField; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.ParseField; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.rest.RestRequest; import org.opensearch.rest.action.RestStatusToXContentListener; diff --git a/src/main/java/com/o19s/es/ltr/rest/RestCreateModelFromSet.java b/src/main/java/com/o19s/es/ltr/rest/RestCreateModelFromSet.java index 50459252..d492e169 100644 --- a/src/main/java/com/o19s/es/ltr/rest/RestCreateModelFromSet.java +++ b/src/main/java/com/o19s/es/ltr/rest/RestCreateModelFromSet.java @@ -23,10 +23,10 @@ import org.opensearch.ExceptionsHelper; import org.opensearch.action.ActionListener; import org.opensearch.client.node.NodeClient; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.ParsingException; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.index.engine.VersionConflictEngineException; import org.opensearch.rest.BytesRestResponse; import org.opensearch.rest.RestRequest; diff --git a/src/main/java/com/o19s/es/ltr/rest/RestFeatureStoreCaches.java b/src/main/java/com/o19s/es/ltr/rest/RestFeatureStoreCaches.java index b8a701a9..9d3000e0 100644 --- a/src/main/java/com/o19s/es/ltr/rest/RestFeatureStoreCaches.java +++ b/src/main/java/com/o19s/es/ltr/rest/RestFeatureStoreCaches.java @@ -20,7 +20,7 @@ import com.o19s.es.ltr.action.ClearCachesAction; import com.o19s.es.ltr.action.ClearCachesAction.ClearCachesNodesResponse; import org.opensearch.client.node.NodeClient; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.rest.BytesRestResponse; import org.opensearch.rest.RestRequest; import org.opensearch.rest.RestResponse; diff --git a/src/main/java/com/o19s/es/ltr/rest/RestStoreManager.java b/src/main/java/com/o19s/es/ltr/rest/RestStoreManager.java index 0b64902b..d4be858f 100644 --- a/src/main/java/com/o19s/es/ltr/rest/RestStoreManager.java +++ b/src/main/java/com/o19s/es/ltr/rest/RestStoreManager.java @@ -20,7 +20,7 @@ import org.opensearch.action.admin.indices.delete.DeleteIndexRequest; import org.opensearch.action.admin.indices.exists.indices.IndicesExistsResponse; import org.opensearch.client.node.NodeClient; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.rest.BytesRestResponse; import org.opensearch.rest.RestRequest; import org.opensearch.rest.RestResponse; diff --git a/src/main/java/com/o19s/es/template/mustache/CustomMustacheFactory.java b/src/main/java/com/o19s/es/template/mustache/CustomMustacheFactory.java index 01340ce0..f00c0344 100644 --- a/src/main/java/com/o19s/es/template/mustache/CustomMustacheFactory.java +++ b/src/main/java/com/o19s/es/template/mustache/CustomMustacheFactory.java @@ -28,7 +28,7 @@ import com.github.mustachejava.codes.IterableCode; import com.github.mustachejava.codes.WriteCode; import org.opensearch.common.Strings; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.common.xcontent.XContentType; import java.io.IOException; diff --git a/src/main/java/com/o19s/es/termstat/TermStatQueryBuilder.java b/src/main/java/com/o19s/es/termstat/TermStatQueryBuilder.java index fe34436e..74dec28a 100644 --- a/src/main/java/com/o19s/es/termstat/TermStatQueryBuilder.java +++ b/src/main/java/com/o19s/es/termstat/TermStatQueryBuilder.java @@ -24,14 +24,14 @@ import org.apache.lucene.expressions.Expression; import org.apache.lucene.index.Term; import org.apache.lucene.search.Query; -import org.opensearch.common.ParseField; +import org.opensearch.core.ParseField; import org.opensearch.common.ParsingException; import org.opensearch.common.io.stream.NamedWriteable; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; -import org.opensearch.common.xcontent.ObjectParser; -import org.opensearch.common.xcontent.XContentBuilder; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.ObjectParser; +import org.opensearch.core.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.index.mapper.MappedFieldType; import org.opensearch.index.query.AbstractQueryBuilder; import org.opensearch.index.query.QueryShardContext; diff --git a/src/test/java/com/o19s/es/ltr/LearningToRankPluginIT.java b/src/test/java/com/o19s/es/ltr/LearningToRankPluginIT.java new file mode 100644 index 00000000..417593de --- /dev/null +++ b/src/test/java/com/o19s/es/ltr/LearningToRankPluginIT.java @@ -0,0 +1,26 @@ +/* + * 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 com.o19s.es.ltr; + +import org.apache.http.ParseException; +import org.apache.http.util.EntityUtils; +import org.opensearch.test.rest.OpenSearchRestTestCase; +import org.opensearch.client.Request; +import org.opensearch.client.Response; +import java.io.IOException; + +public class LearningToRankPluginIT extends OpenSearchRestTestCase { + public void testPluginInstalled() throws IOException, ParseException { + Response response = client().performRequest(new Request("GET", "/_cat/plugins")); + String body = EntityUtils.toString(response.getEntity()); + + logger.info("response body: {}", body); + assertNotNull(body); + assertTrue(body.contains("search-processor")); + } +} diff --git a/src/test/java/com/o19s/es/ltr/LtrTestUtils.java b/src/test/java/com/o19s/es/ltr/LtrTestUtils.java index c6cfd94c..766f2942 100644 --- a/src/test/java/com/o19s/es/ltr/LtrTestUtils.java +++ b/src/test/java/com/o19s/es/ltr/LtrTestUtils.java @@ -39,7 +39,7 @@ import org.apache.lucene.tests.util.TestUtil; import org.opensearch.common.CheckedFunction; import org.opensearch.common.Strings; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.common.xcontent.json.JsonXContent; import org.opensearch.index.query.WrapperQueryBuilder; diff --git a/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureParserTests.java b/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureParserTests.java index 86bcd36b..c9fb58f6 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureParserTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureParserTests.java @@ -20,8 +20,8 @@ import org.opensearch.common.ParsingException; import org.opensearch.common.Strings; import org.opensearch.common.xcontent.LoggingDeprecationHandler; -import org.opensearch.common.xcontent.ToXContent; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.ToXContent; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.common.xcontent.XContentFactory; import org.opensearch.common.xcontent.XContentType; import org.opensearch.index.query.AbstractQueryBuilder; @@ -31,7 +31,7 @@ import java.io.IOException; import java.util.Arrays; -import static org.opensearch.common.xcontent.NamedXContentRegistry.EMPTY; +import static org.opensearch.core.xcontent.NamedXContentRegistry.EMPTY; import static org.opensearch.common.xcontent.json.JsonXContent.jsonXContent; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.containsString; @@ -255,6 +255,7 @@ static StoredFeature parse(String featureString, String defaultName) throws IOEx } private String writeAsNonFormattedString(AbstractQueryBuilder builder) { - return Strings.toString(builder, false, false); + //TODO: fix and replace call to org.opensearch.common.Strings + return ""; //Strings.toString(builder, false, false); } } \ No newline at end of file diff --git a/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureSetParserTests.java b/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureSetParserTests.java index d4815d3f..33d44c7b 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureSetParserTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureSetParserTests.java @@ -22,8 +22,8 @@ import org.opensearch.common.ParsingException; import org.opensearch.common.Strings; import org.opensearch.common.xcontent.LoggingDeprecationHandler; -import org.opensearch.common.xcontent.ToXContent; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.ToXContent; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.common.xcontent.XContentFactory; import org.opensearch.common.xcontent.XContentType; import org.opensearch.index.query.MatchQueryBuilder; @@ -39,7 +39,7 @@ import static org.apache.lucene.tests.util.TestUtil.randomRealisticUnicodeString; import static org.apache.lucene.tests.util.TestUtil.randomSimpleString; -import static org.opensearch.common.xcontent.NamedXContentRegistry.EMPTY; +import static org.opensearch.core.xcontent.NamedXContentRegistry.EMPTY; import static org.opensearch.common.xcontent.json.JsonXContent.jsonXContent; import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.containsString; diff --git a/src/test/java/com/o19s/es/ltr/feature/store/StoredLtrModelParserTests.java b/src/test/java/com/o19s/es/ltr/feature/store/StoredLtrModelParserTests.java index d14f2896..227b6a52 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/StoredLtrModelParserTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/StoredLtrModelParserTests.java @@ -32,16 +32,16 @@ import org.opensearch.common.io.stream.BytesStreamOutput; import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.xcontent.LoggingDeprecationHandler; -import org.opensearch.common.xcontent.ToXContent; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.ToXContent; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.common.xcontent.XContentFactory; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.common.xcontent.XContentType; import java.io.IOException; import java.util.Base64; -import static org.opensearch.common.xcontent.NamedXContentRegistry.EMPTY; +import static org.opensearch.core.xcontent.NamedXContentRegistry.EMPTY; import static org.opensearch.common.xcontent.json.JsonXContent.jsonXContent; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.equalTo; diff --git a/src/test/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStoreTests.java b/src/test/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStoreTests.java index 53d77a07..ecc49a5e 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStoreTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/index/IndexFeatureStoreTests.java @@ -28,10 +28,10 @@ import org.opensearch.client.Requests; import org.opensearch.common.bytes.BytesReference; import org.opensearch.common.xcontent.LoggingDeprecationHandler; -import org.opensearch.common.xcontent.NamedXContentRegistry; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.NamedXContentRegistry; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.common.xcontent.XContentFactory; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.XContentParser; import java.io.IOException; import java.util.HashMap; diff --git a/src/test/java/com/o19s/es/ltr/logging/LoggingSearchExtBuilderTests.java b/src/test/java/com/o19s/es/ltr/logging/LoggingSearchExtBuilderTests.java index 6fe56a32..8e11dc9e 100644 --- a/src/test/java/com/o19s/es/ltr/logging/LoggingSearchExtBuilderTests.java +++ b/src/test/java/com/o19s/es/ltr/logging/LoggingSearchExtBuilderTests.java @@ -19,10 +19,10 @@ import org.opensearch.common.ParsingException; import org.opensearch.common.Strings; import org.opensearch.common.io.stream.BytesStreamOutput; -import org.opensearch.common.xcontent.ToXContent; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.ToXContent; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.common.xcontent.XContentFactory; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.XContentParser; import org.opensearch.common.xcontent.json.JsonXContent; import org.opensearch.test.OpenSearchTestCase; diff --git a/src/test/java/com/o19s/es/ltr/ranker/parser/LinearRankerParserTests.java b/src/test/java/com/o19s/es/ltr/ranker/parser/LinearRankerParserTests.java index 94e78eaf..623b510a 100644 --- a/src/test/java/com/o19s/es/ltr/ranker/parser/LinearRankerParserTests.java +++ b/src/test/java/com/o19s/es/ltr/ranker/parser/LinearRankerParserTests.java @@ -25,7 +25,7 @@ import org.apache.lucene.tests.util.LuceneTestCase; import org.opensearch.common.ParsingException; import org.opensearch.common.Strings; -import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.common.xcontent.json.JsonXContent; import org.junit.Assert; diff --git a/src/test/java/com/o19s/es/ltr/rest/FeaturesParserTests.java b/src/test/java/com/o19s/es/ltr/rest/FeaturesParserTests.java index 2e491643..c4cd3a91 100644 --- a/src/test/java/com/o19s/es/ltr/rest/FeaturesParserTests.java +++ b/src/test/java/com/o19s/es/ltr/rest/FeaturesParserTests.java @@ -18,8 +18,8 @@ import org.apache.lucene.tests.util.LuceneTestCase; import org.opensearch.common.xcontent.LoggingDeprecationHandler; -import org.opensearch.common.xcontent.NamedXContentRegistry; -import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.core.xcontent.NamedXContentRegistry; +import org.opensearch.core.xcontent.XContentParser; import java.io.IOException; import java.util.stream.Collectors; diff --git a/src/yamlRestTest/java/com/o19s/es/ltr/LearningToRankClientYamlTestSuiteIT.java b/src/yamlRestTest/java/com/o19s/es/ltr/LearningToRankClientYamlTestSuiteIT.java new file mode 100644 index 00000000..fcec1484 --- /dev/null +++ b/src/yamlRestTest/java/com/o19s/es/ltr/LearningToRankClientYamlTestSuiteIT.java @@ -0,0 +1,25 @@ +/* + * 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 com.o19s.es.ltr; + +import com.carrotsearch.randomizedtesting.annotations.Name; +import com.carrotsearch.randomizedtesting.annotations.ParametersFactory; +import org.opensearch.test.rest.yaml.ClientYamlTestCandidate; +import org.opensearch.test.rest.yaml.OpenSearchClientYamlSuiteTestCase; + +public class LearningToRankClientYamlTestSuiteIT extends OpenSearchClientYamlSuiteTestCase { + public LearningToRankClientYamlTestSuiteIT(@Name("yaml") ClientYamlTestCandidate testCandidate) { + super(testCandidate); + } + + @ParametersFactory + public static Iterable parameters() throws Exception { + return OpenSearchClientYamlSuiteTestCase.createParameters(); + } + } + From cee4d4579a83abfba50e3aeeaeb1e5d1c3cd7c08 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Tue, 11 Jul 2023 11:59:40 -0400 Subject: [PATCH 41/81] updated according to changes in OpenSearch core; added integTests and yamlRestTest according to spec. integTests don't work yet so running with the following vars works -Dopensearch.version=2.7.0 -Dskip.integtests=true -Djava.security.manager=allow -Dbuild.snapshot=false buid.snapshot runs the yamlRestTest successfully. -Djava.security.manager=allow allows the deprecated SecurityManager to do it's work also updated StoredFeatureParserTests.writeAsNonFormattedString to require MediaType as per https://github.com/opensearch-project/OpenSearch/commit/f9eb9bfe17b71aae7e2a00ac0337909f1b3e61e7 Signed-off-by: Mark Cohen --- README.md | 53 +++++++++++++------ build.gradle | 27 +++++++--- .../com/o19s/es/ltr/ranker/LtrRanker.java | 3 +- .../plugin-metadata/plugin-security.policy | 13 ++--- .../store/StoredFeatureParserTests.java | 3 +- .../o19s/es/ltr/rest/FeaturesParserTests.java | 3 +- .../resources/rest-api-spec/test/10_basic.yml | 17 ++++++ 7 files changed, 87 insertions(+), 32 deletions(-) create mode 100644 src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml diff --git a/README.md b/README.md index a15db81a..1343158e 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ If you already are running OpenSearch, don't forget to restart! # Releases -Releases can be found at https://github.com/gsingers/opensearch-learning-to-rank-base/releases. +Releases can be found at https://github.com/opensearch-project/opensearch-learning-to-rank-base/releases. ## Releasing/Packaging @@ -41,25 +41,24 @@ And there are 14 failing tests. ``` Tests with failures: -- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionDoubleQueryParameter -- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionMissingQueryParameter -- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionIntegerQueryParameter -- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionShortQueryParameter -- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionInvalidQueryParameter -- com.o19s.es.termstat.TermStatQueryBuilderTests.testMustRewrite -- com.o19s.es.termstat.TermStatQueryBuilderTests.testToQuery -- com.o19s.es.termstat.TermStatQueryBuilderTests.testCacheability -- com.o19s.es.ltr.feature.store.StoredFeatureParserTests.testExpressionOptimization -- com.o19s.es.termstat.TermStatQueryTests.testEmptyTerms -- com.o19s.es.termstat.TermStatQueryTests.testUniqueCount -- com.o19s.es.termstat.TermStatQueryTests.testBasicFormula -- com.o19s.es.termstat.TermStatQueryTests.testQuery -- com.o19s.es.termstat.TermStatQueryTests.testMatchCount +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionDoubleQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionMissingQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionIntegerQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionShortQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionInvalidQueryParameter +- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testMustRewrite +- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testToQuery +- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testCacheability +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureParserTests.testExpressionOptimization +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testEmptyTerms +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testUniqueCount +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testBasicFormula +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testQuery +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testMatchCount 228 tests completed, 14 failed ``` - # Development To build, you need to disable the Java security manager @@ -126,4 +125,26 @@ To publish the Docker image to Docker Hub, you need to kick off the Docker actio gh workflow run .github/workflows/docker.yml +# Integrating into OpenSearch Project +After this repo was moved, we started working on integration with the OpenSearch build system. With the latest updates, running the following will build a 2.7.0 compatible plugin (these changes have not been tested against any other OpenSearch version): +``` +./gradlew -Dopensearch.version=2.7.0 -Dskip.integtests=true -Djava.security.manager=allow -Dbuild.snapshot=false build +``` +skip.integtests: for the build to work inside opensearch-project, integTests must be present, but they can be skipped until we make them better +java.security.manager=allow: because the Java SecurityManager is deprecated, this needs to be passed in to get the following tests passing that were failing previously: +Tests with failures: +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionDoubleQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionMissingQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionIntegerQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionShortQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionInvalidQueryParameter +- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testMustRewrite +- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testToQuery +- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testCacheability +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureParserTests.testExpressionOptimization +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testEmptyTerms +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testUniqueCount +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testBasicFormula +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testQuery +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testMatchCount diff --git a/build.gradle b/build.gradle index 11387f23..4e65e482 100644 --- a/build.gradle +++ b/build.gradle @@ -7,11 +7,11 @@ apply plugin: 'opensearch.yaml-rest-test' apply plugin: 'opensearch.pluginzip' apply plugin: 'jacoco' -group = 'org.opensearch' - +//group = 'org.opensearch' +group = 'com.o19s.es' def pluginName = 'ltr' def pluginDescription = 'Make Opensearch results more relevant.' -def projectPath = 'org.opensearch' +def projectPath = 'com.o19s.es' def pathToPlugin = 'ltr' def pluginClassName = 'LtrQueryParserPlugin' @@ -38,7 +38,7 @@ publishing { } } opensearchplugin { - name "opensearch-${pluginName}-${plugin_version}.0" + name "opensearch-${pluginName}-${plugin_version}" description pluginDescription classname "${projectPath}.${pathToPlugin}.${pluginClassName}" licenseFile rootProject.file('LICENSE') @@ -63,6 +63,8 @@ buildscript { } println("opensearch_version ${opensearch_version}") println("plugin_version ${plugin_version}") + + skipIntegTests = System.getProperty("skip.integtests", "false") } repositories { @@ -93,6 +95,10 @@ dependencies { implementation "org.opensearch:common-utils:${plugin_version}" implementation "org.apache.lucene:lucene-expressions:${luceneVersion}" implementation 'com.o19s:RankyMcRankFace:0.1.1' + implementation "org.antlr:antlr4-runtime:${antlrVersion}" + implementation "org.ow2.asm:asm:${ow2Version}" + implementation "org.ow2.asm:asm-commons:${ow2Version}" + implementation "org.ow2.asm:asm-tree:${ow2Version}" } @@ -109,11 +115,16 @@ test { } task integTest(type: RestIntegTestTask) { + description = "Run tests against a cluster" testClassesDirs = sourceSets.test.output.classesDirs classpath = sourceSets.test.runtimeClasspath } -tasks.named("check").configure { dependsOn(integTest) } +if (!skipIntegTests) { + tasks.named("check").configure { dependsOn(integTest) } +} else { + println("Skipping Integ Tests") +} integTest { // The --debug-jvm command-line option makes the cluster debuggable; this makes the tests debuggable @@ -130,7 +141,11 @@ testClusters.integTest { } run { - useCluster testClusters.integTest + if (skipIntegTests == "false") { + useCluster testClusters.integTest + } else { + println("skipping Integ Tests ${skipIntegTests}") + } } sourceSets { diff --git a/src/main/java/com/o19s/es/ltr/ranker/LtrRanker.java b/src/main/java/com/o19s/es/ltr/ranker/LtrRanker.java index 64c4fa2f..38ea4c48 100644 --- a/src/main/java/com/o19s/es/ltr/ranker/LtrRanker.java +++ b/src/main/java/com/o19s/es/ltr/ranker/LtrRanker.java @@ -17,9 +17,10 @@ package com.o19s.es.ltr.ranker; import org.opensearch.common.Nullable; +import com.o19s.es.ltr.query.RankerQuery; /** - * A ranker used by {@link com.o19s.es.ltr.query.RankerQuery} + * A ranker used by {@link RankerQuery} * to compute a score based on a set of feature scores. */ public interface LtrRanker { diff --git a/src/main/plugin-metadata/plugin-security.policy b/src/main/plugin-metadata/plugin-security.policy index 4835ab05..979532ef 100644 --- a/src/main/plugin-metadata/plugin-security.policy +++ b/src/main/plugin-metadata/plugin-security.policy @@ -22,11 +22,12 @@ grant { permission java.lang.RuntimePermission "createClassLoader"; // expression runtime - permission org.elasticsearch.script.ClassPermission "java.lang.String"; - permission org.elasticsearch.script.ClassPermission "org.apache.lucene.expressions.Expression"; - permission org.elasticsearch.script.ClassPermission "org.apache.lucene.search.DoubleValues"; + permission org.opensearch.script.ClassPermission "java.lang.String"; + permission org.opensearch.script.ClassPermission "org.apache.lucene.expressions.Expression"; + permission org.opensearch.script.ClassPermission "org.apache.lucene.expressions.js.ExpressionMath"; + permission org.opensearch.script.ClassPermission "org.apache.lucene.search.DoubleValues"; // available functions - permission org.elasticsearch.script.ClassPermission "java.lang.Math"; - permission org.elasticsearch.script.ClassPermission "org.apache.lucene.util.MathUtil"; - permission org.elasticsearch.script.ClassPermission "org.apache.lucene.util.SloppyMath"; + permission org.opensearch.script.ClassPermission "java.lang.Math"; + permission org.opensearch.script.ClassPermission "org.apache.lucene.util.MathUtil"; + permission org.opensearch.script.ClassPermission "org.apache.lucene.util.SloppyMath"; }; diff --git a/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureParserTests.java b/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureParserTests.java index c9fb58f6..df74b9f9 100644 --- a/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureParserTests.java +++ b/src/test/java/com/o19s/es/ltr/feature/store/StoredFeatureParserTests.java @@ -255,7 +255,6 @@ static StoredFeature parse(String featureString, String defaultName) throws IOEx } private String writeAsNonFormattedString(AbstractQueryBuilder builder) { - //TODO: fix and replace call to org.opensearch.common.Strings - return ""; //Strings.toString(builder, false, false); + return Strings.toString(XContentType.JSON, builder); } } \ No newline at end of file diff --git a/src/test/java/com/o19s/es/ltr/rest/FeaturesParserTests.java b/src/test/java/com/o19s/es/ltr/rest/FeaturesParserTests.java index c4cd3a91..0f36299c 100644 --- a/src/test/java/com/o19s/es/ltr/rest/FeaturesParserTests.java +++ b/src/test/java/com/o19s/es/ltr/rest/FeaturesParserTests.java @@ -16,6 +16,7 @@ package com.o19s.es.ltr.rest; +import com.o19s.es.ltr.feature.store.StoredFeatureParserTests; import org.apache.lucene.tests.util.LuceneTestCase; import org.opensearch.common.xcontent.LoggingDeprecationHandler; import org.opensearch.core.xcontent.NamedXContentRegistry; @@ -33,7 +34,7 @@ public void testParseArray() throws IOException { RestAddFeatureToSet.FeaturesParserState fparser = new RestAddFeatureToSet.FeaturesParserState(); int nFeat = random().nextInt(18)+1; String featuresArray = IntStream.range(0, nFeat) - .mapToObj((i) -> generateTestFeature("feat" + i)) + .mapToObj((i) -> StoredFeatureParserTests.generateTestFeature("feat" + i)) .collect(Collectors.joining(",")); XContentParser parser = jsonXContent.createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, "{\"features\":[" + featuresArray + "]}"); diff --git a/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml b/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml new file mode 100644 index 00000000..52913a2a --- /dev/null +++ b/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml @@ -0,0 +1,17 @@ +"Test that the plugin is loaded in OpenSearch": + - do: + cat.plugins: + local: true + h: component + + - match: + $body: /^opensearch-ltr-\d+.\d+.\d+.\d+\n$/ + + - do: + indices.create: + index: test + + - do: + search: + index: test + body: { } From 46902782603b47bd9dddfbc5e040bc6a08500609 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Tue, 11 Jul 2023 13:50:06 -0400 Subject: [PATCH 42/81] new ci build for opensearch Signed-off-by: Mark Cohen --- .github/workflows/ci.yml | 47 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..53612bcb --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,47 @@ +name: Build & Test Learning to Rank Plugin +on: + schedule: + - cron: '0 0 * * *' # every night + push: + branches: + - "*" + - "feature/**" + pull_request: + branches: + - "*" + - "feature/**" + +jobs: + Build-ltr-plugin: + strategy: + matrix: + java: [11, 17] + os: [ubuntu-latest, macos-latest, windows-latest] + + name: Build and Test Learning to Rank Plugin + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout LTR Plugin + uses: actions/checkout@v1 + + - name: Setup Java ${{ matrix.java }} + uses: actions/setup-java@v1 + with: + java-version: ${{ matrix.java }} + + - name: Run build Windows + if: ${{ matrix.os == 'windows-latest' }} + run: | + ./gradlew.bat build + + - name: Run non-Windows + if: ${{ matrix.os != 'windows-latest' }} + run: | + ./gradlew build + + - name: Upload Coverage Report + if: ${{matrix.os}} == 'ubuntu' + uses: codecov/codecov-action@v1 + with: + token: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file From 44a857d2d10b96e766f7ec8d349e315b67718749 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Tue, 11 Jul 2023 16:31:16 -0400 Subject: [PATCH 43/81] removed windows build and added workflow_dispatch Signed-off-by: Mark Cohen --- .github/workflows/ci.yml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 53612bcb..41741371 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,13 +10,15 @@ on: branches: - "*" - "feature/**" + workflow_dispatch: + jobs: Build-ltr-plugin: strategy: matrix: java: [11, 17] - os: [ubuntu-latest, macos-latest, windows-latest] + os: [ubuntu-latest, macos-latest] name: Build and Test Learning to Rank Plugin runs-on: ${{ matrix.os }} @@ -30,15 +32,10 @@ jobs: with: java-version: ${{ matrix.java }} - - name: Run build Windows - if: ${{ matrix.os == 'windows-latest' }} - run: | - ./gradlew.bat build - - name: Run non-Windows if: ${{ matrix.os != 'windows-latest' }} run: | - ./gradlew build + ./gradlew build -Dopensearch.version=2.7.0 -Dskip.integtests=true -Djava.security.manager=allow -Dbuild.snapshot=false - name: Upload Coverage Report if: ${{matrix.os}} == 'ubuntu' From 2c9a9f9befe02a13dc4709dbb50a1d0281e82f05 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Tue, 11 Jul 2023 16:38:33 -0400 Subject: [PATCH 44/81] removed windows build and added workflow_dispatch Signed-off-by: Mark Cohen --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 41741371..b2bb16e0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,6 @@ on: - "feature/**" workflow_dispatch: - jobs: Build-ltr-plugin: strategy: @@ -35,10 +34,11 @@ jobs: - name: Run non-Windows if: ${{ matrix.os != 'windows-latest' }} run: | - ./gradlew build -Dopensearch.version=2.7.0 -Dskip.integtests=true -Djava.security.manager=allow -Dbuild.snapshot=false + ./gradlew build -Dopensearch.version=2.7.0 -Dskip.integtests=true \ + -Djava.security.manager=allow -Dbuild.snapshot=false - name: Upload Coverage Report if: ${{matrix.os}} == 'ubuntu' uses: codecov/codecov-action@v1 with: - token: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file + token: ${{ secrets.CODECOV_TOKEN }} From 9966a3e812fa10180f219c48d0854e780dd211cb Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Wed, 12 Jul 2023 14:31:12 -0400 Subject: [PATCH 45/81] updated CI to upload build artifacts Signed-off-by: Mark Cohen --- .github/workflows/ci.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b2bb16e0..a393cc32 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,5 @@ name: Build & Test Learning to Rank Plugin + on: schedule: - cron: '0 0 * * *' # every night @@ -42,3 +43,14 @@ jobs: uses: codecov/codecov-action@v1 with: token: ${{ secrets.CODECOV_TOKEN }} + + - name: Create Artifact Path + run: | + mkdir -p opensearch-ltr-builds + cp -r ./build/distributions/*.zip opensearch-ltr-builds + + - name: Upload Artifacts + uses: actions/upload-artifact@v1 + with: + name: opensearch-ltr-${{ matrix.os }} + path: opensearch-ltr-builds From 27232cdb3f0aef576647835d3a9e3885b55af404 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Fri, 14 Jul 2023 12:40:59 -0400 Subject: [PATCH 46/81] commented codecov in ci.yml for now Signed-off-by: Mark Cohen --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a393cc32..5559a691 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,11 +38,11 @@ jobs: ./gradlew build -Dopensearch.version=2.7.0 -Dskip.integtests=true \ -Djava.security.manager=allow -Dbuild.snapshot=false - - name: Upload Coverage Report - if: ${{matrix.os}} == 'ubuntu' - uses: codecov/codecov-action@v1 - with: - token: ${{ secrets.CODECOV_TOKEN }} +# - name: Upload Coverage Report +# if: ${{matrix.os}} == 'ubuntu' +# uses: codecov/codecov-action@v1 +# with: +# token: ${{ secrets.CODECOV_TOKEN }} - name: Create Artifact Path run: | From 1596e943ec8b3e0a1160c27bd92f55db7fddffed Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Sun, 16 Jul 2023 16:46:02 -0400 Subject: [PATCH 47/81] added 'github.ref ' as a branch to trigger when a tag is pushed Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e8905680..76c70f66 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,7 +7,7 @@ on: push: tags: - 'v*.*.*' - branches: [ test-release ] + branches: [ ${{ github.ref }}, test-release ] jobs: release: From ceefb875fd402a739c3945b9a12bccd071fb203c Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Sun, 16 Jul 2023 16:48:37 -0400 Subject: [PATCH 48/81] updated gradle command to be consistent with updates in build.gradle Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 76c70f66..c677c450 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,7 +25,7 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle - run: ./gradlew -Dtests.security.manager=false build + run: ./gradlew -Dskip.integtests=true -Djava.security.manager=allow -Dbuild.snapshot=false - name: Rename build assets run: mv ./build/distributions/ltr-*.zip ./ltr-plugin-${{ env.RELEASE_VERSION }}.zip - name: Create Release From b4be3c35994fb005a705ade92abb2fcc2a0fbc01 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Sun, 16 Jul 2023 16:54:53 -0400 Subject: [PATCH 49/81] removed test-release branch Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c677c450..81dde3e2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,7 +7,7 @@ on: push: tags: - 'v*.*.*' - branches: [ ${{ github.ref }}, test-release ] + branches: [ ${{ github.ref }} ] jobs: release: From 271c83113897e786fbb95d13b06568b77e3f37e4 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Sun, 16 Jul 2023 17:01:24 -0400 Subject: [PATCH 50/81] removed space from line 9 in release.yml Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 81dde3e2..54e1e74e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,7 +6,7 @@ name: Tag and publish a release on: push: tags: - - 'v*.*.*' + - 'v*.*.*' branches: [ ${{ github.ref }} ] jobs: From 6cec47311a9b927a6f6ae08ddd742300b3a087ba Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Fri, 4 Aug 2023 18:19:08 -0400 Subject: [PATCH 51/81] updated README.md with 2.7.0 build info; removed KNOWN_ISSUES.md; set opensearch version on command line instead of in gradle.properties Signed-off-by: Mark Cohen --- .../{release.yml => release-old.yml} | 8 +-- KNOWN_ISSUES.md | 13 +--- README.md | 63 ++----------------- gradle.properties | 6 +- 4 files changed, 14 insertions(+), 76 deletions(-) rename .github/workflows/{release.yml => release-old.yml} (91%) diff --git a/.github/workflows/release.yml b/.github/workflows/release-old.yml similarity index 91% rename from .github/workflows/release.yml rename to .github/workflows/release-old.yml index 54e1e74e..da715058 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release-old.yml @@ -6,8 +6,8 @@ name: Tag and publish a release on: push: tags: - - 'v*.*.*' - branches: [ ${{ github.ref }} ] + - "v*.*.*" + branches: [ "${{ github.ref }}", 'test-release' ] jobs: release: @@ -15,8 +15,8 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v2 - - name: Set release version Name + - uses: actions/checkout@v2 + - name: Set release version Name run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - name: Set up JDK 17.0 uses: actions/setup-java@v1 diff --git a/KNOWN_ISSUES.md b/KNOWN_ISSUES.md index cdcbed0e..8a1bc920 100644 --- a/KNOWN_ISSUES.md +++ b/KNOWN_ISSUES.md @@ -1,15 +1,4 @@ # Known issues +2.7.0: yamlresttests fail; set -Dbuild.snapshot=false to build successfully -## Cache deadlock - -All elasticsearch versions between 5.5.3 (included) and 6.3.0 (excluded) are affected by a [bug](https://github.com/elastic/elasticsearch/pull/30461) in the internal cache that may lead to a serious deadlock that could in theory leak all the search threads. -A possible workaround is to configure the cache to avoid as much as possible its eviction mechanism by setting these options in your `elasticsearch.yml` file: - -``` -ltr.caches.expire_after_write: 0 -ltr.caches.expire_after_read: 0 -ltr.caches.max_mem: 100mb -``` - -elasticsearch versions 5.6.10, 6.3.0 and onwards should include the bugfix for this bug. diff --git a/README.md b/README.md index 1343158e..907bc8a7 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ To install, you'd run a command like this but replacing with the appropriate pre | 1.2.3 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.3/ltr-1.5.4-os1.2.3.zip` | | 2.2.1 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/2.2.1/ltr-2.0.0-os2.2.1.zip` | | 2.5.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.1.0/ltr-plugin-v2.1.0.zip` | - +| 2.7.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.2.0/ltr-plugin-v2.2.0.zip` (It's expected you'll confirm some security exceptions, you can pass `-b` to `opensearch-plugin` to automatically install) @@ -30,47 +30,20 @@ Releases can be found at https://github.com/opensearch-project/opensearch-learni ## Releasing/Packaging - Releases are done through Github Workflows (see `.github/workflows` in the root directory) on an as needed basis. If you do `./gradlew build` as per above under building, it will build all the artifacts that are in the release. -## About alpha releases - -These releases are alpha because some issues with the tests due to securemock that depends on ElasticSearch security stuff. -And there are 14 failing tests. - -``` -Tests with failures: -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionDoubleQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionMissingQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionIntegerQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionShortQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionInvalidQueryParameter -- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testMustRewrite -- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testToQuery -- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testCacheability -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureParserTests.testExpressionOptimization -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testEmptyTerms -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testUniqueCount -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testBasicFormula -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testQuery -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testMatchCount - -228 tests completed, 14 failed -``` - # Development -To build, you need to disable the Java security manager +To build, you need to explicitly enable Java security and disable snapshot builds (until the YamlRestTests are fixed): -./gradlew -Dtests.security.manager=false clean build +./gradlew -Dopensearch.version={opensearch-version-to-build-on} -Djava.security.manager=allow -Dbuild.snapshot=false # Upgrading the OpenSearch Versions -1. Edit `gradle.properties` to have the appropriate versions (it's often easiest to go download the latest tarball from OpenSearch and simply check the versions that ship) and to increment the version of this plugin -2. Build and test as above -3. Update this README with the version info in the table above -4. Upgrade the Docker file versions in the `docker` directory +1. Build and test as above +2. Update this README with the version info in the table above +3. Upgrade the Docker file versions in the `docker` directory 4. Test the docker image, per below. ## Development Notes @@ -124,27 +97,3 @@ To publish the Docker image to Docker Hub, you need to kick off the Docker actio gh workflow run .github/workflows/docker.yml - -# Integrating into OpenSearch Project -After this repo was moved, we started working on integration with the OpenSearch build system. With the latest updates, running the following will build a 2.7.0 compatible plugin (these changes have not been tested against any other OpenSearch version): -``` -./gradlew -Dopensearch.version=2.7.0 -Dskip.integtests=true -Djava.security.manager=allow -Dbuild.snapshot=false build -``` -skip.integtests: for the build to work inside opensearch-project, integTests must be present, but they can be skipped until we make them better -java.security.manager=allow: because the Java SecurityManager is deprecated, this needs to be passed in to get the following tests passing that were failing previously: -Tests with failures: -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionDoubleQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionMissingQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionIntegerQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionShortQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionInvalidQueryParameter -- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testMustRewrite -- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testToQuery -- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testCacheability -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureParserTests.testExpressionOptimization -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testEmptyTerms -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testUniqueCount -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testBasicFormula -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testQuery -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testMatchCount - diff --git a/gradle.properties b/gradle.properties index 6652c7ad..aa4ec35a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ -ltrVersion = 2.1.0 +ltrVersion = 2.7.0 #opensearchVersion = 2.5.0 -luceneVersion = 9.4.2 +luceneVersion = 9.5.0 ow2Version = 9.4 -antlrVersion=4.9.3 +antlrVersion=4.11.1 From dac6ab402dffdbe23735e9a656b0c92a3823eb0d Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Mon, 4 Sep 2023 15:33:53 -0400 Subject: [PATCH 52/81] yamlRestTest was failing on naming of snapshots so I may have made this too general by subbing the semantic-ish versioning regex with a .*, but the build succeeded... Signed-off-by: Mark Cohen --- src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml b/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml index 52913a2a..ad242c84 100644 --- a/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml +++ b/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml @@ -5,7 +5,7 @@ h: component - match: - $body: /^opensearch-ltr-\d+.\d+.\d+.\d+\n$/ + $body: /^opensearch-ltr-.*\n$/ - do: indices.create: From af9f6766df116d64b911f92719923801fb6f32bb Mon Sep 17 00:00:00 2001 From: Mohammad Hasnain Mohsin Rajan Date: Thu, 28 Sep 2023 00:06:55 +0530 Subject: [PATCH 53/81] fix: revert build.gradle sourceSets changes Signed-off-by: Mohammad Hasnain Mohsin Rajan Signed-off-by: Mark Cohen --- build.gradle | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 4e65e482..5ad29f90 100644 --- a/build.gradle +++ b/build.gradle @@ -149,11 +149,13 @@ run { } sourceSets { - main { - resources { - srcDirs = ["config"] - includes = ["**/*.yml"] - } + javaRestTest { + compileClasspath += sourceSets["main"].output + sourceSets["test"].output + configurations["testRuntimeClasspath"] + runtimeClasspath += output + compileClasspath + } + yamlRestTest { + compileClasspath += sourceSets["main"].output + sourceSets["test"].output + configurations["testRuntimeClasspath"] + runtimeClasspath += output + compileClasspath } } @@ -168,4 +170,4 @@ jacocoTestReport { // TODO: Enable these checks dependencyLicenses.enabled = false thirdPartyAudit.enabled = false -loggerUsageCheck.enabled = false \ No newline at end of file +loggerUsageCheck.enabled = false From 2085050e2efb3a701371d2dbbe75ba01d4cc42cf Mon Sep 17 00:00:00 2001 From: Grant Ingersoll Date: Thu, 15 Sep 2022 13:27:18 -0400 Subject: [PATCH 54/81] Rebased to sign-off on prior commits Get releases working Signed-off-by: Mark Cohen --- .github/workflows/{release-old.yml => release.yml} | 0 README.md | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) rename .github/workflows/{release-old.yml => release.yml} (100%) diff --git a/.github/workflows/release-old.yml b/.github/workflows/release.yml similarity index 100% rename from .github/workflows/release-old.yml rename to .github/workflows/release.yml diff --git a/README.md b/README.md index 907bc8a7..b6f589ff 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ To install, you'd run a command like this but replacing with the appropriate pre | 1.2.3 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.3/ltr-1.5.4-os1.2.3.zip` | | 2.2.1 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/2.2.1/ltr-2.0.0-os2.2.1.zip` | | 2.5.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.1.0/ltr-plugin-v2.1.0.zip` | -| 2.7.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.2.0/ltr-plugin-v2.2.0.zip` +| 2.7.0 | `bin/opensearch-plugin install https://github.com/opensearch-project/opensearch-learning-to-rank-base/releases/download/release-v2.7.0/ltr-plugin-v2.7.0.zip` (It's expected you'll confirm some security exceptions, you can pass `-b` to `opensearch-plugin` to automatically install) @@ -30,8 +30,8 @@ Releases can be found at https://github.com/opensearch-project/opensearch-learni ## Releasing/Packaging -Releases are done through Github Workflows (see `.github/workflows` in the root directory) on an as needed basis. If you do `./gradlew build` as per above under building, -it will build all the artifacts that are in the release. +Releases are done through Github Workflows (see `.github/workflows` in the root directory) on an as needed basis. +If you do `./gradlew build` as per above under building, it will build all the artifacts that are in the release. # Development From e916af588b9813a4a2bba24d164b414c9a666c12 Mon Sep 17 00:00:00 2001 From: Grant Ingersoll Date: Thu, 15 Sep 2022 16:15:35 -0400 Subject: [PATCH 55/81] Docker (#5) * bring in dockerfile * bring in dockerfile * add in docker actions * remove docker branch for push action Signed-off-by: Mark Cohen --- .github/workflows/docker.yml | 4 +--- README.md | 2 +- docker/Dockerfile | 11 ++++------- docker/local.Dockerfile | 8 +++----- 4 files changed, 9 insertions(+), 16 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 88082f53..32070b54 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -21,7 +21,6 @@ jobs: permissions: contents: write steps: - - name: Set up Docker Buildx id: setup-docker-buildx uses: docker/setup-buildx-action@v2 @@ -34,10 +33,9 @@ jobs: uses: docker/build-push-action@v3 with: file: docker/Dockerfile - # TODO: fix this so it isn't hardcoded build-args: | opensearch_version=${{inputs.opensearch-version}} ltrversion=${{inputs.ltrversion}} push: true - tags: gsingers/opensearch-learning-to-rank:${{inputs.ltrversion}} + tags: opensearch-project/opensearch-learning-to-rank:${{inputs.ltrversion}} github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/README.md b/README.md index b6f589ff..2e403011 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ See the [Elasticsearch Learning to Rank](https://elasticsearch-learning-to-rank. Building the docker image is triggered via the Github Actions workflows automatically (for releases) or via the commands below. -Note, we are use Docker ARGs to pass through variables via the --build-arg. All args have defaults +Note, we use Docker ARGs to pass through variables via the --build-arg. All args have defaults ### Using local artifacts diff --git a/docker/Dockerfile b/docker/Dockerfile index 44904dec..366fbcd2 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,9 +1,6 @@ -ARG opensearch_version=2.5.0 +ARG opensearch_version=${opensearch_version} FROM opensearchproject/opensearch:${opensearch_version} -ARG opensearch_version=2.5.0 -ARG ltrversion=2.1.0 -RUN /usr/share/opensearch/bin/opensearch-plugin install -b https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v${ltrversion}/ltr-plugin-v${ltrversion}.zip - - -#https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.0.0rc1/ltr-plugin-v2.0.0rc1.zip \ No newline at end of file +#ARG opensearch_version=2.5.0 +#ARG ltrversion=2.1.0 +RUN /usr/share/opensearch/bin/opensearch-plugin install -b https://github.com/opensearch-project/opensearch-learning-to-rank-base/releases/download/release-v${ltrversion}/ltr-plugin-v${ltrversion}.zip diff --git a/docker/local.Dockerfile b/docker/local.Dockerfile index 0e0c5e21..6eb093a8 100644 --- a/docker/local.Dockerfile +++ b/docker/local.Dockerfile @@ -1,10 +1,8 @@ # Build an image from a local distribution -ARG opensearch_version=2.5.0 -FROM opensearchproject/opensearch:${opensearch_version} -ARG ltrversion=2.1.0 -ARG opensearch_version=2.5.0 -ARG zip_file=ltr-${ltrversion}-os${opensearch_version}.zip +ARG build_version=2.7.0 +FROM opensearchproject/opensearch:${build_version} +ARG zip_file=ltr-${build_version}-os${build_version}.zip ARG plugin_file=/usr/share/opensearch/${zip_file} COPY --chown=opensearch:opensearch build/distributions/${zip_file} ${plugin_file} From 563a3d313a83ceae486cbc4498605b15e9ca5018 Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 16:32:12 -0400 Subject: [PATCH 56/81] fix build-args Signed-off-by: Mark Cohen --- .github/workflows/docker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 32070b54..f7070a08 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -8,11 +8,11 @@ on: opensearch-version: description: 'OpenSearch Version to use' required: true - default: 2.5.0 + default: 2.7.0 ltrversion: description: 'LTR Plugin Version' required: true - default: 2.1.0 + default: 2.7.0 jobs: From ff7ab036da53a57bb4a4c2fd16d96255ba1f566d Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 16:39:40 -0400 Subject: [PATCH 57/81] updated Dockerfile for new versioning Signed-off-by: Mark Cohen --- docker/Dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 366fbcd2..394df0e1 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,6 +1,6 @@ -ARG opensearch_version=${opensearch_version} +ARG build_version=2.7.0 + +FROM opensearchproject/opensearch:${build_version} +RUN /usr/share/opensearch/bin/opensearch-plugin install -b https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/${build_version}/ltr-${build_version}-os${build_version}.zip + -FROM opensearchproject/opensearch:${opensearch_version} -#ARG opensearch_version=2.5.0 -#ARG ltrversion=2.1.0 -RUN /usr/share/opensearch/bin/opensearch-plugin install -b https://github.com/opensearch-project/opensearch-learning-to-rank-base/releases/download/release-v${ltrversion}/ltr-plugin-v${ltrversion}.zip From d9c7d309d6936bcb52affb0022704b5817c7e97f Mon Sep 17 00:00:00 2001 From: gsingers Date: Thu, 15 Sep 2022 16:54:38 -0400 Subject: [PATCH 58/81] would help if we got the version/path right Signed-off-by: Mark Cohen --- docker/Dockerfile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index 394df0e1..1c6bbd6d 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,6 +1,14 @@ ARG build_version=2.7.0 +<<<<<<< HEAD FROM opensearchproject/opensearch:${build_version} RUN /usr/share/opensearch/bin/opensearch-plugin install -b https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/${build_version}/ltr-${build_version}-os${build_version}.zip +======= +FROM opensearchproject/opensearch:${opensearch_version} +ARG opensearch_version=2.2.1 +ARG ltrversion=2.0.0rc1 +RUN /usr/share/opensearch/bin/opensearch-plugin install -b https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v${ltrversion}/ltr-plugin-v${ltrversion}.zip +>>>>>>> 332cade (would help if we got the version/path right) +#https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.0.0rc1/ltr-plugin-v2.0.0rc1.zip \ No newline at end of file From ff513561c2b15230e7535ef5d37880833aa306d8 Mon Sep 17 00:00:00 2001 From: gsingers Date: Mon, 30 Jan 2023 20:28:48 -0500 Subject: [PATCH 59/81] upgrades for 2.5.0: new versions of things, add some docs, upgrade gradlew Signed-off-by: Mark Cohen --- docker/Dockerfile | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 1c6bbd6d..92fc1b7e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,14 +1,4 @@ ARG build_version=2.7.0 -<<<<<<< HEAD FROM opensearchproject/opensearch:${build_version} RUN /usr/share/opensearch/bin/opensearch-plugin install -b https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/${build_version}/ltr-${build_version}-os${build_version}.zip -======= -FROM opensearchproject/opensearch:${opensearch_version} -ARG opensearch_version=2.2.1 -ARG ltrversion=2.0.0rc1 -RUN /usr/share/opensearch/bin/opensearch-plugin install -b https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v${ltrversion}/ltr-plugin-v${ltrversion}.zip ->>>>>>> 332cade (would help if we got the version/path right) - - -#https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.0.0rc1/ltr-plugin-v2.0.0rc1.zip \ No newline at end of file From 6e00d5dd9e25a3b3ae59b8293c5d4698302a60c6 Mon Sep 17 00:00:00 2001 From: gsingers Date: Mon, 30 Jan 2023 21:05:49 -0500 Subject: [PATCH 60/81] update versions, add some more readme Signed-off-by: Mark Cohen --- README.md | 50 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 2e403011..a15db81a 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ To install, you'd run a command like this but replacing with the appropriate pre | 1.2.3 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.3/ltr-1.5.4-os1.2.3.zip` | | 2.2.1 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/2.2.1/ltr-2.0.0-os2.2.1.zip` | | 2.5.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.1.0/ltr-plugin-v2.1.0.zip` | -| 2.7.0 | `bin/opensearch-plugin install https://github.com/opensearch-project/opensearch-learning-to-rank-base/releases/download/release-v2.7.0/ltr-plugin-v2.7.0.zip` + (It's expected you'll confirm some security exceptions, you can pass `-b` to `opensearch-plugin` to automatically install) @@ -26,24 +26,52 @@ If you already are running OpenSearch, don't forget to restart! # Releases -Releases can be found at https://github.com/opensearch-project/opensearch-learning-to-rank-base/releases. +Releases can be found at https://github.com/gsingers/opensearch-learning-to-rank-base/releases. ## Releasing/Packaging -Releases are done through Github Workflows (see `.github/workflows` in the root directory) on an as needed basis. -If you do `./gradlew build` as per above under building, it will build all the artifacts that are in the release. + +Releases are done through Github Workflows (see `.github/workflows` in the root directory) on an as needed basis. If you do `./gradlew build` as per above under building, +it will build all the artifacts that are in the release. + +## About alpha releases + +These releases are alpha because some issues with the tests due to securemock that depends on ElasticSearch security stuff. +And there are 14 failing tests. + +``` +Tests with failures: +- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionDoubleQueryParameter +- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionMissingQueryParameter +- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionIntegerQueryParameter +- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionShortQueryParameter +- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionInvalidQueryParameter +- com.o19s.es.termstat.TermStatQueryBuilderTests.testMustRewrite +- com.o19s.es.termstat.TermStatQueryBuilderTests.testToQuery +- com.o19s.es.termstat.TermStatQueryBuilderTests.testCacheability +- com.o19s.es.ltr.feature.store.StoredFeatureParserTests.testExpressionOptimization +- com.o19s.es.termstat.TermStatQueryTests.testEmptyTerms +- com.o19s.es.termstat.TermStatQueryTests.testUniqueCount +- com.o19s.es.termstat.TermStatQueryTests.testBasicFormula +- com.o19s.es.termstat.TermStatQueryTests.testQuery +- com.o19s.es.termstat.TermStatQueryTests.testMatchCount + +228 tests completed, 14 failed +``` + # Development -To build, you need to explicitly enable Java security and disable snapshot builds (until the YamlRestTests are fixed): +To build, you need to disable the Java security manager -./gradlew -Dopensearch.version={opensearch-version-to-build-on} -Djava.security.manager=allow -Dbuild.snapshot=false +./gradlew -Dtests.security.manager=false clean build # Upgrading the OpenSearch Versions -1. Build and test as above -2. Update this README with the version info in the table above -3. Upgrade the Docker file versions in the `docker` directory +1. Edit `gradle.properties` to have the appropriate versions (it's often easiest to go download the latest tarball from OpenSearch and simply check the versions that ship) and to increment the version of this plugin +2. Build and test as above +3. Update this README with the version info in the table above +4. Upgrade the Docker file versions in the `docker` directory 4. Test the docker image, per below. ## Development Notes @@ -62,7 +90,7 @@ See the [Elasticsearch Learning to Rank](https://elasticsearch-learning-to-rank. Building the docker image is triggered via the Github Actions workflows automatically (for releases) or via the commands below. -Note, we use Docker ARGs to pass through variables via the --build-arg. All args have defaults +Note, we are use Docker ARGs to pass through variables via the --build-arg. All args have defaults ### Using local artifacts @@ -97,3 +125,5 @@ To publish the Docker image to Docker Hub, you need to kick off the Docker actio gh workflow run .github/workflows/docker.yml + + From be71e06439abaa16f8d16b87e7a31cfd4031270c Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Mon, 10 Jul 2023 11:29:02 -0400 Subject: [PATCH 61/81] starting to build against OpenSearch 2.7.0 with several updates in core and a TODO regarding the Strings class Signed-off-by: Mark Cohen --- build.gradle | 41 ++++++++++++----------------------------- gradle.properties | 6 +++--- 2 files changed, 15 insertions(+), 32 deletions(-) diff --git a/build.gradle b/build.gradle index 5ad29f90..11387f23 100644 --- a/build.gradle +++ b/build.gradle @@ -7,11 +7,11 @@ apply plugin: 'opensearch.yaml-rest-test' apply plugin: 'opensearch.pluginzip' apply plugin: 'jacoco' -//group = 'org.opensearch' -group = 'com.o19s.es' +group = 'org.opensearch' + def pluginName = 'ltr' def pluginDescription = 'Make Opensearch results more relevant.' -def projectPath = 'com.o19s.es' +def projectPath = 'org.opensearch' def pathToPlugin = 'ltr' def pluginClassName = 'LtrQueryParserPlugin' @@ -38,7 +38,7 @@ publishing { } } opensearchplugin { - name "opensearch-${pluginName}-${plugin_version}" + name "opensearch-${pluginName}-${plugin_version}.0" description pluginDescription classname "${projectPath}.${pathToPlugin}.${pluginClassName}" licenseFile rootProject.file('LICENSE') @@ -63,8 +63,6 @@ buildscript { } println("opensearch_version ${opensearch_version}") println("plugin_version ${plugin_version}") - - skipIntegTests = System.getProperty("skip.integtests", "false") } repositories { @@ -95,10 +93,6 @@ dependencies { implementation "org.opensearch:common-utils:${plugin_version}" implementation "org.apache.lucene:lucene-expressions:${luceneVersion}" implementation 'com.o19s:RankyMcRankFace:0.1.1' - implementation "org.antlr:antlr4-runtime:${antlrVersion}" - implementation "org.ow2.asm:asm:${ow2Version}" - implementation "org.ow2.asm:asm-commons:${ow2Version}" - implementation "org.ow2.asm:asm-tree:${ow2Version}" } @@ -115,16 +109,11 @@ test { } task integTest(type: RestIntegTestTask) { - description = "Run tests against a cluster" testClassesDirs = sourceSets.test.output.classesDirs classpath = sourceSets.test.runtimeClasspath } -if (!skipIntegTests) { - tasks.named("check").configure { dependsOn(integTest) } -} else { - println("Skipping Integ Tests") -} +tasks.named("check").configure { dependsOn(integTest) } integTest { // The --debug-jvm command-line option makes the cluster debuggable; this makes the tests debuggable @@ -141,21 +130,15 @@ testClusters.integTest { } run { - if (skipIntegTests == "false") { - useCluster testClusters.integTest - } else { - println("skipping Integ Tests ${skipIntegTests}") - } + useCluster testClusters.integTest } sourceSets { - javaRestTest { - compileClasspath += sourceSets["main"].output + sourceSets["test"].output + configurations["testRuntimeClasspath"] - runtimeClasspath += output + compileClasspath - } - yamlRestTest { - compileClasspath += sourceSets["main"].output + sourceSets["test"].output + configurations["testRuntimeClasspath"] - runtimeClasspath += output + compileClasspath + main { + resources { + srcDirs = ["config"] + includes = ["**/*.yml"] + } } } @@ -170,4 +153,4 @@ jacocoTestReport { // TODO: Enable these checks dependencyLicenses.enabled = false thirdPartyAudit.enabled = false -loggerUsageCheck.enabled = false +loggerUsageCheck.enabled = false \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index aa4ec35a..6652c7ad 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ -ltrVersion = 2.7.0 +ltrVersion = 2.1.0 #opensearchVersion = 2.5.0 -luceneVersion = 9.5.0 +luceneVersion = 9.4.2 ow2Version = 9.4 -antlrVersion=4.11.1 +antlrVersion=4.9.3 From 8f1f53a5e8849d878e4ef8bf1b48ab3e92fa2d6e Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Tue, 11 Jul 2023 11:59:40 -0400 Subject: [PATCH 62/81] updated according to changes in OpenSearch core; added integTests and yamlRestTest according to spec. integTests don't work yet so running with the following vars works -Dopensearch.version=2.7.0 -Dskip.integtests=true -Djava.security.manager=allow -Dbuild.snapshot=false buid.snapshot runs the yamlRestTest successfully. -Djava.security.manager=allow allows the deprecated SecurityManager to do it's work also updated StoredFeatureParserTests.writeAsNonFormattedString to require MediaType as per https://github.com/opensearch-project/OpenSearch/commit/f9eb9bfe17b71aae7e2a00ac0337909f1b3e61e7 Signed-off-by: Mark Cohen --- README.md | 53 +++++++++++++------ build.gradle | 27 +++++++--- .../resources/rest-api-spec/test/10_basic.yml | 2 +- 3 files changed, 59 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index a15db81a..1343158e 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ If you already are running OpenSearch, don't forget to restart! # Releases -Releases can be found at https://github.com/gsingers/opensearch-learning-to-rank-base/releases. +Releases can be found at https://github.com/opensearch-project/opensearch-learning-to-rank-base/releases. ## Releasing/Packaging @@ -41,25 +41,24 @@ And there are 14 failing tests. ``` Tests with failures: -- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionDoubleQueryParameter -- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionMissingQueryParameter -- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionIntegerQueryParameter -- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionShortQueryParameter -- com.o19s.es.ltr.feature.store.StoredFeatureSetParserTests.testExpressionInvalidQueryParameter -- com.o19s.es.termstat.TermStatQueryBuilderTests.testMustRewrite -- com.o19s.es.termstat.TermStatQueryBuilderTests.testToQuery -- com.o19s.es.termstat.TermStatQueryBuilderTests.testCacheability -- com.o19s.es.ltr.feature.store.StoredFeatureParserTests.testExpressionOptimization -- com.o19s.es.termstat.TermStatQueryTests.testEmptyTerms -- com.o19s.es.termstat.TermStatQueryTests.testUniqueCount -- com.o19s.es.termstat.TermStatQueryTests.testBasicFormula -- com.o19s.es.termstat.TermStatQueryTests.testQuery -- com.o19s.es.termstat.TermStatQueryTests.testMatchCount +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionDoubleQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionMissingQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionIntegerQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionShortQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionInvalidQueryParameter +- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testMustRewrite +- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testToQuery +- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testCacheability +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureParserTests.testExpressionOptimization +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testEmptyTerms +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testUniqueCount +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testBasicFormula +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testQuery +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testMatchCount 228 tests completed, 14 failed ``` - # Development To build, you need to disable the Java security manager @@ -126,4 +125,26 @@ To publish the Docker image to Docker Hub, you need to kick off the Docker actio gh workflow run .github/workflows/docker.yml +# Integrating into OpenSearch Project +After this repo was moved, we started working on integration with the OpenSearch build system. With the latest updates, running the following will build a 2.7.0 compatible plugin (these changes have not been tested against any other OpenSearch version): +``` +./gradlew -Dopensearch.version=2.7.0 -Dskip.integtests=true -Djava.security.manager=allow -Dbuild.snapshot=false build +``` +skip.integtests: for the build to work inside opensearch-project, integTests must be present, but they can be skipped until we make them better +java.security.manager=allow: because the Java SecurityManager is deprecated, this needs to be passed in to get the following tests passing that were failing previously: +Tests with failures: +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionDoubleQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionMissingQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionIntegerQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionShortQueryParameter +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionInvalidQueryParameter +- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testMustRewrite +- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testToQuery +- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testCacheability +- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureParserTests.testExpressionOptimization +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testEmptyTerms +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testUniqueCount +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testBasicFormula +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testQuery +- termstat.org.opensearch.learning2rank.TermStatQueryTests.testMatchCount diff --git a/build.gradle b/build.gradle index 11387f23..4e65e482 100644 --- a/build.gradle +++ b/build.gradle @@ -7,11 +7,11 @@ apply plugin: 'opensearch.yaml-rest-test' apply plugin: 'opensearch.pluginzip' apply plugin: 'jacoco' -group = 'org.opensearch' - +//group = 'org.opensearch' +group = 'com.o19s.es' def pluginName = 'ltr' def pluginDescription = 'Make Opensearch results more relevant.' -def projectPath = 'org.opensearch' +def projectPath = 'com.o19s.es' def pathToPlugin = 'ltr' def pluginClassName = 'LtrQueryParserPlugin' @@ -38,7 +38,7 @@ publishing { } } opensearchplugin { - name "opensearch-${pluginName}-${plugin_version}.0" + name "opensearch-${pluginName}-${plugin_version}" description pluginDescription classname "${projectPath}.${pathToPlugin}.${pluginClassName}" licenseFile rootProject.file('LICENSE') @@ -63,6 +63,8 @@ buildscript { } println("opensearch_version ${opensearch_version}") println("plugin_version ${plugin_version}") + + skipIntegTests = System.getProperty("skip.integtests", "false") } repositories { @@ -93,6 +95,10 @@ dependencies { implementation "org.opensearch:common-utils:${plugin_version}" implementation "org.apache.lucene:lucene-expressions:${luceneVersion}" implementation 'com.o19s:RankyMcRankFace:0.1.1' + implementation "org.antlr:antlr4-runtime:${antlrVersion}" + implementation "org.ow2.asm:asm:${ow2Version}" + implementation "org.ow2.asm:asm-commons:${ow2Version}" + implementation "org.ow2.asm:asm-tree:${ow2Version}" } @@ -109,11 +115,16 @@ test { } task integTest(type: RestIntegTestTask) { + description = "Run tests against a cluster" testClassesDirs = sourceSets.test.output.classesDirs classpath = sourceSets.test.runtimeClasspath } -tasks.named("check").configure { dependsOn(integTest) } +if (!skipIntegTests) { + tasks.named("check").configure { dependsOn(integTest) } +} else { + println("Skipping Integ Tests") +} integTest { // The --debug-jvm command-line option makes the cluster debuggable; this makes the tests debuggable @@ -130,7 +141,11 @@ testClusters.integTest { } run { - useCluster testClusters.integTest + if (skipIntegTests == "false") { + useCluster testClusters.integTest + } else { + println("skipping Integ Tests ${skipIntegTests}") + } } sourceSets { diff --git a/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml b/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml index ad242c84..52913a2a 100644 --- a/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml +++ b/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml @@ -5,7 +5,7 @@ h: component - match: - $body: /^opensearch-ltr-.*\n$/ + $body: /^opensearch-ltr-\d+.\d+.\d+.\d+\n$/ - do: indices.create: From ef5bf719abe0d78a64612147e329775d1e6fddb1 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Tue, 11 Jul 2023 13:50:06 -0400 Subject: [PATCH 63/81] new ci build for opensearch Signed-off-by: Mark Cohen --- .github/workflows/ci.yml | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5559a691..53612bcb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,4 @@ name: Build & Test Learning to Rank Plugin - on: schedule: - cron: '0 0 * * *' # every night @@ -11,14 +10,13 @@ on: branches: - "*" - "feature/**" - workflow_dispatch: jobs: Build-ltr-plugin: strategy: matrix: java: [11, 17] - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest, macos-latest, windows-latest] name: Build and Test Learning to Rank Plugin runs-on: ${{ matrix.os }} @@ -32,25 +30,18 @@ jobs: with: java-version: ${{ matrix.java }} - - name: Run non-Windows - if: ${{ matrix.os != 'windows-latest' }} + - name: Run build Windows + if: ${{ matrix.os == 'windows-latest' }} run: | - ./gradlew build -Dopensearch.version=2.7.0 -Dskip.integtests=true \ - -Djava.security.manager=allow -Dbuild.snapshot=false + ./gradlew.bat build -# - name: Upload Coverage Report -# if: ${{matrix.os}} == 'ubuntu' -# uses: codecov/codecov-action@v1 -# with: -# token: ${{ secrets.CODECOV_TOKEN }} - - - name: Create Artifact Path + - name: Run non-Windows + if: ${{ matrix.os != 'windows-latest' }} run: | - mkdir -p opensearch-ltr-builds - cp -r ./build/distributions/*.zip opensearch-ltr-builds + ./gradlew build - - name: Upload Artifacts - uses: actions/upload-artifact@v1 + - name: Upload Coverage Report + if: ${{matrix.os}} == 'ubuntu' + uses: codecov/codecov-action@v1 with: - name: opensearch-ltr-${{ matrix.os }} - path: opensearch-ltr-builds + token: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file From d8bf0269b1af8085cd6c87679ed720b627e3c44b Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Tue, 11 Jul 2023 16:31:16 -0400 Subject: [PATCH 64/81] removed windows build and added workflow_dispatch Signed-off-by: Mark Cohen --- .github/workflows/ci.yml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 53612bcb..41741371 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,13 +10,15 @@ on: branches: - "*" - "feature/**" + workflow_dispatch: + jobs: Build-ltr-plugin: strategy: matrix: java: [11, 17] - os: [ubuntu-latest, macos-latest, windows-latest] + os: [ubuntu-latest, macos-latest] name: Build and Test Learning to Rank Plugin runs-on: ${{ matrix.os }} @@ -30,15 +32,10 @@ jobs: with: java-version: ${{ matrix.java }} - - name: Run build Windows - if: ${{ matrix.os == 'windows-latest' }} - run: | - ./gradlew.bat build - - name: Run non-Windows if: ${{ matrix.os != 'windows-latest' }} run: | - ./gradlew build + ./gradlew build -Dopensearch.version=2.7.0 -Dskip.integtests=true -Djava.security.manager=allow -Dbuild.snapshot=false - name: Upload Coverage Report if: ${{matrix.os}} == 'ubuntu' From b63184847fae4fc7755b754e17b12797ad57a9fd Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Tue, 11 Jul 2023 16:38:33 -0400 Subject: [PATCH 65/81] removed windows build and added workflow_dispatch Signed-off-by: Mark Cohen --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 41741371..b2bb16e0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,6 @@ on: - "feature/**" workflow_dispatch: - jobs: Build-ltr-plugin: strategy: @@ -35,10 +34,11 @@ jobs: - name: Run non-Windows if: ${{ matrix.os != 'windows-latest' }} run: | - ./gradlew build -Dopensearch.version=2.7.0 -Dskip.integtests=true -Djava.security.manager=allow -Dbuild.snapshot=false + ./gradlew build -Dopensearch.version=2.7.0 -Dskip.integtests=true \ + -Djava.security.manager=allow -Dbuild.snapshot=false - name: Upload Coverage Report if: ${{matrix.os}} == 'ubuntu' uses: codecov/codecov-action@v1 with: - token: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file + token: ${{ secrets.CODECOV_TOKEN }} From e6ece093d2227670fcf5c0e516e1c3ae7f46b33d Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Wed, 12 Jul 2023 14:31:12 -0400 Subject: [PATCH 66/81] updated CI to upload build artifacts Signed-off-by: Mark Cohen --- .github/workflows/ci.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b2bb16e0..a393cc32 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,5 @@ name: Build & Test Learning to Rank Plugin + on: schedule: - cron: '0 0 * * *' # every night @@ -42,3 +43,14 @@ jobs: uses: codecov/codecov-action@v1 with: token: ${{ secrets.CODECOV_TOKEN }} + + - name: Create Artifact Path + run: | + mkdir -p opensearch-ltr-builds + cp -r ./build/distributions/*.zip opensearch-ltr-builds + + - name: Upload Artifacts + uses: actions/upload-artifact@v1 + with: + name: opensearch-ltr-${{ matrix.os }} + path: opensearch-ltr-builds From 7e1feaece1ea8c0e971a7457994dea2f3dc7f7bb Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Fri, 14 Jul 2023 12:40:59 -0400 Subject: [PATCH 67/81] commented codecov in ci.yml for now Signed-off-by: Mark Cohen --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a393cc32..5559a691 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,11 +38,11 @@ jobs: ./gradlew build -Dopensearch.version=2.7.0 -Dskip.integtests=true \ -Djava.security.manager=allow -Dbuild.snapshot=false - - name: Upload Coverage Report - if: ${{matrix.os}} == 'ubuntu' - uses: codecov/codecov-action@v1 - with: - token: ${{ secrets.CODECOV_TOKEN }} +# - name: Upload Coverage Report +# if: ${{matrix.os}} == 'ubuntu' +# uses: codecov/codecov-action@v1 +# with: +# token: ${{ secrets.CODECOV_TOKEN }} - name: Create Artifact Path run: | From d32ed8ca3028cdb1216c8d0f8849d1d2c2584666 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Sun, 16 Jul 2023 16:46:02 -0400 Subject: [PATCH 68/81] added 'github.ref ' as a branch to trigger when a tag is pushed Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index da715058..76c70f66 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,8 +6,8 @@ name: Tag and publish a release on: push: tags: - - "v*.*.*" - branches: [ "${{ github.ref }}", 'test-release' ] + - 'v*.*.*' + branches: [ ${{ github.ref }}, test-release ] jobs: release: @@ -15,8 +15,8 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v2 - - name: Set release version Name + - uses: actions/checkout@v2 + - name: Set release version Name run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - name: Set up JDK 17.0 uses: actions/setup-java@v1 @@ -25,7 +25,7 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle - run: ./gradlew -Dskip.integtests=true -Djava.security.manager=allow -Dbuild.snapshot=false + run: ./gradlew -Dtests.security.manager=false build - name: Rename build assets run: mv ./build/distributions/ltr-*.zip ./ltr-plugin-${{ env.RELEASE_VERSION }}.zip - name: Create Release From c8c6c3da28e5e473efa5823d7fd0d208a0ff9833 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Sun, 16 Jul 2023 16:48:37 -0400 Subject: [PATCH 69/81] updated gradle command to be consistent with updates in build.gradle Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 76c70f66..c677c450 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,7 +25,7 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle - run: ./gradlew -Dtests.security.manager=false build + run: ./gradlew -Dskip.integtests=true -Djava.security.manager=allow -Dbuild.snapshot=false - name: Rename build assets run: mv ./build/distributions/ltr-*.zip ./ltr-plugin-${{ env.RELEASE_VERSION }}.zip - name: Create Release From 002d733216f53de05cc7219fb86bfba6f8f37a88 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Sun, 16 Jul 2023 16:54:53 -0400 Subject: [PATCH 70/81] removed test-release branch Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c677c450..81dde3e2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,7 +7,7 @@ on: push: tags: - 'v*.*.*' - branches: [ ${{ github.ref }}, test-release ] + branches: [ ${{ github.ref }} ] jobs: release: From f9d372a7c2988ff2d8466b91c55580c1431bb386 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Sun, 16 Jul 2023 17:01:24 -0400 Subject: [PATCH 71/81] removed space from line 9 in release.yml Signed-off-by: Mark Cohen --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 81dde3e2..54e1e74e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,7 +6,7 @@ name: Tag and publish a release on: push: tags: - - 'v*.*.*' + - 'v*.*.*' branches: [ ${{ github.ref }} ] jobs: From 737b9d697739967f2d1f8b6397ac709832057c73 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Fri, 4 Aug 2023 18:19:08 -0400 Subject: [PATCH 72/81] updated README.md with 2.7.0 build info; removed KNOWN_ISSUES.md; set opensearch version on command line instead of in gradle.properties Signed-off-by: Mark Cohen --- .../{release.yml => release-old.yml} | 8 +-- README.md | 63 ++----------------- gradle.properties | 6 +- 3 files changed, 13 insertions(+), 64 deletions(-) rename .github/workflows/{release.yml => release-old.yml} (91%) diff --git a/.github/workflows/release.yml b/.github/workflows/release-old.yml similarity index 91% rename from .github/workflows/release.yml rename to .github/workflows/release-old.yml index 54e1e74e..da715058 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release-old.yml @@ -6,8 +6,8 @@ name: Tag and publish a release on: push: tags: - - 'v*.*.*' - branches: [ ${{ github.ref }} ] + - "v*.*.*" + branches: [ "${{ github.ref }}", 'test-release' ] jobs: release: @@ -15,8 +15,8 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v2 - - name: Set release version Name + - uses: actions/checkout@v2 + - name: Set release version Name run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - name: Set up JDK 17.0 uses: actions/setup-java@v1 diff --git a/README.md b/README.md index 1343158e..907bc8a7 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ To install, you'd run a command like this but replacing with the appropriate pre | 1.2.3 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.3/ltr-1.5.4-os1.2.3.zip` | | 2.2.1 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/2.2.1/ltr-2.0.0-os2.2.1.zip` | | 2.5.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.1.0/ltr-plugin-v2.1.0.zip` | - +| 2.7.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.2.0/ltr-plugin-v2.2.0.zip` (It's expected you'll confirm some security exceptions, you can pass `-b` to `opensearch-plugin` to automatically install) @@ -30,47 +30,20 @@ Releases can be found at https://github.com/opensearch-project/opensearch-learni ## Releasing/Packaging - Releases are done through Github Workflows (see `.github/workflows` in the root directory) on an as needed basis. If you do `./gradlew build` as per above under building, it will build all the artifacts that are in the release. -## About alpha releases - -These releases are alpha because some issues with the tests due to securemock that depends on ElasticSearch security stuff. -And there are 14 failing tests. - -``` -Tests with failures: -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionDoubleQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionMissingQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionIntegerQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionShortQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionInvalidQueryParameter -- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testMustRewrite -- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testToQuery -- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testCacheability -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureParserTests.testExpressionOptimization -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testEmptyTerms -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testUniqueCount -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testBasicFormula -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testQuery -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testMatchCount - -228 tests completed, 14 failed -``` - # Development -To build, you need to disable the Java security manager +To build, you need to explicitly enable Java security and disable snapshot builds (until the YamlRestTests are fixed): -./gradlew -Dtests.security.manager=false clean build +./gradlew -Dopensearch.version={opensearch-version-to-build-on} -Djava.security.manager=allow -Dbuild.snapshot=false # Upgrading the OpenSearch Versions -1. Edit `gradle.properties` to have the appropriate versions (it's often easiest to go download the latest tarball from OpenSearch and simply check the versions that ship) and to increment the version of this plugin -2. Build and test as above -3. Update this README with the version info in the table above -4. Upgrade the Docker file versions in the `docker` directory +1. Build and test as above +2. Update this README with the version info in the table above +3. Upgrade the Docker file versions in the `docker` directory 4. Test the docker image, per below. ## Development Notes @@ -124,27 +97,3 @@ To publish the Docker image to Docker Hub, you need to kick off the Docker actio gh workflow run .github/workflows/docker.yml - -# Integrating into OpenSearch Project -After this repo was moved, we started working on integration with the OpenSearch build system. With the latest updates, running the following will build a 2.7.0 compatible plugin (these changes have not been tested against any other OpenSearch version): -``` -./gradlew -Dopensearch.version=2.7.0 -Dskip.integtests=true -Djava.security.manager=allow -Dbuild.snapshot=false build -``` -skip.integtests: for the build to work inside opensearch-project, integTests must be present, but they can be skipped until we make them better -java.security.manager=allow: because the Java SecurityManager is deprecated, this needs to be passed in to get the following tests passing that were failing previously: -Tests with failures: -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionDoubleQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionMissingQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionIntegerQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionShortQueryParameter -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureSetParserTests.testExpressionInvalidQueryParameter -- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testMustRewrite -- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testToQuery -- termstat.org.opensearch.learning2rank.TermStatQueryBuilderTests.testCacheability -- store.feature.ltr.org.opensearch.learning2rank.StoredFeatureParserTests.testExpressionOptimization -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testEmptyTerms -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testUniqueCount -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testBasicFormula -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testQuery -- termstat.org.opensearch.learning2rank.TermStatQueryTests.testMatchCount - diff --git a/gradle.properties b/gradle.properties index 6652c7ad..aa4ec35a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ -ltrVersion = 2.1.0 +ltrVersion = 2.7.0 #opensearchVersion = 2.5.0 -luceneVersion = 9.4.2 +luceneVersion = 9.5.0 ow2Version = 9.4 -antlrVersion=4.9.3 +antlrVersion=4.11.1 From dce0060bfc531b5ad27c3263fadc2f44500724a2 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Mon, 4 Sep 2023 15:33:53 -0400 Subject: [PATCH 73/81] yamlRestTest was failing on naming of snapshots so I may have made this too general by subbing the semantic-ish versioning regex with a .*, but the build succeeded... Signed-off-by: Mark Cohen --- src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml b/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml index 52913a2a..ad242c84 100644 --- a/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml +++ b/src/yamlRestTest/resources/rest-api-spec/test/10_basic.yml @@ -5,7 +5,7 @@ h: component - match: - $body: /^opensearch-ltr-\d+.\d+.\d+.\d+\n$/ + $body: /^opensearch-ltr-.*\n$/ - do: indices.create: From 2723216600f773abf07f19654ceaf341f7ea37c8 Mon Sep 17 00:00:00 2001 From: Mohammad Hasnain Mohsin Rajan Date: Thu, 28 Sep 2023 00:06:55 +0530 Subject: [PATCH 74/81] fix: revert build.gradle sourceSets changes Signed-off-by: Mohammad Hasnain Mohsin Rajan Signed-off-by: Mark Cohen --- build.gradle | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 4e65e482..5ad29f90 100644 --- a/build.gradle +++ b/build.gradle @@ -149,11 +149,13 @@ run { } sourceSets { - main { - resources { - srcDirs = ["config"] - includes = ["**/*.yml"] - } + javaRestTest { + compileClasspath += sourceSets["main"].output + sourceSets["test"].output + configurations["testRuntimeClasspath"] + runtimeClasspath += output + compileClasspath + } + yamlRestTest { + compileClasspath += sourceSets["main"].output + sourceSets["test"].output + configurations["testRuntimeClasspath"] + runtimeClasspath += output + compileClasspath } } @@ -168,4 +170,4 @@ jacocoTestReport { // TODO: Enable these checks dependencyLicenses.enabled = false thirdPartyAudit.enabled = false -loggerUsageCheck.enabled = false \ No newline at end of file +loggerUsageCheck.enabled = false From 9060f68a2109021a6f0c9f73918db0b317b5292a Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Tue, 11 Jul 2023 14:24:51 -0400 Subject: [PATCH 75/81] any new issues should have an 'untriaged' label added by default to call out that we need to read it to ensure it's at least not a security issue Signed-off-by: Mark Cohen --- .github/workflows/add-untriaged-label.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/add-untriaged-label.yml diff --git a/.github/workflows/add-untriaged-label.yml b/.github/workflows/add-untriaged-label.yml new file mode 100644 index 00000000..bfff875b --- /dev/null +++ b/.github/workflows/add-untriaged-label.yml @@ -0,0 +1,19 @@ +name: Apply 'untriaged' label during issue lifecycle + +on: + issues: + types: [opened, transferred] + +jobs: + apply-label: + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v6 + with: + script: | + github.rest.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['untriaged'] + }) \ No newline at end of file From 851bb3aa8db358021c0ef29d822495797e0aa15a Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Sun, 12 Nov 2023 16:31:49 -0500 Subject: [PATCH 76/81] cleaning up release-old.yml Signed-off-by: Mark Cohen --- .github/workflows/release-old.yml | 47 ------------------------------- 1 file changed, 47 deletions(-) delete mode 100644 .github/workflows/release-old.yml diff --git a/.github/workflows/release-old.yml b/.github/workflows/release-old.yml deleted file mode 100644 index da715058..00000000 --- a/.github/workflows/release-old.yml +++ /dev/null @@ -1,47 +0,0 @@ -# This workflow will build a Java project with Gradle -# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle - -name: Tag and publish a release - -on: - push: - tags: - - "v*.*.*" - branches: [ "${{ github.ref }}", 'test-release' ] - -jobs: - release: - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - uses: actions/checkout@v2 - - name: Set release version Name - run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - - name: Set up JDK 17.0 - uses: actions/setup-java@v1 - with: - java-version: 17.0 - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Build with Gradle - run: ./gradlew -Dskip.integtests=true -Djava.security.manager=allow -Dbuild.snapshot=false - - name: Rename build assets - run: mv ./build/distributions/ltr-*.zip ./ltr-plugin-${{ env.RELEASE_VERSION }}.zip - - name: Create Release - id: create_release - uses: ncipollo/release-action@v1 - with: - artifacts: "./ltr-plugin-${{ env.RELEASE_VERSION }}.zip" - token: ${{ secrets.GITHUB_TOKEN }} - tag: "release-${{ env.RELEASE_VERSION }}" - - name: Upload Release Asset - id: upload-release-asset - uses: softprops/action-gh-release@v1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - tag_name: "release-${{ env.RELEASE_VERSION }}" - #upload_url: ${{ steps.create_release.outputs.upload_url }} - files: ./ltr-plugin-${{ env.RELEASE_VERSION }}.zip - name: ${{ env.RELEASE_VERSION }} - From bba773f2569ebd441a42589df715a19d2954ea3c Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Mon, 13 Nov 2023 08:51:51 -0500 Subject: [PATCH 77/81] updated the 2.7.0 compatible plugin release and noted that publish to docker hub doesn't work right now Signed-off-by: Mark Cohen --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 907bc8a7..9a217e8a 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ To install, you'd run a command like this but replacing with the appropriate pre | 1.2.3 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.3/ltr-1.5.4-os1.2.3.zip` | | 2.2.1 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/2.2.1/ltr-2.0.0-os2.2.1.zip` | | 2.5.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.1.0/ltr-plugin-v2.1.0.zip` | -| 2.7.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.2.0/ltr-plugin-v2.2.0.zip` +| 2.7.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.7.0/opensearch-ltr-v2.7.0.zip` (It's expected you'll confirm some security exceptions, you can pass `-b` to `opensearch-plugin` to automatically install) From 32a343ea0f3cc9b097e87995536b9b87a5430f78 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Mon, 13 Nov 2023 09:10:24 -0500 Subject: [PATCH 78/81] updated README.md; build.gradle runs integtests now; updated LearningToRankPluginIT.java to look for 'ltr' in the response Signed-off-by: Mark Cohen --- README.md | 19 ++++++++++--------- build.gradle | 2 +- .../o19s/es/ltr/LearningToRankPluginIT.java | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 9a217e8a..525e34b6 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,3 @@ -# Important Notice - -This is a fork of https://github.com/o19s/elasticsearch-learning-to-rank to work with OpenSearch. It's a rewrite of some parts to be able to work with OpenSearch. Please refer to official documentation of [Elasticsearch Learning to Rank](http://elasticsearch-learning-to-rank.readthedocs.io) for usage. - -The OpenSearch Learning to Rank plugin uses machine learning to improve search relevance ranking. The original Elasticsearch LTR plugin powers search at places like Wikimedia Foundation and Snagajob. - - # Installing To install, you'd run a command like this but replacing with the appropriate prebuilt version zip: @@ -18,12 +11,19 @@ To install, you'd run a command like this but replacing with the appropriate pre | 1.2.3 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/1.2.3/ltr-1.5.4-os1.2.3.zip` | | 2.2.1 | `bin/opensearch-plugin install https://github.com/aparo/opensearch-learning-to-rank/releases/download/2.2.1/ltr-2.0.0-os2.2.1.zip` | | 2.5.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.1.0/ltr-plugin-v2.1.0.zip` | -| 2.7.0 | `bin/opensearch-plugin install https://github.com/gsingers/opensearch-learning-to-rank-base/releases/download/release-v2.7.0/opensearch-ltr-v2.7.0.zip` +| 2.7.0 | `bin/opensearch-plugin install https://github.com/opensearch-project/opensearch-learning-to-rank-base/releases/download/release-v2.7.0/opensearch-ltr-v2.7.0.zip` (It's expected you'll confirm some security exceptions, you can pass `-b` to `opensearch-plugin` to automatically install) If you already are running OpenSearch, don't forget to restart! +# Important Notice + +This is a fork of https://github.com/o19s/elasticsearch-learning-to-rank to work with OpenSearch. It's a rewrite of some parts to be able to work with OpenSearch. Please refer to official documentation of [Elasticsearch Learning to Rank](http://elasticsearch-learning-to-rank.readthedocs.io) for usage. + +The OpenSearch Learning to Rank plugin uses machine learning to improve search relevance ranking. The original Elasticsearch LTR plugin powers search at places like Wikimedia Foundation and Snagajob. + + # Releases Releases can be found at https://github.com/opensearch-project/opensearch-learning-to-rank-base/releases. @@ -92,7 +92,8 @@ See the OpenSearch docs for official instructions, but this should work: ## Publishing the Docker Image - + +### Note: Since moving this into opensearch-project, this doesn't work. TODO: investigate the standard way of pushing plugins to Docker Hub. To publish the Docker image to Docker Hub, you need to kick off the Docker action workflow: gh workflow run .github/workflows/docker.yml diff --git a/build.gradle b/build.gradle index 5ad29f90..0246c7bc 100644 --- a/build.gradle +++ b/build.gradle @@ -120,7 +120,7 @@ task integTest(type: RestIntegTestTask) { testClassesDirs = sourceSets.test.output.classesDirs classpath = sourceSets.test.runtimeClasspath } -if (!skipIntegTests) { +if (skipIntegTests == "false") { tasks.named("check").configure { dependsOn(integTest) } } else { println("Skipping Integ Tests") diff --git a/src/test/java/com/o19s/es/ltr/LearningToRankPluginIT.java b/src/test/java/com/o19s/es/ltr/LearningToRankPluginIT.java index 417593de..23ccc526 100644 --- a/src/test/java/com/o19s/es/ltr/LearningToRankPluginIT.java +++ b/src/test/java/com/o19s/es/ltr/LearningToRankPluginIT.java @@ -21,6 +21,6 @@ public void testPluginInstalled() throws IOException, ParseException { logger.info("response body: {}", body); assertNotNull(body); - assertTrue(body.contains("search-processor")); + assertTrue(body.contains("ltr")); } } From 776bfb5dbc8bbbdff725da4910fb8a23ec121d42 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Mon, 13 Nov 2023 09:20:41 -0500 Subject: [PATCH 79/81] updated GH workflow to not skip integ tests Signed-off-by: Mark Cohen --- .github/workflows/ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5559a691..28dd7398 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,8 +35,7 @@ jobs: - name: Run non-Windows if: ${{ matrix.os != 'windows-latest' }} run: | - ./gradlew build -Dopensearch.version=2.7.0 -Dskip.integtests=true \ - -Djava.security.manager=allow -Dbuild.snapshot=false + ./gradlew build -Dopensearch.version=2.7.0 -Djava.security.manager=allow -Dbuild.snapshot=false # - name: Upload Coverage Report # if: ${{matrix.os}} == 'ubuntu' From a6c9cbebe851c7ab56a4036666e195a81cb43a99 Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Sun, 14 Jan 2024 18:12:31 -0500 Subject: [PATCH 80/81] updated build scripts for 2.7.0; ltr version matches OpenSearch version Signed-off-by: Mark Cohen --- .github/workflows/ci.yml | 2 +- .github/workflows/test.yml | 4 ++-- gradle.properties | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 28dd7398..6f720d85 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,7 +35,7 @@ jobs: - name: Run non-Windows if: ${{ matrix.os != 'windows-latest' }} run: | - ./gradlew build -Dopensearch.version=2.7.0 -Djava.security.manager=allow -Dbuild.snapshot=false + ./gradlew -Dopensearch.version=2.7.0 -Djava.security.manager=allow -Dbuild.snapshot=false -Dtests.security.manager=false clean build test # - name: Upload Coverage Report # if: ${{matrix.os}} == 'ubuntu' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fc2a094f..fce79245 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,9 +5,9 @@ name: Run CI tests with Gradle on: push: - branches: [ main ] + branches: [main] pull_request: - branches: [ main ] + branches: [main] jobs: test: diff --git a/gradle.properties b/gradle.properties index aa4ec35a..0985b5ff 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ ltrVersion = 2.7.0 -#opensearchVersion = 2.5.0 +opensearchVersion = 2.7.0 luceneVersion = 9.5.0 ow2Version = 9.4 antlrVersion=4.11.1 From 6d4d10b575109ad5e16d9365443f48115e188d4f Mon Sep 17 00:00:00 2001 From: Mark Cohen Date: Sun, 14 Jan 2024 19:31:07 -0500 Subject: [PATCH 81/81] running build for all PRs in GH actions Signed-off-by: Mark Cohen --- .github/workflows/ci.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6f720d85..4b07d8a9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,17 +4,11 @@ on: schedule: - cron: '0 0 * * *' # every night push: - branches: - - "*" - - "feature/**" pull_request: - branches: - - "*" - - "feature/**" workflow_dispatch: jobs: - Build-ltr-plugin: + build-ltr-plugin: strategy: matrix: java: [11, 17]