From 7dbab75cf5b65b829c290ec674a9a2a4ca54ce5b Mon Sep 17 00:00:00 2001 From: Artur Konczak Date: Thu, 31 Dec 2015 02:04:44 +0000 Subject: [PATCH] DATAES-50 - Enabled support for scripts for node client, added missing groovy lib --- pom.xml | 7 ++++ .../client/NodeClientFactoryBean.java | 25 ++++++++++++- .../NodeClientBeanDefinitionParser.java | 1 + .../core/ElasticsearchTemplate.java | 16 ++++----- .../elasticsearch/core/query/ScriptField.java | 36 +++++++++---------- .../config/spring-elasticsearch-1.0.xsd | 7 ++++ .../elasticsearch/entities/SampleEntity.java | 3 ++ src/test/resources/infrastructure.xml | 4 ++- .../resources/node-client-configuration.yml | 3 ++ 9 files changed, 73 insertions(+), 29 deletions(-) create mode 100644 src/test/resources/node-client-configuration.yml diff --git a/pom.xml b/pom.xml index ce471a584..5950d5a98 100644 --- a/pom.xml +++ b/pom.xml @@ -128,6 +128,13 @@ test + + org.codehaus.groovy + groovy-all + 2.3.5 + test + + diff --git a/src/main/java/org/springframework/data/elasticsearch/client/NodeClientFactoryBean.java b/src/main/java/org/springframework/data/elasticsearch/client/NodeClientFactoryBean.java index 6b6bd00fd..73d131631 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/NodeClientFactoryBean.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/NodeClientFactoryBean.java @@ -17,14 +17,21 @@ package org.springframework.data.elasticsearch.client; import static org.elasticsearch.node.NodeBuilder.*; +import java.io.IOException; + +import org.apache.commons.lang.StringUtils; +import org.apache.lucene.util.IOUtils; import org.elasticsearch.client.Client; import org.elasticsearch.client.node.NodeClient; +import org.elasticsearch.common.io.stream.InputStreamStreamInput; import org.elasticsearch.common.settings.ImmutableSettings; +import org.elasticsearch.common.settings.Settings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; +import org.springframework.core.io.ClassPathResource; /** * NodeClientFactoryBean @@ -41,6 +48,7 @@ public class NodeClientFactoryBean implements FactoryBean, Initializ private String clusterName; private NodeClient nodeClient; private String pathData; + private String pathConfiguration; NodeClientFactoryBean() { } @@ -67,14 +75,25 @@ public class NodeClientFactoryBean implements FactoryBean, Initializ @Override public void afterPropertiesSet() throws Exception { ImmutableSettings.Builder settings = ImmutableSettings.settingsBuilder() + .put(loadConfig()) .put("http.enabled", String.valueOf(this.enableHttp)) .put("path.data", this.pathData); - nodeClient = (NodeClient) nodeBuilder().settings(settings).clusterName(this.clusterName).local(this.local).node() .client(); } + private Settings loadConfig() { + if (StringUtils.isNotBlank(pathConfiguration)) { + try { + return ImmutableSettings.builder().loadFromUrl(new ClassPathResource(pathConfiguration).getURL()).build(); + } catch (IOException e) { + logger.error(String.format("Unable to read node configuration from file [%s]", pathConfiguration), e); + } + } + return ImmutableSettings.builder().build(); + } + public void setLocal(boolean local) { this.local = local; } @@ -91,6 +110,10 @@ public class NodeClientFactoryBean implements FactoryBean, Initializ this.pathData = pathData; } + public void setPathConfiguration(String configuration) { + this.pathConfiguration = configuration; + } + @Override public void destroy() throws Exception { try { diff --git a/src/main/java/org/springframework/data/elasticsearch/config/NodeClientBeanDefinitionParser.java b/src/main/java/org/springframework/data/elasticsearch/config/NodeClientBeanDefinitionParser.java index 4d49e2fc5..4587e6f51 100644 --- a/src/main/java/org/springframework/data/elasticsearch/config/NodeClientBeanDefinitionParser.java +++ b/src/main/java/org/springframework/data/elasticsearch/config/NodeClientBeanDefinitionParser.java @@ -44,6 +44,7 @@ public class NodeClientBeanDefinitionParser extends AbstractBeanDefinitionParser builder.addPropertyValue("clusterName", element.getAttribute("cluster-name")); builder.addPropertyValue("enableHttp", Boolean.valueOf(element.getAttribute("http-enabled"))); builder.addPropertyValue("pathData", element.getAttribute("path-data")); + builder.addPropertyValue("pathConfiguration", element.getAttribute("path-configuration")); } private AbstractBeanDefinition getSourcedBeanDefinition(BeanDefinitionBuilder builder, Element source, diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java index 7d65305c8..2a803639e 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java @@ -87,7 +87,6 @@ import org.springframework.data.elasticsearch.ElasticsearchException; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Mapping; import org.springframework.data.elasticsearch.annotations.Setting; -import org.springframework.data.elasticsearch.annotations.ScriptedField; import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter; import org.springframework.data.elasticsearch.core.facet.FacetRequest; @@ -842,15 +841,14 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati } } - if (!searchQuery.getScriptFields().isEmpty()) { - searchRequest.addField("_source"); - } + if (!searchQuery.getScriptFields().isEmpty()) { + searchRequest.addField("_source"); + for (ScriptField scriptedField : searchQuery.getScriptFields()) { + searchRequest.addScriptField(scriptedField.fieldName(), scriptedField.script(), scriptedField.params()); + } + } - for (ScriptField scriptedField : searchQuery.getScriptFields()) { - searchRequest.addScriptField(scriptedField.fieldName(), scriptedField.script(), scriptedField.params()); - } - - if (CollectionUtils.isNotEmpty(searchQuery.getFacets())) { + if (CollectionUtils.isNotEmpty(searchQuery.getFacets())) { for (FacetRequest facetRequest : searchQuery.getFacets()) { FacetBuilder facet = facetRequest.getFacet(); if (facetRequest.applyQueryFilter() && searchQuery.getFilter() != null) { diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/ScriptField.java b/src/main/java/org/springframework/data/elasticsearch/core/query/ScriptField.java index a9c56b5d3..483a6e4e6 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/ScriptField.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/ScriptField.java @@ -6,26 +6,26 @@ import java.util.Map; * @author Ryan Murfitt */ public class ScriptField { - private final String fieldName; - private final String script; - private final Map params; - public ScriptField(String fieldName, String script, Map params) { - this.fieldName = fieldName; - this.script = script; - this.params = params; - } + private final String fieldName; + private final String script; + private final Map params; - public String fieldName() { - return fieldName; - } + public ScriptField(String fieldName, String script, Map params) { + this.fieldName = fieldName; + this.script = script; + this.params = params; + } - public String script() { - return script; - } + public String fieldName() { + return fieldName; + } - public Map params() { - return params; - } + public String script() { + return script; + } + + public Map params() { + return params; + } } - diff --git a/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-1.0.xsd b/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-1.0.xsd index 74ee065d8..441e65aa9 100644 --- a/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-1.0.xsd +++ b/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-1.0.xsd @@ -74,6 +74,13 @@ + + + + + + + diff --git a/src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java b/src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java index c530ef94d..37703e3c6 100644 --- a/src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java +++ b/src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java @@ -19,6 +19,7 @@ import lombok.*; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Version; import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.ScriptedField; import org.springframework.data.elasticsearch.core.geo.GeoPoint; /** @@ -39,6 +40,8 @@ public class SampleEntity { private String type; private String message; private int rate; + @ScriptedField + private Long scriptedRate; private boolean available; private String highlightedMessage; diff --git a/src/test/resources/infrastructure.xml b/src/test/resources/infrastructure.xml index 223cbbaff..deb5181c9 100644 --- a/src/test/resources/infrastructure.xml +++ b/src/test/resources/infrastructure.xml @@ -5,7 +5,9 @@ xsi:schemaLocation="http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - + diff --git a/src/test/resources/node-client-configuration.yml b/src/test/resources/node-client-configuration.yml new file mode 100644 index 000000000..e1049b9b2 --- /dev/null +++ b/src/test/resources/node-client-configuration.yml @@ -0,0 +1,3 @@ +#enabled scripts - this require groovy +script.inline: on +script.indexed: on