diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/NeedsScore.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/NeedsScore.java index 055229ca10b..180b8c9d8e2 100644 --- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/NeedsScore.java +++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/NeedsScore.java @@ -1,3 +1,21 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you 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 org.elasticsearch.painless; /** Marker interface that a generated {@link Executable} uses the {@code _score} value */ diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/PainlessScriptEngineService.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/PainlessScriptEngineService.java index 7be3f9832be..6f3eb4cfbab 100644 --- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/PainlessScriptEngineService.java +++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/PainlessScriptEngineService.java @@ -215,11 +215,10 @@ public class PainlessScriptEngineService extends AbstractComponent implements Sc /** * Whether or not the score is needed. - * @return Always true as it's assumed score is needed. */ @Override public boolean needsScores() { - return true; + return compiledScript.compiled() instanceof NeedsScore; } }; } diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/Writer.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/Writer.java index 4e96a71019e..36cfb91ac4d 100644 --- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/Writer.java +++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/Writer.java @@ -138,9 +138,9 @@ class Writer extends PainlessParserBaseVisitor { // apply marker interface NeedsScore if we use the score! final String interfaces[]; if (metadata.scoreValueUsed) { - interfaces = new String[] { WriterConstants.NEEDS_SCORE_TYPE.getInternalName() }; + interfaces = new String[] { WriterConstants.NEEDS_SCORE_TYPE.getInternalName() }; } else { - interfaces = null; + interfaces = null; } writer.visit(version, access, name, null, base, interfaces); writer.visitSource(source, null); diff --git a/modules/lang-painless/src/test/java/org/elasticsearch/painless/NeedsScoreTests.java b/modules/lang-painless/src/test/java/org/elasticsearch/painless/NeedsScoreTests.java new file mode 100644 index 00000000000..561e9202c1e --- /dev/null +++ b/modules/lang-painless/src/test/java/org/elasticsearch/painless/NeedsScoreTests.java @@ -0,0 +1,61 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you 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 org.elasticsearch.painless; + +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.index.IndexService; +import org.elasticsearch.script.CompiledScript; +import org.elasticsearch.script.ScriptService.ScriptType; +import org.elasticsearch.script.SearchScript; +import org.elasticsearch.search.lookup.SearchLookup; +import org.elasticsearch.test.ESSingleNodeTestCase; + +import java.util.Collections; + +/** + * Test that needsScores() is reported correctly depending on whether _score is used + */ +// TODO: can we test this better? this is a port of the ExpressionsTests method. +public class NeedsScoreTests extends ESSingleNodeTestCase { + + public void testNeedsScores() { + IndexService index = createIndex("test", Settings.EMPTY, "type", "d", "type=double"); + + PainlessScriptEngineService service = new PainlessScriptEngineService(Settings.EMPTY); + SearchLookup lookup = new SearchLookup(index.mapperService(), index.fieldData(), null); + + Object compiled = service.compile("1.2", Collections.emptyMap()); + SearchScript ss = service.search(new CompiledScript(ScriptType.INLINE, "randomName", "painless", compiled), lookup, Collections.emptyMap()); + assertFalse(ss.needsScores()); + + compiled = service.compile("input.doc['d'].value", Collections.emptyMap()); + ss = service.search(new CompiledScript(ScriptType.INLINE, "randomName", "painless", compiled), lookup, Collections.emptyMap()); + assertFalse(ss.needsScores()); + + compiled = service.compile("1/_score", Collections.emptyMap()); + ss = service.search(new CompiledScript(ScriptType.INLINE, "randomName", "painless", compiled), lookup, Collections.emptyMap()); + assertTrue(ss.needsScores()); + + compiled = service.compile("input.doc['d'].value * _score", Collections.emptyMap()); + ss = service.search(new CompiledScript(ScriptType.INLINE, "randomName", "painless", compiled), lookup, Collections.emptyMap()); + assertTrue(ss.needsScores()); + } + +}