diff --git a/pom.xml b/pom.xml
index ce471a58..5950d5a9 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 6b6bd00f..73d13163 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 4d49e2fc..4587e6f5 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 7d65305c..2a803639 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 a9c56b5d..483a6e4e 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 74ee065d..441e65aa 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 c530ef94..37703e3c 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 223cbbaf..deb5181c 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 00000000..e1049b9b
--- /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