From faf2380605e5a5586e6f29ae395bfc4e58900685 Mon Sep 17 00:00:00 2001 From: Britta Weber Date: Fri, 15 Nov 2013 11:50:48 +0100 Subject: [PATCH] Allow native scripts to set the value of a script field to primitive arrays Script fields could not be set to int[] and float[] by native scripts because StreamInput and StreamOutput could not handle them. closes #4175 --- .../common/io/stream/StreamInput.java | 44 +++++ .../common/io/stream/StreamOutput.java | 40 +++++ .../common/io/streams/BytesStreamsTests.java | 14 +- .../script/ScriptFieldTests.java | 152 ++++++++++++++++++ 4 files changed, 248 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/elasticsearch/script/ScriptFieldTests.java diff --git a/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java b/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java index d587006e1d1..8e1007883a0 100644 --- a/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java +++ b/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java @@ -433,11 +433,55 @@ public abstract class StreamInput extends InputStream { return readText(); case 16: return readShort(); + case 17: + return readPrimitiveIntArray(); + case 18: + return readPrimitiveLongArray(); + case 19: + return readPrimitiveFloatArray(); + case 20: + return readPrimitiveDoubleArray(); default: throw new IOException("Can't read unknown type [" + type + "]"); } } + private Object readPrimitiveIntArray() throws IOException { + int length = readVInt(); + int[] values = new int[length]; + for(int i=0; i params) { + return new IntScript(); + } + } + + static class IntScript extends AbstractSearchScript { + @Override + public Object run() { + return intArray; + } + } + + static class LongArrayScriptFactory implements NativeScriptFactory { + @Override + public ExecutableScript newScript(@Nullable Map params) { + return new LongScript(); + } + } + + static class LongScript extends AbstractSearchScript { + @Override + public Object run() { + return longArray; + } + } + + static class FloatArrayScriptFactory implements NativeScriptFactory { + @Override + public ExecutableScript newScript(@Nullable Map params) { + return new FloatScript(); + } + } + + static class FloatScript extends AbstractSearchScript { + @Override + public Object run() { + return floatArray; + } + } + + static class DoubleArrayScriptFactory implements NativeScriptFactory { + @Override + public ExecutableScript newScript(@Nullable Map params) { + return new DoubleScript(); + } + } + + static class DoubleScript extends AbstractSearchScript { + @Override + public Object run() { + return doubleArray; + } + } + + public static class CustomScriptPlugin extends AbstractPlugin { + + @Override + public String name() { + return "custom_script"; + } + + @Override + public String description() { + return "script "; + } + + public void onModule(ScriptModule scriptModule) { + scriptModule.registerScript("int", IntArrayScriptFactory.class); + scriptModule.registerScript("long", LongArrayScriptFactory.class); + scriptModule.registerScript("float", FloatArrayScriptFactory.class); + scriptModule.registerScript("double", DoubleArrayScriptFactory.class); + } + + } +}