diff --git a/.gitignore b/.gitignore index 2b6ba3019..053074dbe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,18 @@ -atlassian-ide-plugin.xml - -## Ignore svn files -.svn - -## ignore any target dir -target - -## Ignore project files created by Eclipse -.settings -.project -.classpath - -## Ignore project files created by IntelliJ IDEA -*.iml -*.ipr -*.iws -.idea +atlassian-ide-plugin.xml + +## Ignore svn files +.svn + +## ignore any target dir +target + +## Ignore project files created by Eclipse +.settings +.project +.classpath + +## Ignore project files created by IntelliJ IDEA +*.iml +*.ipr +*.iws +.idea diff --git a/src/main/java/org/springframework/data/elasticsearch/ElasticsearchException.java b/src/main/java/org/springframework/data/elasticsearch/ElasticsearchException.java index b3b0ddb20..88ea99643 100644 --- a/src/main/java/org/springframework/data/elasticsearch/ElasticsearchException.java +++ b/src/main/java/org/springframework/data/elasticsearch/ElasticsearchException.java @@ -1,51 +1,51 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch; - -import java.util.Map; - -/** - * ElasticsearchException - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ -public class ElasticsearchException extends RuntimeException { - - private Map failedDocuments; - - public ElasticsearchException(String message) { - super(message); - } - - public ElasticsearchException(String message, Throwable cause) { - super(message, cause); - } - - public ElasticsearchException(String message, Throwable cause, Map failedDocuments) { - super(message, cause); - this.failedDocuments = failedDocuments; - } - - public ElasticsearchException(String message, Map failedDocuments) { - super(message); - this.failedDocuments = failedDocuments; - } - - public Map getFailedDocuments() { - return failedDocuments; - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch; + +import java.util.Map; + +/** + * ElasticsearchException + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public class ElasticsearchException extends RuntimeException { + + private Map failedDocuments; + + public ElasticsearchException(String message) { + super(message); + } + + public ElasticsearchException(String message, Throwable cause) { + super(message, cause); + } + + public ElasticsearchException(String message, Throwable cause, Map failedDocuments) { + super(message, cause); + this.failedDocuments = failedDocuments; + } + + public ElasticsearchException(String message, Map failedDocuments) { + super(message); + this.failedDocuments = failedDocuments; + } + + public Map getFailedDocuments() { + return failedDocuments; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/annotations/Document.java b/src/main/java/org/springframework/data/elasticsearch/annotations/Document.java index e494afaa9..5e0712b13 100644 --- a/src/main/java/org/springframework/data/elasticsearch/annotations/Document.java +++ b/src/main/java/org/springframework/data/elasticsearch/annotations/Document.java @@ -1,51 +1,51 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.annotations; - -import java.lang.annotation.*; - -import org.springframework.data.annotation.Persistent; - -/** - * Document - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Mason Chan - */ - -@Persistent -@Inherited -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.TYPE}) -public @interface Document { - - String indexName(); - - String type() default ""; - - boolean useServerConfiguration() default false; - - short shards() default 5; - - short replicas() default 1; - - String refreshInterval() default "1s"; - - String indexStoreType() default "fs"; - - boolean createIndex() default true; -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.annotations; + +import java.lang.annotation.*; + +import org.springframework.data.annotation.Persistent; + +/** + * Document + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Mason Chan + */ + +@Persistent +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +public @interface Document { + + String indexName(); + + String type() default ""; + + boolean useServerConfiguration() default false; + + short shards() default 5; + + short replicas() default 1; + + String refreshInterval() default "1s"; + + String indexStoreType() default "fs"; + + boolean createIndex() default true; +} diff --git a/src/main/java/org/springframework/data/elasticsearch/annotations/Field.java b/src/main/java/org/springframework/data/elasticsearch/annotations/Field.java index 380ae0cad..2b48eedfb 100644 --- a/src/main/java/org/springframework/data/elasticsearch/annotations/Field.java +++ b/src/main/java/org/springframework/data/elasticsearch/annotations/Field.java @@ -1,58 +1,58 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.annotations; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - * @author Jonathan Yan - * @author Jakub Vavrik - * @author Kevin Leturc - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.FIELD) -@Documented -@Inherited -public @interface Field { - - FieldType type() default FieldType.Auto; - - boolean index() default true; - - DateFormat format() default DateFormat.none; - - String pattern() default ""; - - boolean store() default false; - - boolean fielddata() default false; - - String searchAnalyzer() default ""; - - String analyzer() default ""; - - String[] ignoreFields() default {}; - - boolean includeInParent() default false; -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.annotations; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Artur Konczak + * @author Jonathan Yan + * @author Jakub Vavrik + * @author Kevin Leturc + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@Documented +@Inherited +public @interface Field { + + FieldType type() default FieldType.Auto; + + boolean index() default true; + + DateFormat format() default DateFormat.none; + + String pattern() default ""; + + boolean store() default false; + + boolean fielddata() default false; + + String searchAnalyzer() default ""; + + String analyzer() default ""; + + String[] ignoreFields() default {}; + + boolean includeInParent() default false; +} diff --git a/src/main/java/org/springframework/data/elasticsearch/annotations/Query.java b/src/main/java/org/springframework/data/elasticsearch/annotations/Query.java index 3c91cdf29..d1fc2f3f4 100644 --- a/src/main/java/org/springframework/data/elasticsearch/annotations/Query.java +++ b/src/main/java/org/springframework/data/elasticsearch/annotations/Query.java @@ -1,45 +1,45 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.annotations; - -import java.lang.annotation.*; - -/** - * Query - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -@Documented -public @interface Query { - - /** - * Elasticsearch query to be used when executing query. May contain placeholders eg. ?0 - * - * @return - */ - String value() default ""; - - /** - * Named Query Named looked up by repository. - * - * @return - */ - String name() default ""; -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.annotations; + +import java.lang.annotation.*; + +/** + * Query + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +@Documented +public @interface Query { + + /** + * Elasticsearch query to be used when executing query. May contain placeholders eg. ?0 + * + * @return + */ + String value() default ""; + + /** + * Named Query Named looked up by repository. + * + * @return + */ + String name() default ""; +} diff --git a/src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java b/src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java index b008bf63d..2d4ee0f91 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java @@ -1,156 +1,156 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.client; - -import static org.apache.commons.lang.StringUtils.*; - -import java.net.InetAddress; -import java.util.Properties; - -import org.elasticsearch.client.transport.TransportClient; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.transport.InetSocketTransportAddress; -import org.elasticsearch.transport.client.PreBuiltTransportClient; -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.util.Assert; - -/** - * TransportClientFactoryBean - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Jakub Vavrik - * @author Piotr Betkier - */ - -public class TransportClientFactoryBean implements FactoryBean, InitializingBean, DisposableBean { - - private static final Logger logger = LoggerFactory.getLogger(TransportClientFactoryBean.class); - private String clusterNodes = "127.0.0.1:9300"; - private String clusterName = "elasticsearch"; - private Boolean clientTransportSniff = true; - private Boolean clientIgnoreClusterName = Boolean.FALSE; - private String clientPingTimeout = "5s"; - private String clientNodesSamplerInterval = "5s"; - private TransportClient client; - private Properties properties; - static final String COLON = ":"; - static final String COMMA = ","; - - @Override - public void destroy() throws Exception { - try { - logger.info("Closing elasticSearch client"); - if (client != null) { - client.close(); - } - } catch (final Exception e) { - logger.error("Error closing ElasticSearch client: ", e); - } - } - - @Override - public TransportClient getObject() throws Exception { - return client; - } - - @Override - public Class getObjectType() { - return TransportClient.class; - } - - @Override - public boolean isSingleton() { - return false; - } - - @Override - public void afterPropertiesSet() throws Exception { - buildClient(); - } - - protected void buildClient() throws Exception { - - client = new PreBuiltTransportClient(settings()); - Assert.hasText(clusterNodes, "[Assertion failed] clusterNodes settings missing."); - for (String clusterNode : split(clusterNodes, COMMA)) { - String hostName = substringBeforeLast(clusterNode, COLON); - String port = substringAfterLast(clusterNode, COLON); - Assert.hasText(hostName, "[Assertion failed] missing host name in 'clusterNodes'"); - Assert.hasText(port, "[Assertion failed] missing port in 'clusterNodes'"); - logger.info("adding transport node : " + clusterNode); - client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(hostName), Integer.valueOf(port))); - } - client.connectedNodes(); - } - - private Settings settings() { - if (properties != null) { - return Settings.builder().put(properties).build(); - } - return Settings.builder() - .put("cluster.name", clusterName) - .put("client.transport.sniff", clientTransportSniff) - .put("client.transport.ignore_cluster_name", clientIgnoreClusterName) - .put("client.transport.ping_timeout", clientPingTimeout) - .put("client.transport.nodes_sampler_interval", clientNodesSamplerInterval) - .build(); - } - - public void setClusterNodes(String clusterNodes) { - this.clusterNodes = clusterNodes; - } - - public void setClusterName(String clusterName) { - this.clusterName = clusterName; - } - - public void setClientTransportSniff(Boolean clientTransportSniff) { - this.clientTransportSniff = clientTransportSniff; - } - - public String getClientNodesSamplerInterval() { - return clientNodesSamplerInterval; - } - - public void setClientNodesSamplerInterval(String clientNodesSamplerInterval) { - this.clientNodesSamplerInterval = clientNodesSamplerInterval; - } - - public String getClientPingTimeout() { - return clientPingTimeout; - } - - public void setClientPingTimeout(String clientPingTimeout) { - this.clientPingTimeout = clientPingTimeout; - } - - public Boolean getClientIgnoreClusterName() { - return clientIgnoreClusterName; - } - - public void setClientIgnoreClusterName(Boolean clientIgnoreClusterName) { - this.clientIgnoreClusterName = clientIgnoreClusterName; - } - - public void setProperties(Properties properties) { - this.properties = properties; - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.client; + +import static org.apache.commons.lang.StringUtils.*; + +import java.net.InetAddress; +import java.util.Properties; + +import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.transport.InetSocketTransportAddress; +import org.elasticsearch.transport.client.PreBuiltTransportClient; +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.util.Assert; + +/** + * TransportClientFactoryBean + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Jakub Vavrik + * @author Piotr Betkier + */ + +public class TransportClientFactoryBean implements FactoryBean, InitializingBean, DisposableBean { + + private static final Logger logger = LoggerFactory.getLogger(TransportClientFactoryBean.class); + private String clusterNodes = "127.0.0.1:9300"; + private String clusterName = "elasticsearch"; + private Boolean clientTransportSniff = true; + private Boolean clientIgnoreClusterName = Boolean.FALSE; + private String clientPingTimeout = "5s"; + private String clientNodesSamplerInterval = "5s"; + private TransportClient client; + private Properties properties; + static final String COLON = ":"; + static final String COMMA = ","; + + @Override + public void destroy() throws Exception { + try { + logger.info("Closing elasticSearch client"); + if (client != null) { + client.close(); + } + } catch (final Exception e) { + logger.error("Error closing ElasticSearch client: ", e); + } + } + + @Override + public TransportClient getObject() throws Exception { + return client; + } + + @Override + public Class getObjectType() { + return TransportClient.class; + } + + @Override + public boolean isSingleton() { + return false; + } + + @Override + public void afterPropertiesSet() throws Exception { + buildClient(); + } + + protected void buildClient() throws Exception { + + client = new PreBuiltTransportClient(settings()); + Assert.hasText(clusterNodes, "[Assertion failed] clusterNodes settings missing."); + for (String clusterNode : split(clusterNodes, COMMA)) { + String hostName = substringBeforeLast(clusterNode, COLON); + String port = substringAfterLast(clusterNode, COLON); + Assert.hasText(hostName, "[Assertion failed] missing host name in 'clusterNodes'"); + Assert.hasText(port, "[Assertion failed] missing port in 'clusterNodes'"); + logger.info("adding transport node : " + clusterNode); + client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(hostName), Integer.valueOf(port))); + } + client.connectedNodes(); + } + + private Settings settings() { + if (properties != null) { + return Settings.builder().put(properties).build(); + } + return Settings.builder() + .put("cluster.name", clusterName) + .put("client.transport.sniff", clientTransportSniff) + .put("client.transport.ignore_cluster_name", clientIgnoreClusterName) + .put("client.transport.ping_timeout", clientPingTimeout) + .put("client.transport.nodes_sampler_interval", clientNodesSamplerInterval) + .build(); + } + + public void setClusterNodes(String clusterNodes) { + this.clusterNodes = clusterNodes; + } + + public void setClusterName(String clusterName) { + this.clusterName = clusterName; + } + + public void setClientTransportSniff(Boolean clientTransportSniff) { + this.clientTransportSniff = clientTransportSniff; + } + + public String getClientNodesSamplerInterval() { + return clientNodesSamplerInterval; + } + + public void setClientNodesSamplerInterval(String clientNodesSamplerInterval) { + this.clientNodesSamplerInterval = clientNodesSamplerInterval; + } + + public String getClientPingTimeout() { + return clientPingTimeout; + } + + public void setClientPingTimeout(String clientPingTimeout) { + this.clientPingTimeout = clientPingTimeout; + } + + public Boolean getClientIgnoreClusterName() { + return clientIgnoreClusterName; + } + + public void setClientIgnoreClusterName(Boolean clientIgnoreClusterName) { + this.clientIgnoreClusterName = clientIgnoreClusterName; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/config/ElasticsearchNamespaceHandler.java b/src/main/java/org/springframework/data/elasticsearch/config/ElasticsearchNamespaceHandler.java index bfb65686a..315020c6a 100644 --- a/src/main/java/org/springframework/data/elasticsearch/config/ElasticsearchNamespaceHandler.java +++ b/src/main/java/org/springframework/data/elasticsearch/config/ElasticsearchNamespaceHandler.java @@ -1,41 +1,41 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.config; - -import org.springframework.beans.factory.xml.NamespaceHandlerSupport; -import org.springframework.data.elasticsearch.repository.config.ElasticsearchRepositoryConfigExtension; -import org.springframework.data.repository.config.RepositoryBeanDefinitionParser; -import org.springframework.data.repository.config.RepositoryConfigurationExtension; - -/** - * ElasticsearchNamespaceHandler - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ - -public class ElasticsearchNamespaceHandler extends NamespaceHandlerSupport { - - @Override - public void init() { - RepositoryConfigurationExtension extension = new ElasticsearchRepositoryConfigExtension(); - RepositoryBeanDefinitionParser parser = new RepositoryBeanDefinitionParser(extension); - - registerBeanDefinitionParser("repositories", parser); - registerBeanDefinitionParser("node-client", new NodeClientBeanDefinitionParser()); - registerBeanDefinitionParser("transport-client", new TransportClientBeanDefinitionParser()); - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.config; + +import org.springframework.beans.factory.xml.NamespaceHandlerSupport; +import org.springframework.data.elasticsearch.repository.config.ElasticsearchRepositoryConfigExtension; +import org.springframework.data.repository.config.RepositoryBeanDefinitionParser; +import org.springframework.data.repository.config.RepositoryConfigurationExtension; + +/** + * ElasticsearchNamespaceHandler + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ + +public class ElasticsearchNamespaceHandler extends NamespaceHandlerSupport { + + @Override + public void init() { + RepositoryConfigurationExtension extension = new ElasticsearchRepositoryConfigExtension(); + RepositoryBeanDefinitionParser parser = new RepositoryBeanDefinitionParser(extension); + + registerBeanDefinitionParser("repositories", parser); + registerBeanDefinitionParser("node-client", new NodeClientBeanDefinitionParser()); + registerBeanDefinitionParser("transport-client", new TransportClientBeanDefinitionParser()); + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/config/TransportClientBeanDefinitionParser.java b/src/main/java/org/springframework/data/elasticsearch/config/TransportClientBeanDefinitionParser.java index 54679fa30..200f830ce 100644 --- a/src/main/java/org/springframework/data/elasticsearch/config/TransportClientBeanDefinitionParser.java +++ b/src/main/java/org/springframework/data/elasticsearch/config/TransportClientBeanDefinitionParser.java @@ -1,56 +1,56 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.config; - -import org.springframework.beans.factory.support.AbstractBeanDefinition; -import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; -import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.data.elasticsearch.client.TransportClientFactoryBean; -import org.w3c.dom.Element; - -/** - * TransportClientBeanDefinitionParser - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ - -public class TransportClientBeanDefinitionParser extends AbstractBeanDefinitionParser { - - @Override - protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(TransportClientFactoryBean.class); - setConfigurations(element, builder); - return getSourcedBeanDefinition(builder, element, parserContext); - } - - private void setConfigurations(Element element, BeanDefinitionBuilder builder) { - builder.addPropertyValue("clusterNodes", element.getAttribute("cluster-nodes")); - builder.addPropertyValue("clusterName", element.getAttribute("cluster-name")); - builder.addPropertyValue("clientTransportSniff", Boolean.valueOf(element.getAttribute("client-transport-sniff"))); - builder.addPropertyValue("clientIgnoreClusterName", Boolean.valueOf(element.getAttribute("client-transport-ignore-cluster-name"))); - builder.addPropertyValue("clientPingTimeout", element.getAttribute("client-transport-ping-timeout")); - builder.addPropertyValue("clientNodesSamplerInterval", element.getAttribute("client-transport-nodes-sampler-interval")); - } - - private AbstractBeanDefinition getSourcedBeanDefinition(BeanDefinitionBuilder builder, Element source, - ParserContext context) { - AbstractBeanDefinition definition = builder.getBeanDefinition(); - definition.setSource(context.extractSource(source)); - return definition; - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.config; + +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.data.elasticsearch.client.TransportClientFactoryBean; +import org.w3c.dom.Element; + +/** + * TransportClientBeanDefinitionParser + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ + +public class TransportClientBeanDefinitionParser extends AbstractBeanDefinitionParser { + + @Override + protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(TransportClientFactoryBean.class); + setConfigurations(element, builder); + return getSourcedBeanDefinition(builder, element, parserContext); + } + + private void setConfigurations(Element element, BeanDefinitionBuilder builder) { + builder.addPropertyValue("clusterNodes", element.getAttribute("cluster-nodes")); + builder.addPropertyValue("clusterName", element.getAttribute("cluster-name")); + builder.addPropertyValue("clientTransportSniff", Boolean.valueOf(element.getAttribute("client-transport-sniff"))); + builder.addPropertyValue("clientIgnoreClusterName", Boolean.valueOf(element.getAttribute("client-transport-ignore-cluster-name"))); + builder.addPropertyValue("clientPingTimeout", element.getAttribute("client-transport-ping-timeout")); + builder.addPropertyValue("clientNodesSamplerInterval", element.getAttribute("client-transport-nodes-sampler-interval")); + } + + private AbstractBeanDefinition getSourcedBeanDefinition(BeanDefinitionBuilder builder, Element source, + ParserContext context) { + AbstractBeanDefinition definition = builder.getBeanDefinition(); + definition.setSource(context.extractSource(source)); + return definition; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java b/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java index 3bb735a83..f082e9cfc 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java @@ -1,206 +1,206 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core; - -import static org.elasticsearch.index.query.Operator.AND; -import static org.elasticsearch.index.query.QueryBuilders.*; -import static org.springframework.data.elasticsearch.core.query.Criteria.*; - -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; - -import org.apache.lucene.queryparser.flexible.core.util.StringUtils; -import org.elasticsearch.index.query.*; -import org.springframework.data.elasticsearch.core.query.Criteria; -import org.springframework.util.Assert; - -/** - * CriteriaQueryProcessor - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Franck Marchand - * @author Artur Konczak - */ -class CriteriaQueryProcessor { - - - QueryBuilder createQueryFromCriteria(Criteria criteria) { - if (criteria == null) - return null; - - List shouldQueryBuilderList = new LinkedList<>(); - List mustNotQueryBuilderList = new LinkedList<>(); - List mustQueryBuilderList = new LinkedList<>(); - - ListIterator chainIterator = criteria.getCriteriaChain().listIterator(); - - QueryBuilder firstQuery = null; - boolean negateFirstQuery = false; - - while (chainIterator.hasNext()) { - Criteria chainedCriteria = chainIterator.next(); - QueryBuilder queryFragmentForCriteria = createQueryFragmentForCriteria(chainedCriteria); - if (queryFragmentForCriteria != null) { - if (firstQuery == null) { - firstQuery = queryFragmentForCriteria; - negateFirstQuery = chainedCriteria.isNegating(); - continue; - } - if (chainedCriteria.isOr()) { - shouldQueryBuilderList.add(queryFragmentForCriteria); - } else if (chainedCriteria.isNegating()) { - mustNotQueryBuilderList.add(queryFragmentForCriteria); - } else { - mustQueryBuilderList.add(queryFragmentForCriteria); - } - } - } - - if (firstQuery != null) { - if (!shouldQueryBuilderList.isEmpty() && mustNotQueryBuilderList.isEmpty() && mustQueryBuilderList.isEmpty()) { - shouldQueryBuilderList.add(0, firstQuery); - } else { - if (negateFirstQuery) { - mustNotQueryBuilderList.add(0, firstQuery); - } else { - mustQueryBuilderList.add(0, firstQuery); - } - } - } - - BoolQueryBuilder query = null; - - if (!shouldQueryBuilderList.isEmpty() || !mustNotQueryBuilderList.isEmpty() || !mustQueryBuilderList.isEmpty()) { - - query = boolQuery(); - - for (QueryBuilder qb : shouldQueryBuilderList) { - query.should(qb); - } - for (QueryBuilder qb : mustNotQueryBuilderList) { - query.mustNot(qb); - } - for (QueryBuilder qb : mustQueryBuilderList) { - query.must(qb); - } - } - - return query; - } - - - private QueryBuilder createQueryFragmentForCriteria(Criteria chainedCriteria) { - if (chainedCriteria.getQueryCriteriaEntries().isEmpty()) - return null; - - Iterator it = chainedCriteria.getQueryCriteriaEntries().iterator(); - boolean singeEntryCriteria = (chainedCriteria.getQueryCriteriaEntries().size() == 1); - - String fieldName = chainedCriteria.getField().getName(); - Assert.notNull(fieldName, "Unknown field"); - QueryBuilder query = null; - - if (singeEntryCriteria) { - Criteria.CriteriaEntry entry = it.next(); - query = processCriteriaEntry(entry, fieldName); - } else { - query = boolQuery(); - while (it.hasNext()) { - Criteria.CriteriaEntry entry = it.next(); - ((BoolQueryBuilder) query).must(processCriteriaEntry(entry, fieldName)); - } - } - - addBoost(query, chainedCriteria.getBoost()); - return query; - } - - - private QueryBuilder processCriteriaEntry(Criteria.CriteriaEntry entry,/* OperationKey key, Object value,*/ String fieldName) { - Object value = entry.getValue(); - if (value == null) { - return null; - } - OperationKey key = entry.getKey(); - QueryBuilder query = null; - - String searchText = StringUtils.toString(value); - - Iterable collection = null; - - switch (key) { - case EQUALS: - query = queryStringQuery(searchText).field(fieldName).defaultOperator(AND); - break; - case CONTAINS: - query = queryStringQuery("*" + searchText + "*").field(fieldName).analyzeWildcard(true); - break; - case STARTS_WITH: - query = queryStringQuery(searchText + "*").field(fieldName).analyzeWildcard(true); - break; - case ENDS_WITH: - query = queryStringQuery("*" + searchText).field(fieldName).analyzeWildcard(true); - break; - case EXPRESSION: - query = queryStringQuery(searchText).field(fieldName); - break; - case LESS_EQUAL: - query = rangeQuery(fieldName).lte(value); - break; - case GREATER_EQUAL: - query = rangeQuery(fieldName).gte(value); - break; - case BETWEEN: - Object[] ranges = (Object[]) value; - query = rangeQuery(fieldName).from(ranges[0]).to(ranges[1]); - break; - case LESS: - query = rangeQuery(fieldName).lt(value); - break; - case GREATER: - query = rangeQuery(fieldName).gt(value); - break; - case FUZZY: - query = fuzzyQuery(fieldName, searchText); - break; - case IN: - query = boolQuery(); - collection = (Iterable) value; - for (Object item : collection) { - ((BoolQueryBuilder) query).should(queryStringQuery(item.toString()).field(fieldName)); - } - break; - case NOT_IN: - query = boolQuery(); - collection = (Iterable) value; - for (Object item : collection) { - ((BoolQueryBuilder) query).mustNot(queryStringQuery(item.toString()).field(fieldName)); - } - break; - } - return query; - } - - private void addBoost(QueryBuilder query, float boost) { - if (Float.isNaN(boost)) { - return; - } - query.boost(boost); - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core; + +import static org.elasticsearch.index.query.Operator.AND; +import static org.elasticsearch.index.query.QueryBuilders.*; +import static org.springframework.data.elasticsearch.core.query.Criteria.*; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; + +import org.apache.lucene.queryparser.flexible.core.util.StringUtils; +import org.elasticsearch.index.query.*; +import org.springframework.data.elasticsearch.core.query.Criteria; +import org.springframework.util.Assert; + +/** + * CriteriaQueryProcessor + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Franck Marchand + * @author Artur Konczak + */ +class CriteriaQueryProcessor { + + + QueryBuilder createQueryFromCriteria(Criteria criteria) { + if (criteria == null) + return null; + + List shouldQueryBuilderList = new LinkedList<>(); + List mustNotQueryBuilderList = new LinkedList<>(); + List mustQueryBuilderList = new LinkedList<>(); + + ListIterator chainIterator = criteria.getCriteriaChain().listIterator(); + + QueryBuilder firstQuery = null; + boolean negateFirstQuery = false; + + while (chainIterator.hasNext()) { + Criteria chainedCriteria = chainIterator.next(); + QueryBuilder queryFragmentForCriteria = createQueryFragmentForCriteria(chainedCriteria); + if (queryFragmentForCriteria != null) { + if (firstQuery == null) { + firstQuery = queryFragmentForCriteria; + negateFirstQuery = chainedCriteria.isNegating(); + continue; + } + if (chainedCriteria.isOr()) { + shouldQueryBuilderList.add(queryFragmentForCriteria); + } else if (chainedCriteria.isNegating()) { + mustNotQueryBuilderList.add(queryFragmentForCriteria); + } else { + mustQueryBuilderList.add(queryFragmentForCriteria); + } + } + } + + if (firstQuery != null) { + if (!shouldQueryBuilderList.isEmpty() && mustNotQueryBuilderList.isEmpty() && mustQueryBuilderList.isEmpty()) { + shouldQueryBuilderList.add(0, firstQuery); + } else { + if (negateFirstQuery) { + mustNotQueryBuilderList.add(0, firstQuery); + } else { + mustQueryBuilderList.add(0, firstQuery); + } + } + } + + BoolQueryBuilder query = null; + + if (!shouldQueryBuilderList.isEmpty() || !mustNotQueryBuilderList.isEmpty() || !mustQueryBuilderList.isEmpty()) { + + query = boolQuery(); + + for (QueryBuilder qb : shouldQueryBuilderList) { + query.should(qb); + } + for (QueryBuilder qb : mustNotQueryBuilderList) { + query.mustNot(qb); + } + for (QueryBuilder qb : mustQueryBuilderList) { + query.must(qb); + } + } + + return query; + } + + + private QueryBuilder createQueryFragmentForCriteria(Criteria chainedCriteria) { + if (chainedCriteria.getQueryCriteriaEntries().isEmpty()) + return null; + + Iterator it = chainedCriteria.getQueryCriteriaEntries().iterator(); + boolean singeEntryCriteria = (chainedCriteria.getQueryCriteriaEntries().size() == 1); + + String fieldName = chainedCriteria.getField().getName(); + Assert.notNull(fieldName, "Unknown field"); + QueryBuilder query = null; + + if (singeEntryCriteria) { + Criteria.CriteriaEntry entry = it.next(); + query = processCriteriaEntry(entry, fieldName); + } else { + query = boolQuery(); + while (it.hasNext()) { + Criteria.CriteriaEntry entry = it.next(); + ((BoolQueryBuilder) query).must(processCriteriaEntry(entry, fieldName)); + } + } + + addBoost(query, chainedCriteria.getBoost()); + return query; + } + + + private QueryBuilder processCriteriaEntry(Criteria.CriteriaEntry entry,/* OperationKey key, Object value,*/ String fieldName) { + Object value = entry.getValue(); + if (value == null) { + return null; + } + OperationKey key = entry.getKey(); + QueryBuilder query = null; + + String searchText = StringUtils.toString(value); + + Iterable collection = null; + + switch (key) { + case EQUALS: + query = queryStringQuery(searchText).field(fieldName).defaultOperator(AND); + break; + case CONTAINS: + query = queryStringQuery("*" + searchText + "*").field(fieldName).analyzeWildcard(true); + break; + case STARTS_WITH: + query = queryStringQuery(searchText + "*").field(fieldName).analyzeWildcard(true); + break; + case ENDS_WITH: + query = queryStringQuery("*" + searchText).field(fieldName).analyzeWildcard(true); + break; + case EXPRESSION: + query = queryStringQuery(searchText).field(fieldName); + break; + case LESS_EQUAL: + query = rangeQuery(fieldName).lte(value); + break; + case GREATER_EQUAL: + query = rangeQuery(fieldName).gte(value); + break; + case BETWEEN: + Object[] ranges = (Object[]) value; + query = rangeQuery(fieldName).from(ranges[0]).to(ranges[1]); + break; + case LESS: + query = rangeQuery(fieldName).lt(value); + break; + case GREATER: + query = rangeQuery(fieldName).gt(value); + break; + case FUZZY: + query = fuzzyQuery(fieldName, searchText); + break; + case IN: + query = boolQuery(); + collection = (Iterable) value; + for (Object item : collection) { + ((BoolQueryBuilder) query).should(queryStringQuery(item.toString()).field(fieldName)); + } + break; + case NOT_IN: + query = boolQuery(); + collection = (Iterable) value; + for (Object item : collection) { + ((BoolQueryBuilder) query).mustNot(queryStringQuery(item.toString()).field(fieldName)); + } + break; + } + return query; + } + + private void addBoost(QueryBuilder query, float boost) { + if (Float.isNaN(boost)) { + return; + } + query.boost(boost); + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java index dd877e8fd..65a409777 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java @@ -1,577 +1,577 @@ -/* - * Copyright 2013-2016 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core; - -import org.elasticsearch.action.update.UpdateResponse; -import org.elasticsearch.client.Client; -import org.elasticsearch.cluster.metadata.AliasMetaData; -import org.elasticsearch.common.Nullable; -import org.springframework.data.domain.Page; -import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; -import org.springframework.data.elasticsearch.core.query.*; -import org.springframework.data.util.CloseableIterator; - -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -/** - * ElasticsearchOperations - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Kevin Leturc - */ -public interface ElasticsearchOperations { - - /** - * @return Converter in use - */ - ElasticsearchConverter getElasticsearchConverter(); - - /** - * @return elasticsearch client - */ - Client getClient(); - - /** - * Create an index for a class - * - * @param clazz - * @param - */ - boolean createIndex(Class clazz); - - /** - * Create an index for given indexName - * - * @param indexName - */ - boolean createIndex(String indexName); - - /** - * Create an index for given indexName and Settings - * - * @param indexName - * @param settings - */ - boolean createIndex(String indexName, Object settings); - - /** - * Create an index for given class and Settings - * - * @param clazz - * @param settings - */ - boolean createIndex(Class clazz, Object settings); - - /** - * Create mapping for a class - * - * @param clazz - * @param - */ - boolean putMapping(Class clazz); - - /** - * Create mapping for a given indexName and type - * - * @param indexName - * @param type - * @param mappings - */ - boolean putMapping(String indexName, String type, Object mappings); - - /** - * Create mapping for a class - * - * @param clazz - * @param mappings - */ - boolean putMapping(Class clazz, Object mappings); - - - /** - * Get mapping for a class - * - * @param clazz - * @param - */ - Map getMapping(Class clazz); - - /** - * Get mapping for a given indexName and type - * - * @param indexName - * @param type - */ - Map getMapping(String indexName, String type); - - /** - * Get settings for a given indexName - * - * @param indexName - */ - Map getSetting(String indexName); - - /** - * Get settings for a given class - * - * @param clazz - */ - Map getSetting(Class clazz); - - - /** - * Execute the query against elasticsearch and return the first returned object - * - * @param query - * @param clazz - * @return the first matching object - */ - T queryForObject(GetQuery query, Class clazz); - - /** - * Execute the query against elasticsearch and return the first returned object using custom mapper - * - * @param query - * @param clazz - * @param mapper - * @return the first matching object - */ - T queryForObject(GetQuery query, Class clazz, GetResultMapper mapper); - - /** - * Execute the query against elasticsearch and return the first returned object - * - * @param query - * @param clazz - * @return the first matching object - */ - T queryForObject(CriteriaQuery query, Class clazz); - - /** - * Execute the query against elasticsearch and return the first returned object - * - * @param query - * @param clazz - * @return the first matching object - */ - T queryForObject(StringQuery query, Class clazz); - - /** - * Execute the query against elasticsearch and return result as {@link Page} - * - * @param query - * @param clazz - * @return - */ - Page queryForPage(SearchQuery query, Class clazz); - - /** - * Execute the query against elasticsearch and return result as {@link Page} using custom mapper - * - * @param query - * @param clazz - * @return - */ - Page queryForPage(SearchQuery query, Class clazz, SearchResultMapper mapper); - - /** - * Execute the query against elasticsearch and return result as {@link Page} - * - * @param query - * @param clazz - * @return - */ - Page queryForPage(CriteriaQuery query, Class clazz); - - /** - * Execute the query against elasticsearch and return result as {@link Page} - * - * @param query - * @param clazz - * @return - */ - Page queryForPage(StringQuery query, Class clazz); - - /** - * Execute the query against elasticsearch and return result as {@link Page} using custom mapper - * - * @param query - * @param clazz - * @return - */ - Page queryForPage(StringQuery query, Class clazz, SearchResultMapper mapper); - - /** - * Executes the given {@link CriteriaQuery} against elasticsearch and return result as {@link CloseableIterator}. - *

- * Returns a {@link CloseableIterator} that wraps an Elasticsearch scroll context that needs to be closed in case of error. - * - * @param element return type - * @param query - * @param clazz - * @return - * @since 1.3 - */ - CloseableIterator stream(CriteriaQuery query, Class clazz); - - /** - * Executes the given {@link SearchQuery} against elasticsearch and return result as {@link CloseableIterator}. - *

- * Returns a {@link CloseableIterator} that wraps an Elasticsearch scroll context that needs to be closed in case of error. - * - * @param element return type - * @param query - * @param clazz - * @return - * @since 1.3 - */ - CloseableIterator stream(SearchQuery query, Class clazz); - - /** - * Executes the given {@link SearchQuery} against elasticsearch and return result as {@link CloseableIterator} using custom mapper. - *

- * Returns a {@link CloseableIterator} that wraps an Elasticsearch scroll context that needs to be closed in case of error. - * - * @param element return type - * @param query - * @param clazz - * @param mapper - * @return - * @since 1.3 - */ - CloseableIterator stream(SearchQuery query, Class clazz, SearchResultMapper mapper); - - /** - * Execute the criteria query against elasticsearch and return result as {@link List} - * - * @param query - * @param clazz - * @param - * @return - */ - List queryForList(CriteriaQuery query, Class clazz); - - /** - * Execute the string query against elasticsearch and return result as {@link List} - * - * @param query - * @param clazz - * @param - * @return - */ - List queryForList(StringQuery query, Class clazz); - - /** - * Execute the search query against elasticsearch and return result as {@link List} - * - * @param query - * @param clazz - * @param - * @return - */ - List queryForList(SearchQuery query, Class clazz); - - /** - * Execute the query against elasticsearch and return ids - * - * @param query - * @return - */ - List queryForIds(SearchQuery query); - - /** - * return number of elements found by given query - * - * @param query - * @param clazz - * @return - */ - long count(CriteriaQuery query, Class clazz); - - /** - * return number of elements found by given query - * - * @param query - * @return - */ - long count(CriteriaQuery query); - - /** - * return number of elements found by given query - * - * @param query - * @param clazz - * @return - */ - long count(SearchQuery query, Class clazz); - - /** - * return number of elements found by given query - * - * @param query - * @return - */ - long count(SearchQuery query); - - /** - * Execute a multiGet against elasticsearch for the given ids - * - * @param searchQuery - * @param clazz - * @return - */ - LinkedList multiGet(SearchQuery searchQuery, Class clazz); - - /** - * Execute a multiGet against elasticsearch for the given ids with MultiGetResultMapper - * - * @param searchQuery - * @param clazz - * @param multiGetResultMapper - * @return - */ - LinkedList multiGet(SearchQuery searchQuery, Class clazz, MultiGetResultMapper multiGetResultMapper); - - /** - * Index an object. Will do save or update - * - * @param query - * @return returns the document id - */ - String index(IndexQuery query); - - /** - * Partial update of the document - * - * @param updateQuery - * @return - */ - UpdateResponse update(UpdateQuery updateQuery); - - /** - * Bulk index all objects. Will do save or update - * - * @param queries - */ - void bulkIndex(List queries); - - /** - * Bulk update all objects. Will do update - * - * @param queries - */ - void bulkUpdate(List queries); - - /** - * Delete the one object with provided id - * - * @param indexName - * @param type - * @param id - * @return documentId of the document deleted - */ - String delete(String indexName, String type, String id); - - - /** - * Delete all records matching the criteria - * - * @param clazz - * @param criteriaQuery - */ - void delete(CriteriaQuery criteriaQuery, Class clazz); - /** - * Delete the one object with provided id - * - * @param clazz - * @param id - * @return documentId of the document deleted - */ - String delete(Class clazz, String id); - - /** - * Delete all records matching the query - * - * @param clazz - * @param query - */ - void delete(DeleteQuery query, Class clazz); - - /** - * Delete all records matching the query - * - * @param query - */ - void delete(DeleteQuery query); - - /** - * Deletes an index for given entity - * - * @param clazz - * @param - * @return - */ - boolean deleteIndex(Class clazz); - - /** - * Deletes an index for given indexName - * - * @param indexName - * @return - */ - boolean deleteIndex(String indexName); - - /** - * check if index is exists - * - * @param clazz - * @param - * @return - */ - boolean indexExists(Class clazz); - - /** - * check if index is exists for given IndexName - * - * @param indexName - * @return - */ - boolean indexExists(String indexName); - - /** - * check if type is exists in an index - * - * @param index - * @param type - * @return - */ - boolean typeExists(String index, String type); - - /** - * refresh the index - * - * @param indexName - * - */ - void refresh(String indexName); - - /** - * refresh the index - * - * @param clazz - * - */ - void refresh(Class clazz); - - /** - * Returns scrolled page for given query - * - * @param query The search query. - * @param scrollTimeInMillis The time in millisecond for scroll feature - * {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}. - * @param clazz The class of entity to retrieve. - * @return The scan id for input query. - */ - Page startScroll(long scrollTimeInMillis, SearchQuery query, Class clazz); - - /** - * Returns scrolled page for given query - * - * @param query The search query. - * @param scrollTimeInMillis The time in millisecond for scroll feature - * {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}. - * @param mapper Custom impl to map result to entities - * @return The scan id for input query. - */ - Page startScroll(long scrollTimeInMillis, SearchQuery query, Class clazz, SearchResultMapper mapper); - - /** - * Returns scrolled page for given query - * - * @param criteriaQuery The search query. - * @param scrollTimeInMillis The time in millisecond for scroll feature - * {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}. - * @param clazz The class of entity to retrieve. - * @return The scan id for input query. - */ - Page startScroll(long scrollTimeInMillis, CriteriaQuery criteriaQuery, Class clazz); - - /** - * Returns scrolled page for given query - * - * @param criteriaQuery The search query. - * @param scrollTimeInMillis The time in millisecond for scroll feature - * {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}. - * @param mapper Custom impl to map result to entities - * @return The scan id for input query. - */ - Page startScroll(long scrollTimeInMillis, CriteriaQuery criteriaQuery, Class clazz, SearchResultMapper mapper); - - - Page continueScroll(@Nullable String scrollId, long scrollTimeInMillis, Class clazz); - Page continueScroll(@Nullable String scrollId, long scrollTimeInMillis, Class clazz, SearchResultMapper mapper); - /** - * Clears the search contexts associated with specified scroll ids. - * - * @param scrollId - * - */ - void clearScroll(String scrollId); - - /** - * more like this query to search for documents that are "like" a specific document. - * - * @param query - * @param clazz - * @param - * @return - */ - Page moreLikeThis(MoreLikeThisQuery query, Class clazz); - - /** - * adding new alias - * - * @param query - * @return - */ - Boolean addAlias(AliasQuery query); - - /** - * removing previously created alias - * - * @param query - * @return - */ - Boolean removeAlias(AliasQuery query); - - /** - * get all the alias pointing to specified index - * - * @param indexName - * @return - */ - List queryForAlias(String indexName); - - - T query(SearchQuery query, ResultsExtractor resultsExtractor); - - - ElasticsearchPersistentEntity getPersistentEntityFor(Class clazz); -} +/* + * Copyright 2013-2016 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core; + +import org.elasticsearch.action.update.UpdateResponse; +import org.elasticsearch.client.Client; +import org.elasticsearch.cluster.metadata.AliasMetaData; +import org.elasticsearch.common.Nullable; +import org.springframework.data.domain.Page; +import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; +import org.springframework.data.elasticsearch.core.query.*; +import org.springframework.data.util.CloseableIterator; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * ElasticsearchOperations + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Kevin Leturc + */ +public interface ElasticsearchOperations { + + /** + * @return Converter in use + */ + ElasticsearchConverter getElasticsearchConverter(); + + /** + * @return elasticsearch client + */ + Client getClient(); + + /** + * Create an index for a class + * + * @param clazz + * @param + */ + boolean createIndex(Class clazz); + + /** + * Create an index for given indexName + * + * @param indexName + */ + boolean createIndex(String indexName); + + /** + * Create an index for given indexName and Settings + * + * @param indexName + * @param settings + */ + boolean createIndex(String indexName, Object settings); + + /** + * Create an index for given class and Settings + * + * @param clazz + * @param settings + */ + boolean createIndex(Class clazz, Object settings); + + /** + * Create mapping for a class + * + * @param clazz + * @param + */ + boolean putMapping(Class clazz); + + /** + * Create mapping for a given indexName and type + * + * @param indexName + * @param type + * @param mappings + */ + boolean putMapping(String indexName, String type, Object mappings); + + /** + * Create mapping for a class + * + * @param clazz + * @param mappings + */ + boolean putMapping(Class clazz, Object mappings); + + + /** + * Get mapping for a class + * + * @param clazz + * @param + */ + Map getMapping(Class clazz); + + /** + * Get mapping for a given indexName and type + * + * @param indexName + * @param type + */ + Map getMapping(String indexName, String type); + + /** + * Get settings for a given indexName + * + * @param indexName + */ + Map getSetting(String indexName); + + /** + * Get settings for a given class + * + * @param clazz + */ + Map getSetting(Class clazz); + + + /** + * Execute the query against elasticsearch and return the first returned object + * + * @param query + * @param clazz + * @return the first matching object + */ + T queryForObject(GetQuery query, Class clazz); + + /** + * Execute the query against elasticsearch and return the first returned object using custom mapper + * + * @param query + * @param clazz + * @param mapper + * @return the first matching object + */ + T queryForObject(GetQuery query, Class clazz, GetResultMapper mapper); + + /** + * Execute the query against elasticsearch and return the first returned object + * + * @param query + * @param clazz + * @return the first matching object + */ + T queryForObject(CriteriaQuery query, Class clazz); + + /** + * Execute the query against elasticsearch and return the first returned object + * + * @param query + * @param clazz + * @return the first matching object + */ + T queryForObject(StringQuery query, Class clazz); + + /** + * Execute the query against elasticsearch and return result as {@link Page} + * + * @param query + * @param clazz + * @return + */ + Page queryForPage(SearchQuery query, Class clazz); + + /** + * Execute the query against elasticsearch and return result as {@link Page} using custom mapper + * + * @param query + * @param clazz + * @return + */ + Page queryForPage(SearchQuery query, Class clazz, SearchResultMapper mapper); + + /** + * Execute the query against elasticsearch and return result as {@link Page} + * + * @param query + * @param clazz + * @return + */ + Page queryForPage(CriteriaQuery query, Class clazz); + + /** + * Execute the query against elasticsearch and return result as {@link Page} + * + * @param query + * @param clazz + * @return + */ + Page queryForPage(StringQuery query, Class clazz); + + /** + * Execute the query against elasticsearch and return result as {@link Page} using custom mapper + * + * @param query + * @param clazz + * @return + */ + Page queryForPage(StringQuery query, Class clazz, SearchResultMapper mapper); + + /** + * Executes the given {@link CriteriaQuery} against elasticsearch and return result as {@link CloseableIterator}. + *

+ * Returns a {@link CloseableIterator} that wraps an Elasticsearch scroll context that needs to be closed in case of error. + * + * @param element return type + * @param query + * @param clazz + * @return + * @since 1.3 + */ + CloseableIterator stream(CriteriaQuery query, Class clazz); + + /** + * Executes the given {@link SearchQuery} against elasticsearch and return result as {@link CloseableIterator}. + *

+ * Returns a {@link CloseableIterator} that wraps an Elasticsearch scroll context that needs to be closed in case of error. + * + * @param element return type + * @param query + * @param clazz + * @return + * @since 1.3 + */ + CloseableIterator stream(SearchQuery query, Class clazz); + + /** + * Executes the given {@link SearchQuery} against elasticsearch and return result as {@link CloseableIterator} using custom mapper. + *

+ * Returns a {@link CloseableIterator} that wraps an Elasticsearch scroll context that needs to be closed in case of error. + * + * @param element return type + * @param query + * @param clazz + * @param mapper + * @return + * @since 1.3 + */ + CloseableIterator stream(SearchQuery query, Class clazz, SearchResultMapper mapper); + + /** + * Execute the criteria query against elasticsearch and return result as {@link List} + * + * @param query + * @param clazz + * @param + * @return + */ + List queryForList(CriteriaQuery query, Class clazz); + + /** + * Execute the string query against elasticsearch and return result as {@link List} + * + * @param query + * @param clazz + * @param + * @return + */ + List queryForList(StringQuery query, Class clazz); + + /** + * Execute the search query against elasticsearch and return result as {@link List} + * + * @param query + * @param clazz + * @param + * @return + */ + List queryForList(SearchQuery query, Class clazz); + + /** + * Execute the query against elasticsearch and return ids + * + * @param query + * @return + */ + List queryForIds(SearchQuery query); + + /** + * return number of elements found by given query + * + * @param query + * @param clazz + * @return + */ + long count(CriteriaQuery query, Class clazz); + + /** + * return number of elements found by given query + * + * @param query + * @return + */ + long count(CriteriaQuery query); + + /** + * return number of elements found by given query + * + * @param query + * @param clazz + * @return + */ + long count(SearchQuery query, Class clazz); + + /** + * return number of elements found by given query + * + * @param query + * @return + */ + long count(SearchQuery query); + + /** + * Execute a multiGet against elasticsearch for the given ids + * + * @param searchQuery + * @param clazz + * @return + */ + LinkedList multiGet(SearchQuery searchQuery, Class clazz); + + /** + * Execute a multiGet against elasticsearch for the given ids with MultiGetResultMapper + * + * @param searchQuery + * @param clazz + * @param multiGetResultMapper + * @return + */ + LinkedList multiGet(SearchQuery searchQuery, Class clazz, MultiGetResultMapper multiGetResultMapper); + + /** + * Index an object. Will do save or update + * + * @param query + * @return returns the document id + */ + String index(IndexQuery query); + + /** + * Partial update of the document + * + * @param updateQuery + * @return + */ + UpdateResponse update(UpdateQuery updateQuery); + + /** + * Bulk index all objects. Will do save or update + * + * @param queries + */ + void bulkIndex(List queries); + + /** + * Bulk update all objects. Will do update + * + * @param queries + */ + void bulkUpdate(List queries); + + /** + * Delete the one object with provided id + * + * @param indexName + * @param type + * @param id + * @return documentId of the document deleted + */ + String delete(String indexName, String type, String id); + + + /** + * Delete all records matching the criteria + * + * @param clazz + * @param criteriaQuery + */ + void delete(CriteriaQuery criteriaQuery, Class clazz); + /** + * Delete the one object with provided id + * + * @param clazz + * @param id + * @return documentId of the document deleted + */ + String delete(Class clazz, String id); + + /** + * Delete all records matching the query + * + * @param clazz + * @param query + */ + void delete(DeleteQuery query, Class clazz); + + /** + * Delete all records matching the query + * + * @param query + */ + void delete(DeleteQuery query); + + /** + * Deletes an index for given entity + * + * @param clazz + * @param + * @return + */ + boolean deleteIndex(Class clazz); + + /** + * Deletes an index for given indexName + * + * @param indexName + * @return + */ + boolean deleteIndex(String indexName); + + /** + * check if index is exists + * + * @param clazz + * @param + * @return + */ + boolean indexExists(Class clazz); + + /** + * check if index is exists for given IndexName + * + * @param indexName + * @return + */ + boolean indexExists(String indexName); + + /** + * check if type is exists in an index + * + * @param index + * @param type + * @return + */ + boolean typeExists(String index, String type); + + /** + * refresh the index + * + * @param indexName + * + */ + void refresh(String indexName); + + /** + * refresh the index + * + * @param clazz + * + */ + void refresh(Class clazz); + + /** + * Returns scrolled page for given query + * + * @param query The search query. + * @param scrollTimeInMillis The time in millisecond for scroll feature + * {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}. + * @param clazz The class of entity to retrieve. + * @return The scan id for input query. + */ + Page startScroll(long scrollTimeInMillis, SearchQuery query, Class clazz); + + /** + * Returns scrolled page for given query + * + * @param query The search query. + * @param scrollTimeInMillis The time in millisecond for scroll feature + * {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}. + * @param mapper Custom impl to map result to entities + * @return The scan id for input query. + */ + Page startScroll(long scrollTimeInMillis, SearchQuery query, Class clazz, SearchResultMapper mapper); + + /** + * Returns scrolled page for given query + * + * @param criteriaQuery The search query. + * @param scrollTimeInMillis The time in millisecond for scroll feature + * {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}. + * @param clazz The class of entity to retrieve. + * @return The scan id for input query. + */ + Page startScroll(long scrollTimeInMillis, CriteriaQuery criteriaQuery, Class clazz); + + /** + * Returns scrolled page for given query + * + * @param criteriaQuery The search query. + * @param scrollTimeInMillis The time in millisecond for scroll feature + * {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}. + * @param mapper Custom impl to map result to entities + * @return The scan id for input query. + */ + Page startScroll(long scrollTimeInMillis, CriteriaQuery criteriaQuery, Class clazz, SearchResultMapper mapper); + + + Page continueScroll(@Nullable String scrollId, long scrollTimeInMillis, Class clazz); + Page continueScroll(@Nullable String scrollId, long scrollTimeInMillis, Class clazz, SearchResultMapper mapper); + /** + * Clears the search contexts associated with specified scroll ids. + * + * @param scrollId + * + */ + void clearScroll(String scrollId); + + /** + * more like this query to search for documents that are "like" a specific document. + * + * @param query + * @param clazz + * @param + * @return + */ + Page moreLikeThis(MoreLikeThisQuery query, Class clazz); + + /** + * adding new alias + * + * @param query + * @return + */ + Boolean addAlias(AliasQuery query); + + /** + * removing previously created alias + * + * @param query + * @return + */ + Boolean removeAlias(AliasQuery query); + + /** + * get all the alias pointing to specified index + * + * @param indexName + * @return + */ + List queryForAlias(String indexName); + + + T query(SearchQuery query, ResultsExtractor resultsExtractor); + + + ElasticsearchPersistentEntity getPersistentEntityFor(Class clazz); +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java index 398a78c23..a76aa6420 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java @@ -1,362 +1,362 @@ -/* - * Copyright 2014-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.springframework.core.ResolvableType; -import org.springframework.core.io.ClassPathResource; -import org.springframework.data.annotation.Transient; -import org.springframework.data.elasticsearch.annotations.CompletionField; -import org.springframework.data.elasticsearch.annotations.DateFormat; -import org.springframework.data.elasticsearch.annotations.Field; -import org.springframework.data.elasticsearch.annotations.FieldType; -import org.springframework.data.elasticsearch.annotations.GeoPointField; -import org.springframework.data.elasticsearch.annotations.InnerField; -import org.springframework.data.elasticsearch.annotations.Mapping; -import org.springframework.data.elasticsearch.annotations.MultiField; -import org.springframework.data.elasticsearch.core.completion.Completion; -import org.springframework.data.elasticsearch.core.geo.GeoPoint; -import org.springframework.data.mapping.model.SimpleTypeHolder; -import org.springframework.data.util.ClassTypeInformation; -import org.springframework.data.util.TypeInformation; -import static org.apache.commons.lang.StringUtils.*; -import static org.elasticsearch.common.xcontent.XContentFactory.*; -import static org.springframework.util.StringUtils.*; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - * @author Kevin Leturc - * @author Alexander Volz - * @author Dennis Maaß - * @author Pavel Luhin - * @author Mark Paluch - */ -class MappingBuilder { - - public static final String FIELD_DATA = "fielddata"; - public static final String FIELD_STORE = "store"; - public static final String FIELD_TYPE = "type"; - public static final String FIELD_INDEX = "index"; - public static final String FIELD_FORMAT = "format"; - public static final String FIELD_SEARCH_ANALYZER = "search_analyzer"; - public static final String FIELD_INDEX_ANALYZER = "analyzer"; - public static final String FIELD_PROPERTIES = "properties"; - public static final String FIELD_PARENT = "_parent"; - - public static final String COMPLETION_PRESERVE_SEPARATORS = "preserve_separators"; - public static final String COMPLETION_PRESERVE_POSITION_INCREMENTS = "preserve_position_increments"; - public static final String COMPLETION_MAX_INPUT_LENGTH = "max_input_length"; - - public static final String INDEX_VALUE_NOT_ANALYZED = "not_analyzed"; - public static final String TYPE_VALUE_STRING = "text"; - public static final String TYPE_VALUE_GEO_POINT = "geo_point"; - public static final String TYPE_VALUE_COMPLETION = "completion"; - public static final String TYPE_VALUE_GEO_HASH_PREFIX = "geohash_prefix"; - public static final String TYPE_VALUE_GEO_HASH_PRECISION = "geohash_precision"; - - private static SimpleTypeHolder SIMPLE_TYPE_HOLDER = SimpleTypeHolder.DEFAULT; - - static XContentBuilder buildMapping(Class clazz, String indexType, String idFieldName, String parentType) throws IOException { - - XContentBuilder mapping = jsonBuilder().startObject().startObject(indexType); - // Parent - if (hasText(parentType)) { - mapping.startObject(FIELD_PARENT).field(FIELD_TYPE, parentType).endObject(); - } - - // Properties - XContentBuilder xContentBuilder = mapping.startObject(FIELD_PROPERTIES); - - mapEntity(xContentBuilder, clazz, true, idFieldName, EMPTY, false, FieldType.Auto, null); - - return xContentBuilder.endObject().endObject().endObject(); - } - - private static void mapEntity(XContentBuilder xContentBuilder, Class clazz, boolean isRootObject, String idFieldName, - String nestedObjectFieldName, boolean nestedOrObjectField, FieldType fieldType, Field fieldAnnotation) throws IOException { - - java.lang.reflect.Field[] fields = retrieveFields(clazz); - - if (!isRootObject && (isAnyPropertyAnnotatedAsField(fields) || nestedOrObjectField)) { - String type = FieldType.Object.toString().toLowerCase(); - if (nestedOrObjectField) { - type = fieldType.toString().toLowerCase(); - } - XContentBuilder t = xContentBuilder.startObject(nestedObjectFieldName).field(FIELD_TYPE, type); - - if (nestedOrObjectField && FieldType.Nested == fieldType && fieldAnnotation.includeInParent()) { - t.field("include_in_parent", fieldAnnotation.includeInParent()); - } - t.startObject(FIELD_PROPERTIES); - } - - for (java.lang.reflect.Field field : fields) { - - if (field.isAnnotationPresent(Transient.class) || isInIgnoreFields(field, fieldAnnotation)) { - continue; - } - - if (field.isAnnotationPresent(Mapping.class)) { - String mappingPath = field.getAnnotation(Mapping.class).mappingPath(); - if (isNotBlank(mappingPath)) { - ClassPathResource mappings = new ClassPathResource(mappingPath); - if (mappings.exists()) { - xContentBuilder.rawField(field.getName(), mappings.getInputStream()); - continue; - } - } - } - - boolean isGeoPointField = isGeoPointField(field); - boolean isCompletionField = isCompletionField(field); - - Field singleField = field.getAnnotation(Field.class); - if (!isGeoPointField && !isCompletionField && isEntity(field) && isAnnotated(field)) { - if (singleField == null) { - continue; - } - boolean nestedOrObject = isNestedOrObjectField(field); - mapEntity(xContentBuilder, getFieldType(field), false, EMPTY, field.getName(), nestedOrObject, singleField.type(), field.getAnnotation(Field.class)); - if (nestedOrObject) { - continue; - } - } - - MultiField multiField = field.getAnnotation(MultiField.class); - - if (isGeoPointField) { - applyGeoPointFieldMapping(xContentBuilder, field); - } - - if (isCompletionField) { - CompletionField completionField = field.getAnnotation(CompletionField.class); - applyCompletionFieldMapping(xContentBuilder, field, completionField); - } - - if (isRootObject && singleField != null && isIdField(field, idFieldName)) { - applyDefaultIdFieldMapping(xContentBuilder, field); - } else if (multiField != null) { - addMultiFieldMapping(xContentBuilder, field, multiField, isNestedOrObjectField(field)); - } else if (singleField != null) { - addSingleFieldMapping(xContentBuilder, field, singleField, isNestedOrObjectField(field)); - } - } - - if (!isRootObject && isAnyPropertyAnnotatedAsField(fields) || nestedOrObjectField) { - xContentBuilder.endObject().endObject(); - } - } - - private static java.lang.reflect.Field[] retrieveFields(Class clazz) { - // Create list of fields. - List fields = new ArrayList<>(); - - // Keep backing up the inheritance hierarchy. - Class targetClass = clazz; - do { - fields.addAll(Arrays.asList(targetClass.getDeclaredFields())); - targetClass = targetClass.getSuperclass(); - } - while (targetClass != null && targetClass != Object.class); - - return fields.toArray(new java.lang.reflect.Field[fields.size()]); - } - - private static boolean isAnnotated(java.lang.reflect.Field field) { - return field.getAnnotation(Field.class) != null || - field.getAnnotation(MultiField.class) != null || - field.getAnnotation(GeoPointField.class) != null || - field.getAnnotation(CompletionField.class) != null; - } - - private static void applyGeoPointFieldMapping(XContentBuilder xContentBuilder, java.lang.reflect.Field field) throws IOException { - xContentBuilder.startObject(field.getName()); - xContentBuilder.field(FIELD_TYPE, TYPE_VALUE_GEO_POINT); - xContentBuilder.endObject(); - } - - private static void applyCompletionFieldMapping(XContentBuilder xContentBuilder, java.lang.reflect.Field field, CompletionField annotation) throws IOException { - xContentBuilder.startObject(field.getName()); - xContentBuilder.field(FIELD_TYPE, TYPE_VALUE_COMPLETION); - if (annotation != null) { - xContentBuilder.field(COMPLETION_MAX_INPUT_LENGTH, annotation.maxInputLength()); - xContentBuilder.field(COMPLETION_PRESERVE_POSITION_INCREMENTS, annotation.preservePositionIncrements()); - xContentBuilder.field(COMPLETION_PRESERVE_SEPARATORS, annotation.preserveSeparators()); - if (isNotBlank(annotation.searchAnalyzer())) { - xContentBuilder.field(FIELD_SEARCH_ANALYZER, annotation.searchAnalyzer()); - } - if (isNotBlank(annotation.analyzer())) { - xContentBuilder.field(FIELD_INDEX_ANALYZER, annotation.analyzer()); - } - } - xContentBuilder.endObject(); - } - - private static void applyDefaultIdFieldMapping(XContentBuilder xContentBuilder, java.lang.reflect.Field field) - throws IOException { - xContentBuilder.startObject(field.getName()) - .field(FIELD_TYPE, TYPE_VALUE_STRING) - .field(FIELD_INDEX, INDEX_VALUE_NOT_ANALYZED); - xContentBuilder.endObject(); - } - - /** - * Apply mapping for a single @Field annotation - * - * @throws IOException - */ - private static void addSingleFieldMapping(XContentBuilder xContentBuilder, java.lang.reflect.Field field, - Field fieldAnnotation, boolean nestedOrObjectField) throws IOException { - xContentBuilder.startObject(field.getName()); - if(!nestedOrObjectField) { - xContentBuilder.field(FIELD_STORE, fieldAnnotation.store()); - } - if(fieldAnnotation.fielddata()) { - xContentBuilder.field(FIELD_DATA, fieldAnnotation.fielddata()); - } - - if (FieldType.Auto != fieldAnnotation.type()) { - xContentBuilder.field(FIELD_TYPE, fieldAnnotation.type().name().toLowerCase()); - if (FieldType.Date == fieldAnnotation.type() && DateFormat.none != fieldAnnotation.format()) { - xContentBuilder.field(FIELD_FORMAT, DateFormat.custom == fieldAnnotation.format() - ? fieldAnnotation.pattern() : fieldAnnotation.format()); - } - } - if(!fieldAnnotation.index()) { - xContentBuilder.field(FIELD_INDEX, fieldAnnotation.index()); - } - if (isNotBlank(fieldAnnotation.searchAnalyzer())) { - xContentBuilder.field(FIELD_SEARCH_ANALYZER, fieldAnnotation.searchAnalyzer()); - } - if (isNotBlank(fieldAnnotation.analyzer())) { - xContentBuilder.field(FIELD_INDEX_ANALYZER, fieldAnnotation.analyzer()); - } - xContentBuilder.endObject(); - } - - /** - * Apply mapping for a single nested @Field annotation - * - * @throws IOException - */ - private static void addNestedFieldMapping(XContentBuilder builder, java.lang.reflect.Field field, - InnerField annotation) throws IOException { - builder.startObject(annotation.suffix()); - //builder.field(FIELD_STORE, annotation.store()); - if (FieldType.Auto != annotation.type()) { - builder.field(FIELD_TYPE, annotation.type().name().toLowerCase()); - } - if(!annotation.index()) { - builder.field(FIELD_INDEX, annotation.index()); - } - if (isNotBlank(annotation.searchAnalyzer())) { - builder.field(FIELD_SEARCH_ANALYZER, annotation.searchAnalyzer()); - } - if (isNotBlank(annotation.indexAnalyzer())) { - builder.field(FIELD_INDEX_ANALYZER, annotation.indexAnalyzer()); - } - if (annotation.fielddata()) { - builder.field(FIELD_DATA, annotation.fielddata()); - } - builder.endObject(); - } - - /** - * Multi field mappings for string type fields, support for sorts and facets - * - * @throws IOException - */ - private static void addMultiFieldMapping(XContentBuilder builder, java.lang.reflect.Field field, - MultiField annotation, boolean nestedOrObjectField) throws IOException { - builder.startObject(field.getName()); - builder.field(FIELD_TYPE, annotation.mainField().type()); - builder.startObject("fields"); - //add standard field - //addSingleFieldMapping(builder, field, annotation.mainField(), nestedOrObjectField); - for (InnerField innerField : annotation.otherFields()) { - addNestedFieldMapping(builder, field, innerField); - } - builder.endObject(); - builder.endObject(); - } - - protected static boolean isEntity(java.lang.reflect.Field field) { - TypeInformation typeInformation = ClassTypeInformation.from(field.getType()); - Class clazz = getFieldType(field); - boolean isComplexType = !SIMPLE_TYPE_HOLDER.isSimpleType(clazz); - return isComplexType && !Map.class.isAssignableFrom(typeInformation.getType()); - } - - protected static Class getFieldType(java.lang.reflect.Field field) { - - ResolvableType resolvableType = ResolvableType.forField(field); - - if (resolvableType.isArray()) { - return resolvableType.getComponentType().getRawClass(); - } - - ResolvableType componentType = resolvableType.getGeneric(0); - if (Iterable.class.isAssignableFrom(field.getType()) - && componentType != ResolvableType.NONE) { - return componentType.getRawClass(); - } - - return resolvableType.getRawClass(); - } - - private static boolean isAnyPropertyAnnotatedAsField(java.lang.reflect.Field[] fields) { - if (fields != null) { - for (java.lang.reflect.Field field : fields) { - if (field.isAnnotationPresent(Field.class)) { - return true; - } - } - } - return false; - } - - private static boolean isIdField(java.lang.reflect.Field field, String idFieldName) { - return idFieldName.equals(field.getName()); - } - - private static boolean isInIgnoreFields(java.lang.reflect.Field field, Field parentFieldAnnotation) { - if (null != parentFieldAnnotation) { - String[] ignoreFields = parentFieldAnnotation.ignoreFields(); - return Arrays.asList(ignoreFields).contains(field.getName()); - } - return false; - } - - private static boolean isNestedOrObjectField(java.lang.reflect.Field field) { - Field fieldAnnotation = field.getAnnotation(Field.class); - return fieldAnnotation != null && (FieldType.Nested == fieldAnnotation.type() || FieldType.Object == fieldAnnotation.type()); - } - - private static boolean isGeoPointField(java.lang.reflect.Field field) { - return field.getType() == GeoPoint.class || field.getAnnotation(GeoPointField.class) != null; - } - - private static boolean isCompletionField(java.lang.reflect.Field field) { - return field.getType() == Completion.class; - } -} +/* + * Copyright 2014-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.springframework.core.ResolvableType; +import org.springframework.core.io.ClassPathResource; +import org.springframework.data.annotation.Transient; +import org.springframework.data.elasticsearch.annotations.CompletionField; +import org.springframework.data.elasticsearch.annotations.DateFormat; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; +import org.springframework.data.elasticsearch.annotations.GeoPointField; +import org.springframework.data.elasticsearch.annotations.InnerField; +import org.springframework.data.elasticsearch.annotations.Mapping; +import org.springframework.data.elasticsearch.annotations.MultiField; +import org.springframework.data.elasticsearch.core.completion.Completion; +import org.springframework.data.elasticsearch.core.geo.GeoPoint; +import org.springframework.data.mapping.model.SimpleTypeHolder; +import org.springframework.data.util.ClassTypeInformation; +import org.springframework.data.util.TypeInformation; +import static org.apache.commons.lang.StringUtils.*; +import static org.elasticsearch.common.xcontent.XContentFactory.*; +import static org.springframework.util.StringUtils.*; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Artur Konczak + * @author Kevin Leturc + * @author Alexander Volz + * @author Dennis Maaß + * @author Pavel Luhin + * @author Mark Paluch + */ +class MappingBuilder { + + public static final String FIELD_DATA = "fielddata"; + public static final String FIELD_STORE = "store"; + public static final String FIELD_TYPE = "type"; + public static final String FIELD_INDEX = "index"; + public static final String FIELD_FORMAT = "format"; + public static final String FIELD_SEARCH_ANALYZER = "search_analyzer"; + public static final String FIELD_INDEX_ANALYZER = "analyzer"; + public static final String FIELD_PROPERTIES = "properties"; + public static final String FIELD_PARENT = "_parent"; + + public static final String COMPLETION_PRESERVE_SEPARATORS = "preserve_separators"; + public static final String COMPLETION_PRESERVE_POSITION_INCREMENTS = "preserve_position_increments"; + public static final String COMPLETION_MAX_INPUT_LENGTH = "max_input_length"; + + public static final String INDEX_VALUE_NOT_ANALYZED = "not_analyzed"; + public static final String TYPE_VALUE_STRING = "text"; + public static final String TYPE_VALUE_GEO_POINT = "geo_point"; + public static final String TYPE_VALUE_COMPLETION = "completion"; + public static final String TYPE_VALUE_GEO_HASH_PREFIX = "geohash_prefix"; + public static final String TYPE_VALUE_GEO_HASH_PRECISION = "geohash_precision"; + + private static SimpleTypeHolder SIMPLE_TYPE_HOLDER = SimpleTypeHolder.DEFAULT; + + static XContentBuilder buildMapping(Class clazz, String indexType, String idFieldName, String parentType) throws IOException { + + XContentBuilder mapping = jsonBuilder().startObject().startObject(indexType); + // Parent + if (hasText(parentType)) { + mapping.startObject(FIELD_PARENT).field(FIELD_TYPE, parentType).endObject(); + } + + // Properties + XContentBuilder xContentBuilder = mapping.startObject(FIELD_PROPERTIES); + + mapEntity(xContentBuilder, clazz, true, idFieldName, EMPTY, false, FieldType.Auto, null); + + return xContentBuilder.endObject().endObject().endObject(); + } + + private static void mapEntity(XContentBuilder xContentBuilder, Class clazz, boolean isRootObject, String idFieldName, + String nestedObjectFieldName, boolean nestedOrObjectField, FieldType fieldType, Field fieldAnnotation) throws IOException { + + java.lang.reflect.Field[] fields = retrieveFields(clazz); + + if (!isRootObject && (isAnyPropertyAnnotatedAsField(fields) || nestedOrObjectField)) { + String type = FieldType.Object.toString().toLowerCase(); + if (nestedOrObjectField) { + type = fieldType.toString().toLowerCase(); + } + XContentBuilder t = xContentBuilder.startObject(nestedObjectFieldName).field(FIELD_TYPE, type); + + if (nestedOrObjectField && FieldType.Nested == fieldType && fieldAnnotation.includeInParent()) { + t.field("include_in_parent", fieldAnnotation.includeInParent()); + } + t.startObject(FIELD_PROPERTIES); + } + + for (java.lang.reflect.Field field : fields) { + + if (field.isAnnotationPresent(Transient.class) || isInIgnoreFields(field, fieldAnnotation)) { + continue; + } + + if (field.isAnnotationPresent(Mapping.class)) { + String mappingPath = field.getAnnotation(Mapping.class).mappingPath(); + if (isNotBlank(mappingPath)) { + ClassPathResource mappings = new ClassPathResource(mappingPath); + if (mappings.exists()) { + xContentBuilder.rawField(field.getName(), mappings.getInputStream()); + continue; + } + } + } + + boolean isGeoPointField = isGeoPointField(field); + boolean isCompletionField = isCompletionField(field); + + Field singleField = field.getAnnotation(Field.class); + if (!isGeoPointField && !isCompletionField && isEntity(field) && isAnnotated(field)) { + if (singleField == null) { + continue; + } + boolean nestedOrObject = isNestedOrObjectField(field); + mapEntity(xContentBuilder, getFieldType(field), false, EMPTY, field.getName(), nestedOrObject, singleField.type(), field.getAnnotation(Field.class)); + if (nestedOrObject) { + continue; + } + } + + MultiField multiField = field.getAnnotation(MultiField.class); + + if (isGeoPointField) { + applyGeoPointFieldMapping(xContentBuilder, field); + } + + if (isCompletionField) { + CompletionField completionField = field.getAnnotation(CompletionField.class); + applyCompletionFieldMapping(xContentBuilder, field, completionField); + } + + if (isRootObject && singleField != null && isIdField(field, idFieldName)) { + applyDefaultIdFieldMapping(xContentBuilder, field); + } else if (multiField != null) { + addMultiFieldMapping(xContentBuilder, field, multiField, isNestedOrObjectField(field)); + } else if (singleField != null) { + addSingleFieldMapping(xContentBuilder, field, singleField, isNestedOrObjectField(field)); + } + } + + if (!isRootObject && isAnyPropertyAnnotatedAsField(fields) || nestedOrObjectField) { + xContentBuilder.endObject().endObject(); + } + } + + private static java.lang.reflect.Field[] retrieveFields(Class clazz) { + // Create list of fields. + List fields = new ArrayList<>(); + + // Keep backing up the inheritance hierarchy. + Class targetClass = clazz; + do { + fields.addAll(Arrays.asList(targetClass.getDeclaredFields())); + targetClass = targetClass.getSuperclass(); + } + while (targetClass != null && targetClass != Object.class); + + return fields.toArray(new java.lang.reflect.Field[fields.size()]); + } + + private static boolean isAnnotated(java.lang.reflect.Field field) { + return field.getAnnotation(Field.class) != null || + field.getAnnotation(MultiField.class) != null || + field.getAnnotation(GeoPointField.class) != null || + field.getAnnotation(CompletionField.class) != null; + } + + private static void applyGeoPointFieldMapping(XContentBuilder xContentBuilder, java.lang.reflect.Field field) throws IOException { + xContentBuilder.startObject(field.getName()); + xContentBuilder.field(FIELD_TYPE, TYPE_VALUE_GEO_POINT); + xContentBuilder.endObject(); + } + + private static void applyCompletionFieldMapping(XContentBuilder xContentBuilder, java.lang.reflect.Field field, CompletionField annotation) throws IOException { + xContentBuilder.startObject(field.getName()); + xContentBuilder.field(FIELD_TYPE, TYPE_VALUE_COMPLETION); + if (annotation != null) { + xContentBuilder.field(COMPLETION_MAX_INPUT_LENGTH, annotation.maxInputLength()); + xContentBuilder.field(COMPLETION_PRESERVE_POSITION_INCREMENTS, annotation.preservePositionIncrements()); + xContentBuilder.field(COMPLETION_PRESERVE_SEPARATORS, annotation.preserveSeparators()); + if (isNotBlank(annotation.searchAnalyzer())) { + xContentBuilder.field(FIELD_SEARCH_ANALYZER, annotation.searchAnalyzer()); + } + if (isNotBlank(annotation.analyzer())) { + xContentBuilder.field(FIELD_INDEX_ANALYZER, annotation.analyzer()); + } + } + xContentBuilder.endObject(); + } + + private static void applyDefaultIdFieldMapping(XContentBuilder xContentBuilder, java.lang.reflect.Field field) + throws IOException { + xContentBuilder.startObject(field.getName()) + .field(FIELD_TYPE, TYPE_VALUE_STRING) + .field(FIELD_INDEX, INDEX_VALUE_NOT_ANALYZED); + xContentBuilder.endObject(); + } + + /** + * Apply mapping for a single @Field annotation + * + * @throws IOException + */ + private static void addSingleFieldMapping(XContentBuilder xContentBuilder, java.lang.reflect.Field field, + Field fieldAnnotation, boolean nestedOrObjectField) throws IOException { + xContentBuilder.startObject(field.getName()); + if(!nestedOrObjectField) { + xContentBuilder.field(FIELD_STORE, fieldAnnotation.store()); + } + if(fieldAnnotation.fielddata()) { + xContentBuilder.field(FIELD_DATA, fieldAnnotation.fielddata()); + } + + if (FieldType.Auto != fieldAnnotation.type()) { + xContentBuilder.field(FIELD_TYPE, fieldAnnotation.type().name().toLowerCase()); + if (FieldType.Date == fieldAnnotation.type() && DateFormat.none != fieldAnnotation.format()) { + xContentBuilder.field(FIELD_FORMAT, DateFormat.custom == fieldAnnotation.format() + ? fieldAnnotation.pattern() : fieldAnnotation.format()); + } + } + if(!fieldAnnotation.index()) { + xContentBuilder.field(FIELD_INDEX, fieldAnnotation.index()); + } + if (isNotBlank(fieldAnnotation.searchAnalyzer())) { + xContentBuilder.field(FIELD_SEARCH_ANALYZER, fieldAnnotation.searchAnalyzer()); + } + if (isNotBlank(fieldAnnotation.analyzer())) { + xContentBuilder.field(FIELD_INDEX_ANALYZER, fieldAnnotation.analyzer()); + } + xContentBuilder.endObject(); + } + + /** + * Apply mapping for a single nested @Field annotation + * + * @throws IOException + */ + private static void addNestedFieldMapping(XContentBuilder builder, java.lang.reflect.Field field, + InnerField annotation) throws IOException { + builder.startObject(annotation.suffix()); + //builder.field(FIELD_STORE, annotation.store()); + if (FieldType.Auto != annotation.type()) { + builder.field(FIELD_TYPE, annotation.type().name().toLowerCase()); + } + if(!annotation.index()) { + builder.field(FIELD_INDEX, annotation.index()); + } + if (isNotBlank(annotation.searchAnalyzer())) { + builder.field(FIELD_SEARCH_ANALYZER, annotation.searchAnalyzer()); + } + if (isNotBlank(annotation.indexAnalyzer())) { + builder.field(FIELD_INDEX_ANALYZER, annotation.indexAnalyzer()); + } + if (annotation.fielddata()) { + builder.field(FIELD_DATA, annotation.fielddata()); + } + builder.endObject(); + } + + /** + * Multi field mappings for string type fields, support for sorts and facets + * + * @throws IOException + */ + private static void addMultiFieldMapping(XContentBuilder builder, java.lang.reflect.Field field, + MultiField annotation, boolean nestedOrObjectField) throws IOException { + builder.startObject(field.getName()); + builder.field(FIELD_TYPE, annotation.mainField().type()); + builder.startObject("fields"); + //add standard field + //addSingleFieldMapping(builder, field, annotation.mainField(), nestedOrObjectField); + for (InnerField innerField : annotation.otherFields()) { + addNestedFieldMapping(builder, field, innerField); + } + builder.endObject(); + builder.endObject(); + } + + protected static boolean isEntity(java.lang.reflect.Field field) { + TypeInformation typeInformation = ClassTypeInformation.from(field.getType()); + Class clazz = getFieldType(field); + boolean isComplexType = !SIMPLE_TYPE_HOLDER.isSimpleType(clazz); + return isComplexType && !Map.class.isAssignableFrom(typeInformation.getType()); + } + + protected static Class getFieldType(java.lang.reflect.Field field) { + + ResolvableType resolvableType = ResolvableType.forField(field); + + if (resolvableType.isArray()) { + return resolvableType.getComponentType().getRawClass(); + } + + ResolvableType componentType = resolvableType.getGeneric(0); + if (Iterable.class.isAssignableFrom(field.getType()) + && componentType != ResolvableType.NONE) { + return componentType.getRawClass(); + } + + return resolvableType.getRawClass(); + } + + private static boolean isAnyPropertyAnnotatedAsField(java.lang.reflect.Field[] fields) { + if (fields != null) { + for (java.lang.reflect.Field field : fields) { + if (field.isAnnotationPresent(Field.class)) { + return true; + } + } + } + return false; + } + + private static boolean isIdField(java.lang.reflect.Field field, String idFieldName) { + return idFieldName.equals(field.getName()); + } + + private static boolean isInIgnoreFields(java.lang.reflect.Field field, Field parentFieldAnnotation) { + if (null != parentFieldAnnotation) { + String[] ignoreFields = parentFieldAnnotation.ignoreFields(); + return Arrays.asList(ignoreFields).contains(field.getName()); + } + return false; + } + + private static boolean isNestedOrObjectField(java.lang.reflect.Field field) { + Field fieldAnnotation = field.getAnnotation(Field.class); + return fieldAnnotation != null && (FieldType.Nested == fieldAnnotation.type() || FieldType.Object == fieldAnnotation.type()); + } + + private static boolean isGeoPointField(java.lang.reflect.Field field) { + return field.getType() == GeoPoint.class || field.getAnnotation(GeoPointField.class) != null; + } + + private static boolean isCompletionField(java.lang.reflect.Field field) { + return field.getType() == Completion.class; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ResultsExtractor.java b/src/main/java/org/springframework/data/elasticsearch/core/ResultsExtractor.java index e1f816da7..658566751 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ResultsExtractor.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ResultsExtractor.java @@ -1,24 +1,24 @@ -/* - * Copyright 2013-2014 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core; - -import org.elasticsearch.action.search.SearchResponse; - -public interface ResultsExtractor { - - T extract(SearchResponse response); -} +/* + * Copyright 2013-2014 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core; + +import org.elasticsearch.action.search.SearchResponse; + +public interface ResultsExtractor { + + T extract(SearchResponse response); +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ResultsMapper.java b/src/main/java/org/springframework/data/elasticsearch/core/ResultsMapper.java index bd87082b6..41db0f7e7 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ResultsMapper.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ResultsMapper.java @@ -1,29 +1,29 @@ -/* - * Copyright 2013-2014 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core; - -/** - * ResultsMapper - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - */ - -public interface ResultsMapper extends SearchResultMapper, GetResultMapper, MultiGetResultMapper { - - EntityMapper getEntityMapper(); -} +/* + * Copyright 2013-2014 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core; + +/** + * ResultsMapper + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Artur Konczak + */ + +public interface ResultsMapper extends SearchResultMapper, GetResultMapper, MultiGetResultMapper { + + EntityMapper getEntityMapper(); +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/convert/DateTimeConverters.java b/src/main/java/org/springframework/data/elasticsearch/core/convert/DateTimeConverters.java index fe5c154b0..ce81d6d39 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/convert/DateTimeConverters.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/convert/DateTimeConverters.java @@ -1,77 +1,77 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.convert; - -import java.util.Date; - -import org.joda.time.DateTimeZone; -import org.joda.time.LocalDateTime; -import org.joda.time.ReadableInstant; -import org.joda.time.format.DateTimeFormatter; -import org.joda.time.format.ISODateTimeFormat; -import org.springframework.core.convert.converter.Converter; - -/** - * DateTimeConverters - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ - -public final class DateTimeConverters { - - private static DateTimeFormatter formatter = ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC); - - public enum JodaDateTimeConverter implements Converter { - INSTANCE; - - @Override - public String convert(ReadableInstant source) { - if (source == null) { - return null; - } - return formatter.print(source); - } - - } - - public enum JodaLocalDateTimeConverter implements Converter { - INSTANCE; - - @Override - public String convert(LocalDateTime source) { - if (source == null) { - return null; - } - return formatter.print(source.toDateTime(DateTimeZone.UTC)); - } - - } - - public enum JavaDateConverter implements Converter { - INSTANCE; - - @Override - public String convert(Date source) { - if (source == null) { - return null; - } - - return formatter.print(source.getTime()); - } - - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.convert; + +import java.util.Date; + +import org.joda.time.DateTimeZone; +import org.joda.time.LocalDateTime; +import org.joda.time.ReadableInstant; +import org.joda.time.format.DateTimeFormatter; +import org.joda.time.format.ISODateTimeFormat; +import org.springframework.core.convert.converter.Converter; + +/** + * DateTimeConverters + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ + +public final class DateTimeConverters { + + private static DateTimeFormatter formatter = ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC); + + public enum JodaDateTimeConverter implements Converter { + INSTANCE; + + @Override + public String convert(ReadableInstant source) { + if (source == null) { + return null; + } + return formatter.print(source); + } + + } + + public enum JodaLocalDateTimeConverter implements Converter { + INSTANCE; + + @Override + public String convert(LocalDateTime source) { + if (source == null) { + return null; + } + return formatter.print(source.toDateTime(DateTimeZone.UTC)); + } + + } + + public enum JavaDateConverter implements Converter { + INSTANCE; + + @Override + public String convert(Date source) { + if (source == null) { + return null; + } + + return formatter.print(source.getTime()); + } + + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/convert/ElasticsearchConverter.java b/src/main/java/org/springframework/data/elasticsearch/core/convert/ElasticsearchConverter.java index 2a3c89e10..c649585b1 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/convert/ElasticsearchConverter.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/convert/ElasticsearchConverter.java @@ -1,45 +1,45 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.convert; - -import org.springframework.core.convert.ConversionService; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; -import org.springframework.data.mapping.context.MappingContext; - -/** - * ElasticsearchConverter - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ - -public interface ElasticsearchConverter { - - /** - * Returns the underlying {@link org.springframework.data.mapping.context.MappingContext} used by the converter. - * - * @return never {@literal null} - */ - MappingContext, ElasticsearchPersistentProperty> getMappingContext(); - - /** - * Returns the underlying {@link org.springframework.core.convert.ConversionService} used by the converter. - * - * @return never {@literal null}. - */ - ConversionService getConversionService(); -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.convert; + +import org.springframework.core.convert.ConversionService; +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; +import org.springframework.data.mapping.context.MappingContext; + +/** + * ElasticsearchConverter + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ + +public interface ElasticsearchConverter { + + /** + * Returns the underlying {@link org.springframework.data.mapping.context.MappingContext} used by the converter. + * + * @return never {@literal null} + */ + MappingContext, ElasticsearchPersistentProperty> getMappingContext(); + + /** + * Returns the underlying {@link org.springframework.core.convert.ConversionService} used by the converter. + * + * @return never {@literal null}. + */ + ConversionService getConversionService(); +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java b/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java index bb0b1e780..496e5bcf8 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java @@ -1,70 +1,70 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.convert; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.core.convert.ConversionService; -import org.springframework.core.convert.support.DefaultConversionService; -import org.springframework.core.convert.support.GenericConversionService; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; -import org.springframework.data.mapping.context.MappingContext; -import org.springframework.util.Assert; - -/** - * MappingElasticsearchConverter - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Mark Paluch - */ -public class MappingElasticsearchConverter implements ElasticsearchConverter, ApplicationContextAware { - - private final MappingContext, ElasticsearchPersistentProperty> mappingContext; - private final GenericConversionService conversionService; - - @SuppressWarnings("unused") - private ApplicationContext applicationContext; - - public MappingElasticsearchConverter( - MappingContext, ElasticsearchPersistentProperty> mappingContext) { - - Assert.notNull(mappingContext, "MappingContext must not be null!"); - - this.mappingContext = mappingContext; - this.conversionService = new DefaultConversionService(); - } - - @Override - public MappingContext, ElasticsearchPersistentProperty> getMappingContext() { - return mappingContext; - } - - @Override - public ConversionService getConversionService() { - return this.conversionService; - } - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - this.applicationContext = applicationContext; - if (mappingContext instanceof ApplicationContextAware) { - ((ApplicationContextAware) mappingContext).setApplicationContext(applicationContext); - } - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.convert; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.core.convert.ConversionService; +import org.springframework.core.convert.support.DefaultConversionService; +import org.springframework.core.convert.support.GenericConversionService; +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; +import org.springframework.data.mapping.context.MappingContext; +import org.springframework.util.Assert; + +/** + * MappingElasticsearchConverter + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Mark Paluch + */ +public class MappingElasticsearchConverter implements ElasticsearchConverter, ApplicationContextAware { + + private final MappingContext, ElasticsearchPersistentProperty> mappingContext; + private final GenericConversionService conversionService; + + @SuppressWarnings("unused") + private ApplicationContext applicationContext; + + public MappingElasticsearchConverter( + MappingContext, ElasticsearchPersistentProperty> mappingContext) { + + Assert.notNull(mappingContext, "MappingContext must not be null!"); + + this.mappingContext = mappingContext; + this.conversionService = new DefaultConversionService(); + } + + @Override + public MappingContext, ElasticsearchPersistentProperty> getMappingContext() { + return mappingContext; + } + + @Override + public ConversionService getConversionService() { + return this.conversionService; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + if (mappingContext instanceof ApplicationContextAware) { + ((ApplicationContextAware) mappingContext).setApplicationContext(applicationContext); + } + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/mapping/ElasticsearchPersistentProperty.java b/src/main/java/org/springframework/data/elasticsearch/core/mapping/ElasticsearchPersistentProperty.java index 328bb2d7c..45ec379fc 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/mapping/ElasticsearchPersistentProperty.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/mapping/ElasticsearchPersistentProperty.java @@ -1,40 +1,40 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.mapping; - -import org.springframework.core.convert.converter.Converter; -import org.springframework.data.mapping.PersistentProperty; - -/** - * ElasticsearchPersistentProperty - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ - -public interface ElasticsearchPersistentProperty extends PersistentProperty { - - String getFieldName(); - - public enum PropertyToFieldNameConverter implements Converter { - - INSTANCE; - - public String convert(ElasticsearchPersistentProperty source) { - return source.getFieldName(); - } - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.mapping; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.data.mapping.PersistentProperty; + +/** + * ElasticsearchPersistentProperty + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ + +public interface ElasticsearchPersistentProperty extends PersistentProperty { + + String getFieldName(); + + public enum PropertyToFieldNameConverter implements Converter { + + INSTANCE; + + public String convert(ElasticsearchPersistentProperty source) { + return source.getFieldName(); + } + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchMappingContext.java b/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchMappingContext.java index 5f537949f..1de14ef94 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchMappingContext.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchMappingContext.java @@ -1,58 +1,58 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.mapping; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.data.mapping.context.AbstractMappingContext; -import org.springframework.data.mapping.model.Property; -import org.springframework.data.mapping.model.SimpleTypeHolder; -import org.springframework.data.util.TypeInformation; - -/** - * SimpleElasticsearchMappingContext - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Mark Paluch - */ -public class SimpleElasticsearchMappingContext extends - AbstractMappingContext, ElasticsearchPersistentProperty> implements ApplicationContextAware { - - private ApplicationContext context; - - @Override - protected SimpleElasticsearchPersistentEntity createPersistentEntity(TypeInformation typeInformation) { - final SimpleElasticsearchPersistentEntity persistentEntity = new SimpleElasticsearchPersistentEntity<>( - typeInformation); - if (context != null) { - persistentEntity.setApplicationContext(context); - } - return persistentEntity; - } - - @Override - protected ElasticsearchPersistentProperty createPersistentProperty(Property property, - SimpleElasticsearchPersistentEntity owner, SimpleTypeHolder simpleTypeHolder) { - return new SimpleElasticsearchPersistentProperty(property, owner, simpleTypeHolder); - } - - @Override - public void setApplicationContext(ApplicationContext context) throws BeansException { - this.context = context; - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.mapping; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.data.mapping.context.AbstractMappingContext; +import org.springframework.data.mapping.model.Property; +import org.springframework.data.mapping.model.SimpleTypeHolder; +import org.springframework.data.util.TypeInformation; + +/** + * SimpleElasticsearchMappingContext + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Mark Paluch + */ +public class SimpleElasticsearchMappingContext extends + AbstractMappingContext, ElasticsearchPersistentProperty> implements ApplicationContextAware { + + private ApplicationContext context; + + @Override + protected SimpleElasticsearchPersistentEntity createPersistentEntity(TypeInformation typeInformation) { + final SimpleElasticsearchPersistentEntity persistentEntity = new SimpleElasticsearchPersistentEntity<>( + typeInformation); + if (context != null) { + persistentEntity.setApplicationContext(context); + } + return persistentEntity; + } + + @Override + protected ElasticsearchPersistentProperty createPersistentProperty(Property property, + SimpleElasticsearchPersistentEntity owner, SimpleTypeHolder simpleTypeHolder) { + return new SimpleElasticsearchPersistentProperty(property, owner, simpleTypeHolder); + } + + @Override + public void setApplicationContext(ApplicationContext context) throws BeansException { + this.context = context; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentProperty.java b/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentProperty.java index 70d2fbbfb..b79b4b200 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentProperty.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentProperty.java @@ -1,65 +1,65 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.mapping; - -import java.util.HashSet; -import java.util.Set; - -import org.springframework.data.mapping.Association; -import org.springframework.data.mapping.PersistentEntity; -import org.springframework.data.mapping.model.AnnotationBasedPersistentProperty; -import org.springframework.data.mapping.model.Property; -import org.springframework.data.mapping.model.SimpleTypeHolder; - -/** - * Elasticsearch specific {@link org.springframework.data.mapping.PersistentProperty} implementation processing - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Mark Paluch - */ -public class SimpleElasticsearchPersistentProperty extends - AnnotationBasedPersistentProperty implements ElasticsearchPersistentProperty { - - private static final Set> SUPPORTED_ID_TYPES = new HashSet<>(); - private static final Set SUPPORTED_ID_PROPERTY_NAMES = new HashSet<>(); - - static { - SUPPORTED_ID_TYPES.add(String.class); - SUPPORTED_ID_PROPERTY_NAMES.add("id"); - SUPPORTED_ID_PROPERTY_NAMES.add("documentId"); - } - - public SimpleElasticsearchPersistentProperty(Property property, - PersistentEntity owner, SimpleTypeHolder simpleTypeHolder) { - super(property, owner, simpleTypeHolder); - } - - @Override - public String getFieldName() { - return getProperty().getName(); - } - - @Override - public boolean isIdProperty() { - return super.isIdProperty() || SUPPORTED_ID_PROPERTY_NAMES.contains(getFieldName()); - } - - @Override - protected Association createAssociation() { - return null; - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.mapping; + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.data.mapping.Association; +import org.springframework.data.mapping.PersistentEntity; +import org.springframework.data.mapping.model.AnnotationBasedPersistentProperty; +import org.springframework.data.mapping.model.Property; +import org.springframework.data.mapping.model.SimpleTypeHolder; + +/** + * Elasticsearch specific {@link org.springframework.data.mapping.PersistentProperty} implementation processing + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Mark Paluch + */ +public class SimpleElasticsearchPersistentProperty extends + AnnotationBasedPersistentProperty implements ElasticsearchPersistentProperty { + + private static final Set> SUPPORTED_ID_TYPES = new HashSet<>(); + private static final Set SUPPORTED_ID_PROPERTY_NAMES = new HashSet<>(); + + static { + SUPPORTED_ID_TYPES.add(String.class); + SUPPORTED_ID_PROPERTY_NAMES.add("id"); + SUPPORTED_ID_PROPERTY_NAMES.add("documentId"); + } + + public SimpleElasticsearchPersistentProperty(Property property, + PersistentEntity owner, SimpleTypeHolder simpleTypeHolder) { + super(property, owner, simpleTypeHolder); + } + + @Override + public String getFieldName() { + return getProperty().getName(); + } + + @Override + public boolean isIdProperty() { + return super.isIdProperty() || SUPPORTED_ID_PROPERTY_NAMES.contains(getFieldName()); + } + + @Override + protected Association createAssociation() { + return null; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/AliasBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/query/AliasBuilder.java index b91ea3508..d139cf5e0 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/AliasBuilder.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/AliasBuilder.java @@ -1,81 +1,81 @@ -/* - * Copyright 2013-2014 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -import java.util.Map; - -import org.elasticsearch.index.query.QueryBuilder; - -/** - * @author Mohsin Husen - */ -public class AliasBuilder { - - private String indexName; - private String aliasName; - private QueryBuilder filterBuilder; - private Map filter; - private String searchRouting; - private String indexRouting; - private String routing; - - public AliasBuilder withIndexName(String indexName) { - this.indexName = indexName; - return this; - } - - public AliasBuilder withAliasName(String aliasName) { - this.aliasName = aliasName; - return this; - } - - public AliasBuilder withFilterBuilder(QueryBuilder filterBuilder) { - this.filterBuilder = filterBuilder; - return this; - } - - public AliasBuilder withFilter(Map filter) { - this.filter = filter; - return this; - } - - public AliasBuilder withSearchRouting(String searchRouting) { - this.searchRouting = searchRouting; - return this; - } - - public AliasBuilder withIndexRouting(String indexRouting) { - this.indexRouting = indexRouting; - return this; - } - - public AliasBuilder withRouting(String routing) { - this.routing = routing; - return this; - } - - public AliasQuery build() { - AliasQuery aliasQuery = new AliasQuery(); - aliasQuery.setIndexName(indexName); - aliasQuery.setAliasName(aliasName); - aliasQuery.setFilterBuilder(filterBuilder); - aliasQuery.setFilter(filter); - aliasQuery.setSearchRouting(searchRouting); - aliasQuery.setIndexRouting(indexRouting); - aliasQuery.setRouting(routing); - return aliasQuery; - } -} +/* + * Copyright 2013-2014 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +import java.util.Map; + +import org.elasticsearch.index.query.QueryBuilder; + +/** + * @author Mohsin Husen + */ +public class AliasBuilder { + + private String indexName; + private String aliasName; + private QueryBuilder filterBuilder; + private Map filter; + private String searchRouting; + private String indexRouting; + private String routing; + + public AliasBuilder withIndexName(String indexName) { + this.indexName = indexName; + return this; + } + + public AliasBuilder withAliasName(String aliasName) { + this.aliasName = aliasName; + return this; + } + + public AliasBuilder withFilterBuilder(QueryBuilder filterBuilder) { + this.filterBuilder = filterBuilder; + return this; + } + + public AliasBuilder withFilter(Map filter) { + this.filter = filter; + return this; + } + + public AliasBuilder withSearchRouting(String searchRouting) { + this.searchRouting = searchRouting; + return this; + } + + public AliasBuilder withIndexRouting(String indexRouting) { + this.indexRouting = indexRouting; + return this; + } + + public AliasBuilder withRouting(String routing) { + this.routing = routing; + return this; + } + + public AliasQuery build() { + AliasQuery aliasQuery = new AliasQuery(); + aliasQuery.setIndexName(indexName); + aliasQuery.setAliasName(aliasName); + aliasQuery.setFilterBuilder(filterBuilder); + aliasQuery.setFilter(filter); + aliasQuery.setSearchRouting(searchRouting); + aliasQuery.setIndexRouting(indexRouting); + aliasQuery.setRouting(routing); + return aliasQuery; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/AliasQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/AliasQuery.java index 1a55f638c..4b65c72ee 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/AliasQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/AliasQuery.java @@ -1,92 +1,92 @@ -/* - * Copyright 2013-2014 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -import java.util.Map; - -import org.elasticsearch.index.query.QueryBuilder; - -/** - * AliasQuery is useful for creating new alias or deleting existing ones - * - * @author Mohsin Husen - */ -public class AliasQuery { - - private String indexName; - private String aliasName; - private QueryBuilder filterBuilder; - private Map filter; - private String searchRouting; - private String indexRouting; - private String routing; - - public String getIndexName() { - return indexName; - } - - public void setIndexName(String indexName) { - this.indexName = indexName; - } - - public String getAliasName() { - return aliasName; - } - - public void setAliasName(String aliasName) { - this.aliasName = aliasName; - } - - public QueryBuilder getFilterBuilder() { - return filterBuilder; - } - - public void setFilterBuilder(QueryBuilder filterBuilder) { - this.filterBuilder = filterBuilder; - } - - public Map getFilter() { - return filter; - } - - public void setFilter(Map filter) { - this.filter = filter; - } - - public String getSearchRouting() { - return searchRouting; - } - - public void setSearchRouting(String searchRouting) { - this.searchRouting = searchRouting; - } - - public String getIndexRouting() { - return indexRouting; - } - - public void setIndexRouting(String indexRouting) { - this.indexRouting = indexRouting; - } - - public String getRouting() { - return routing; - } - - public void setRouting(String routing) { - this.routing = routing; - } -} +/* + * Copyright 2013-2014 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +import java.util.Map; + +import org.elasticsearch.index.query.QueryBuilder; + +/** + * AliasQuery is useful for creating new alias or deleting existing ones + * + * @author Mohsin Husen + */ +public class AliasQuery { + + private String indexName; + private String aliasName; + private QueryBuilder filterBuilder; + private Map filter; + private String searchRouting; + private String indexRouting; + private String routing; + + public String getIndexName() { + return indexName; + } + + public void setIndexName(String indexName) { + this.indexName = indexName; + } + + public String getAliasName() { + return aliasName; + } + + public void setAliasName(String aliasName) { + this.aliasName = aliasName; + } + + public QueryBuilder getFilterBuilder() { + return filterBuilder; + } + + public void setFilterBuilder(QueryBuilder filterBuilder) { + this.filterBuilder = filterBuilder; + } + + public Map getFilter() { + return filter; + } + + public void setFilter(Map filter) { + this.filter = filter; + } + + public String getSearchRouting() { + return searchRouting; + } + + public void setSearchRouting(String searchRouting) { + this.searchRouting = searchRouting; + } + + public String getIndexRouting() { + return indexRouting; + } + + public void setIndexRouting(String indexRouting) { + this.indexRouting = indexRouting; + } + + public String getRouting() { + return routing; + } + + public void setRouting(String routing) { + this.routing = routing; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java b/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java index 627b2af9e..687cf7492 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java @@ -1,619 +1,619 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -import java.util.*; - -import org.apache.commons.lang.StringUtils; -import org.springframework.dao.InvalidDataAccessApiUsageException; -import org.springframework.data.elasticsearch.core.geo.GeoBox; -import org.springframework.data.elasticsearch.core.geo.GeoPoint; -import org.springframework.data.geo.Box; -import org.springframework.data.geo.Distance; -import org.springframework.data.geo.Point; -import org.springframework.util.Assert; - -/** - * Criteria is the central class when constructing queries. It follows more or less a fluent API style, which allows to - * easily chain together multiple criteria. - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Franck Marchand - */ -public class Criteria { - - @Override - public String toString() { - return "Criteria{" + - "field=" + field.getName() + - ", boost=" + boost + - ", negating=" + negating + - ", queryCriteria=" + StringUtils.join(queryCriteria, '|') + - ", filterCriteria=" + StringUtils.join(filterCriteria, '|') + - '}'; - } - - public static final String WILDCARD = "*"; - public static final String CRITERIA_VALUE_SEPERATOR = " "; - - private static final String OR_OPERATOR = " OR "; - private static final String AND_OPERATOR = " AND "; - - private Field field; - private float boost = Float.NaN; - private boolean negating = false; - - private List criteriaChain = new ArrayList<>(1); - - private Set queryCriteria = new LinkedHashSet<>(); - - private Set filterCriteria = new LinkedHashSet<>(); - - public Criteria() { - } - - /** - * Creates a new Criteria with provided field name - * - * @param fieldname - */ - public Criteria(String fieldname) { - this(new SimpleField(fieldname)); - } - - /** - * Creates a new Criteria for the given field - * - * @param field - */ - public Criteria(Field field) { - Assert.notNull(field, "Field for criteria must not be null"); - Assert.hasText(field.getName(), "Field.name for criteria must not be null/empty"); - this.criteriaChain.add(this); - this.field = field; - } - - protected Criteria(List criteriaChain, String fieldname) { - this(criteriaChain, new SimpleField(fieldname)); - } - - protected Criteria(List criteriaChain, Field field) { - Assert.notNull(criteriaChain, "CriteriaChain must not be null"); - Assert.notNull(field, "Field for criteria must not be null"); - Assert.hasText(field.getName(), "Field.name for criteria must not be null/empty"); - - this.criteriaChain.addAll(criteriaChain); - this.criteriaChain.add(this); - this.field = field; - } - - /** - * Static factory method to create a new Criteria for field with given name - * - * @param field - * @return - */ - public static Criteria where(String field) { - return where(new SimpleField(field)); - } - - /** - * Static factory method to create a new Criteria for provided field - * - * @param field - * @return - */ - public static Criteria where(Field field) { - return new Criteria(field); - } - - /** - * Chain using {@code AND} - * - * @param field - * @return - */ - public Criteria and(Field field) { - return new Criteria(this.criteriaChain, field); - } - - /** - * Chain using {@code AND} - * - * @param fieldName - * @return - */ - public Criteria and(String fieldName) { - return new Criteria(this.criteriaChain, fieldName); - } - - /** - * Chain using {@code AND} - * - * @param criteria - * @return - */ - public Criteria and(Criteria criteria) { - this.criteriaChain.add(criteria); - return this; - } - - /** - * Chain using {@code AND} - * - * @param criterias - * @return - */ - public Criteria and(Criteria... criterias) { - this.criteriaChain.addAll(Arrays.asList(criterias)); - return this; - } - - /** - * Chain using {@code OR} - * - * @param field - * @return - */ - public Criteria or(Field field) { - return new OrCriteria(this.criteriaChain, field); - } - - /** - * Chain using {@code OR} - * - * @param criteria - * @return - */ - public Criteria or(Criteria criteria) { - Assert.notNull(criteria, "Cannot chain 'null' criteria."); - - Criteria orConnectedCritiera = new OrCriteria(this.criteriaChain, criteria.getField()); - orConnectedCritiera.queryCriteria.addAll(criteria.queryCriteria); - return orConnectedCritiera; - } - - /** - * Chain using {@code OR} - * - * @param fieldName - * @return - */ - public Criteria or(String fieldName) { - return or(new SimpleField(fieldName)); - } - - /** - * Crates new CriteriaEntry without any wildcards - * - * @param o - * @return - */ - public Criteria is(Object o) { - queryCriteria.add(new CriteriaEntry(OperationKey.EQUALS, o)); - return this; - } - - /** - * Crates new CriteriaEntry with leading and trailing wildcards
- * NOTE: mind your schema as leading wildcards may not be supported and/or execution might be slow. - * - * @param s - * @return - */ - public Criteria contains(String s) { - assertNoBlankInWildcardedQuery(s, true, true); - queryCriteria.add(new CriteriaEntry(OperationKey.CONTAINS, s)); - return this; - } - - /** - * Crates new CriteriaEntry with trailing wildcard - * - * @param s - * @return - */ - public Criteria startsWith(String s) { - assertNoBlankInWildcardedQuery(s, true, false); - queryCriteria.add(new CriteriaEntry(OperationKey.STARTS_WITH, s)); - return this; - } - - /** - * Crates new CriteriaEntry with leading wildcard
- * NOTE: mind your schema and execution times as leading wildcards may not be supported. - * - * @param s - * @return - */ - public Criteria endsWith(String s) { - assertNoBlankInWildcardedQuery(s, false, true); - queryCriteria.add(new CriteriaEntry(OperationKey.ENDS_WITH, s)); - return this; - } - - /** - * Crates new CriteriaEntry with trailing - - * - * @return - */ - public Criteria not() { - this.negating = true; - return this; - } - - /** - * Crates new CriteriaEntry with trailing ~ - * - * @param s - * @return - */ - public Criteria fuzzy(String s) { - queryCriteria.add(new CriteriaEntry(OperationKey.FUZZY, s)); - return this; - } - - /** - * Crates new CriteriaEntry allowing native elasticsearch expressions - * - * @param s - * @return - */ - public Criteria expression(String s) { - queryCriteria.add(new CriteriaEntry(OperationKey.EXPRESSION, s)); - return this; - } - - /** - * Boost positive hit with given factor. eg. ^2.3 - * - * @param boost - * @return - */ - public Criteria boost(float boost) { - if (boost < 0) { - throw new InvalidDataAccessApiUsageException("Boost must not be negative."); - } - this.boost = boost; - return this; - } - - /** - * Crates new CriteriaEntry for {@code RANGE [lowerBound TO upperBound]} - * - * @param lowerBound - * @param upperBound - * @return - */ - public Criteria between(Object lowerBound, Object upperBound) { - if (lowerBound == null && upperBound == null) { - throw new InvalidDataAccessApiUsageException("Range [* TO *] is not allowed"); - } - - queryCriteria.add(new CriteriaEntry(OperationKey.BETWEEN, new Object[]{lowerBound, upperBound})); - return this; - } - - /** - * Crates new CriteriaEntry for {@code RANGE [* TO upperBound]} - * - * @param upperBound - * @return - */ - public Criteria lessThanEqual(Object upperBound) { - if (upperBound == null) { - throw new InvalidDataAccessApiUsageException("UpperBound can't be null"); - } - queryCriteria.add(new CriteriaEntry(OperationKey.LESS_EQUAL, upperBound)); - return this; - } - - public Criteria lessThan(Object upperBound) { - if (upperBound == null) { - throw new InvalidDataAccessApiUsageException("UpperBound can't be null"); - } - queryCriteria.add(new CriteriaEntry(OperationKey.LESS, upperBound)); - return this; - } - - /** - * Crates new CriteriaEntry for {@code RANGE [lowerBound TO *]} - * - * @param lowerBound - * @return - */ - public Criteria greaterThanEqual(Object lowerBound) { - if (lowerBound == null) { - throw new InvalidDataAccessApiUsageException("LowerBound can't be null"); - } - queryCriteria.add(new CriteriaEntry(OperationKey.GREATER_EQUAL, lowerBound)); - return this; - } - - public Criteria greaterThan(Object lowerBound) { - if (lowerBound == null) { - throw new InvalidDataAccessApiUsageException("LowerBound can't be null"); - } - queryCriteria.add(new CriteriaEntry(OperationKey.GREATER, lowerBound)); - return this; - } - - /** - * Crates new CriteriaEntry for multiple values {@code (arg0 arg1 arg2 ...)} - * - * @param values - * @return - */ - public Criteria in(Object... values) { - return in(toCollection(values)); - } - - /** - * Crates new CriteriaEntry for multiple values {@code (arg0 arg1 arg2 ...)} - * - * @param values the collection containing the values to match against - * @return - */ - public Criteria in(Iterable values) { - Assert.notNull(values, "Collection of 'in' values must not be null"); - queryCriteria.add(new CriteriaEntry(OperationKey.IN, values)); - return this; - } - - private List toCollection(Object... values) { - if (values.length == 0 || (values.length > 1 && values[1] instanceof Collection)) { - throw new InvalidDataAccessApiUsageException("At least one element " - + (values.length > 0 ? ("of argument of type " + values[1].getClass().getName()) : "") - + " has to be present."); - } - return Arrays.asList(values); - } - - public Criteria notIn(Object... values) { - return notIn(toCollection(values)); - } - - public Criteria notIn(Iterable values) { - Assert.notNull(values, "Collection of 'NotIn' values must not be null"); - queryCriteria.add(new CriteriaEntry(OperationKey.NOT_IN, values)); - return this; - } - - /** - * Creates new CriteriaEntry for {@code location WITHIN distance} - * - * @param location {@link org.springframework.data.elasticsearch.core.geo.GeoPoint} center coordinates - * @param distance {@link String} radius as a string (e.g. : '100km'). - * Distance unit : - * either mi/miles or km can be set - * @return Criteria the chaind criteria with the new 'within' criteria included. - */ - public Criteria within(GeoPoint location, String distance) { - Assert.notNull(location, "Location value for near criteria must not be null"); - Assert.notNull(location, "Distance value for near criteria must not be null"); - filterCriteria.add(new CriteriaEntry(OperationKey.WITHIN, new Object[]{location, distance})); - return this; - } - - /** - * Creates new CriteriaEntry for {@code location WITHIN distance} - * - * @param location {@link org.springframework.data.geo.Point} center coordinates - * @param distance {@link org.springframework.data.geo.Distance} radius - * . - * @return Criteria the chaind criteria with the new 'within' criteria included. - */ - public Criteria within(Point location, Distance distance) { - Assert.notNull(location, "Location value for near criteria must not be null"); - Assert.notNull(location, "Distance value for near criteria must not be null"); - filterCriteria.add(new CriteriaEntry(OperationKey.WITHIN, new Object[]{location, distance})); - return this; - } - - /** - * Creates new CriteriaEntry for {@code geoLocation WITHIN distance} - * - * @param geoLocation {@link String} center point - * supported formats: - * lat on = > "41.2,45.1", - * geohash = > "asd9as0d" - * @param distance {@link String} radius as a string (e.g. : '100km'). - * Distance unit : - * either mi/miles or km can be set - * @return - */ - public Criteria within(String geoLocation, String distance) { - Assert.isTrue(StringUtils.isNotBlank(geoLocation), "geoLocation value must not be null"); - filterCriteria.add(new CriteriaEntry(OperationKey.WITHIN, new Object[]{geoLocation, distance})); - return this; - } - - /** - * Creates new CriteriaEntry for {@code location GeoBox bounding box} - * - * @param boundingBox {@link org.springframework.data.elasticsearch.core.geo.GeoBox} bounding box(left top corner + right bottom corner) - * @return Criteria the chaind criteria with the new 'boundingBox' criteria included. - */ - public Criteria boundedBy(GeoBox boundingBox) { - Assert.notNull(boundingBox, "boundingBox value for boundedBy criteria must not be null"); - filterCriteria.add(new CriteriaEntry(OperationKey.BBOX, new Object[]{boundingBox})); - return this; - } - - /** - * Creates new CriteriaEntry for {@code location Box bounding box} - * - * @param boundingBox {@link org.springframework.data.elasticsearch.core.geo.GeoBox} bounding box(left top corner + right bottom corner) - * @return Criteria the chaind criteria with the new 'boundingBox' criteria included. - */ - public Criteria boundedBy(Box boundingBox) { - Assert.notNull(boundingBox, "boundingBox value for boundedBy criteria must not be null"); - filterCriteria.add(new CriteriaEntry(OperationKey.BBOX, new Object[]{boundingBox.getFirst(), boundingBox.getSecond()})); - return this; - } - - /** - * Creates new CriteriaEntry for bounding box created from points - * - * @param topLeftGeohash left top corner of bounding box as geohash - * @param bottomRightGeohash right bottom corner of bounding box as geohash - * @return Criteria the chaind criteria with the new 'boundedBy' criteria included. - */ - public Criteria boundedBy(String topLeftGeohash, String bottomRightGeohash) { - Assert.isTrue(StringUtils.isNotBlank(topLeftGeohash), "topLeftGeohash must not be empty"); - Assert.isTrue(StringUtils.isNotBlank(bottomRightGeohash), "bottomRightGeohash must not be empty"); - filterCriteria.add(new CriteriaEntry(OperationKey.BBOX, new Object[]{topLeftGeohash, bottomRightGeohash})); - return this; - } - - /** - * Creates new CriteriaEntry for bounding box created from points - * - * @param topLeftPoint left top corner of bounding box - * @param bottomRightPoint right bottom corner of bounding box - * @return Criteria the chaind criteria with the new 'boundedBy' criteria included. - */ - public Criteria boundedBy(GeoPoint topLeftPoint, GeoPoint bottomRightPoint) { - Assert.notNull(topLeftPoint, "topLeftPoint must not be null"); - Assert.notNull(bottomRightPoint, "bottomRightPoint must not be null"); - filterCriteria.add(new CriteriaEntry(OperationKey.BBOX, new Object[]{topLeftPoint, bottomRightPoint})); - return this; - } - - public Criteria boundedBy(Point topLeftPoint, Point bottomRightPoint) { - Assert.notNull(topLeftPoint, "topLeftPoint must not be null"); - Assert.notNull(bottomRightPoint, "bottomRightPoint must not be null"); - filterCriteria.add(new CriteriaEntry(OperationKey.BBOX, new Object[]{GeoPoint.fromPoint(topLeftPoint), GeoPoint.fromPoint(bottomRightPoint)})); - return this; - } - - private void assertNoBlankInWildcardedQuery(String searchString, boolean leadingWildcard, boolean trailingWildcard) { - if (StringUtils.contains(searchString, CRITERIA_VALUE_SEPERATOR)) { - throw new InvalidDataAccessApiUsageException("Cannot constructQuery '" + (leadingWildcard ? "*" : "") + "\"" - + searchString + "\"" + (trailingWildcard ? "*" : "") + "'. Use expression or multiple clauses instead."); - } - } - - /** - * Field targeted by this Criteria - * - * @return - */ - public Field getField() { - return this.field; - } - - public Set getQueryCriteriaEntries() { - return Collections.unmodifiableSet(this.queryCriteria); - } - - public Set getFilterCriteriaEntries() { - return Collections.unmodifiableSet(this.filterCriteria); - } - - public Set getFilterCriteria() { - return filterCriteria; - } - - /** - * Conjunction to be used with this criteria (AND | OR) - * - * @return - */ - public String getConjunctionOperator() { - return AND_OPERATOR; - } - - public List getCriteriaChain() { - return Collections.unmodifiableList(this.criteriaChain); - } - - public boolean isNegating() { - return this.negating; - } - - public boolean isAnd() { - return AND_OPERATOR == getConjunctionOperator(); - } - - public boolean isOr() { - return OR_OPERATOR == getConjunctionOperator(); - } - - public float getBoost() { - return this.boost; - } - - static class OrCriteria extends Criteria { - - public OrCriteria() { - super(); - } - - public OrCriteria(Field field) { - super(field); - } - - public OrCriteria(List criteriaChain, Field field) { - super(criteriaChain, field); - } - - public OrCriteria(List criteriaChain, String fieldname) { - super(criteriaChain, fieldname); - } - - public OrCriteria(String fieldname) { - super(fieldname); - } - - @Override - public String getConjunctionOperator() { - return OR_OPERATOR; - } - } - - public enum OperationKey { - EQUALS, CONTAINS, STARTS_WITH, ENDS_WITH, EXPRESSION, BETWEEN, FUZZY, IN, NOT_IN, WITHIN, BBOX, NEAR, LESS, LESS_EQUAL, GREATER, GREATER_EQUAL; - } - - public static class CriteriaEntry { - - private OperationKey key; - private Object value; - - CriteriaEntry(OperationKey key, Object value) { - this.key = key; - this.value = value; - } - - public OperationKey getKey() { - return key; - } - - public Object getValue() { - return value; - } - - @Override - public String toString() { - return "CriteriaEntry{" + - "key=" + key + - ", value=" + value + - '}'; - } - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +import java.util.*; + +import org.apache.commons.lang.StringUtils; +import org.springframework.dao.InvalidDataAccessApiUsageException; +import org.springframework.data.elasticsearch.core.geo.GeoBox; +import org.springframework.data.elasticsearch.core.geo.GeoPoint; +import org.springframework.data.geo.Box; +import org.springframework.data.geo.Distance; +import org.springframework.data.geo.Point; +import org.springframework.util.Assert; + +/** + * Criteria is the central class when constructing queries. It follows more or less a fluent API style, which allows to + * easily chain together multiple criteria. + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Franck Marchand + */ +public class Criteria { + + @Override + public String toString() { + return "Criteria{" + + "field=" + field.getName() + + ", boost=" + boost + + ", negating=" + negating + + ", queryCriteria=" + StringUtils.join(queryCriteria, '|') + + ", filterCriteria=" + StringUtils.join(filterCriteria, '|') + + '}'; + } + + public static final String WILDCARD = "*"; + public static final String CRITERIA_VALUE_SEPERATOR = " "; + + private static final String OR_OPERATOR = " OR "; + private static final String AND_OPERATOR = " AND "; + + private Field field; + private float boost = Float.NaN; + private boolean negating = false; + + private List criteriaChain = new ArrayList<>(1); + + private Set queryCriteria = new LinkedHashSet<>(); + + private Set filterCriteria = new LinkedHashSet<>(); + + public Criteria() { + } + + /** + * Creates a new Criteria with provided field name + * + * @param fieldname + */ + public Criteria(String fieldname) { + this(new SimpleField(fieldname)); + } + + /** + * Creates a new Criteria for the given field + * + * @param field + */ + public Criteria(Field field) { + Assert.notNull(field, "Field for criteria must not be null"); + Assert.hasText(field.getName(), "Field.name for criteria must not be null/empty"); + this.criteriaChain.add(this); + this.field = field; + } + + protected Criteria(List criteriaChain, String fieldname) { + this(criteriaChain, new SimpleField(fieldname)); + } + + protected Criteria(List criteriaChain, Field field) { + Assert.notNull(criteriaChain, "CriteriaChain must not be null"); + Assert.notNull(field, "Field for criteria must not be null"); + Assert.hasText(field.getName(), "Field.name for criteria must not be null/empty"); + + this.criteriaChain.addAll(criteriaChain); + this.criteriaChain.add(this); + this.field = field; + } + + /** + * Static factory method to create a new Criteria for field with given name + * + * @param field + * @return + */ + public static Criteria where(String field) { + return where(new SimpleField(field)); + } + + /** + * Static factory method to create a new Criteria for provided field + * + * @param field + * @return + */ + public static Criteria where(Field field) { + return new Criteria(field); + } + + /** + * Chain using {@code AND} + * + * @param field + * @return + */ + public Criteria and(Field field) { + return new Criteria(this.criteriaChain, field); + } + + /** + * Chain using {@code AND} + * + * @param fieldName + * @return + */ + public Criteria and(String fieldName) { + return new Criteria(this.criteriaChain, fieldName); + } + + /** + * Chain using {@code AND} + * + * @param criteria + * @return + */ + public Criteria and(Criteria criteria) { + this.criteriaChain.add(criteria); + return this; + } + + /** + * Chain using {@code AND} + * + * @param criterias + * @return + */ + public Criteria and(Criteria... criterias) { + this.criteriaChain.addAll(Arrays.asList(criterias)); + return this; + } + + /** + * Chain using {@code OR} + * + * @param field + * @return + */ + public Criteria or(Field field) { + return new OrCriteria(this.criteriaChain, field); + } + + /** + * Chain using {@code OR} + * + * @param criteria + * @return + */ + public Criteria or(Criteria criteria) { + Assert.notNull(criteria, "Cannot chain 'null' criteria."); + + Criteria orConnectedCritiera = new OrCriteria(this.criteriaChain, criteria.getField()); + orConnectedCritiera.queryCriteria.addAll(criteria.queryCriteria); + return orConnectedCritiera; + } + + /** + * Chain using {@code OR} + * + * @param fieldName + * @return + */ + public Criteria or(String fieldName) { + return or(new SimpleField(fieldName)); + } + + /** + * Crates new CriteriaEntry without any wildcards + * + * @param o + * @return + */ + public Criteria is(Object o) { + queryCriteria.add(new CriteriaEntry(OperationKey.EQUALS, o)); + return this; + } + + /** + * Crates new CriteriaEntry with leading and trailing wildcards
+ * NOTE: mind your schema as leading wildcards may not be supported and/or execution might be slow. + * + * @param s + * @return + */ + public Criteria contains(String s) { + assertNoBlankInWildcardedQuery(s, true, true); + queryCriteria.add(new CriteriaEntry(OperationKey.CONTAINS, s)); + return this; + } + + /** + * Crates new CriteriaEntry with trailing wildcard + * + * @param s + * @return + */ + public Criteria startsWith(String s) { + assertNoBlankInWildcardedQuery(s, true, false); + queryCriteria.add(new CriteriaEntry(OperationKey.STARTS_WITH, s)); + return this; + } + + /** + * Crates new CriteriaEntry with leading wildcard
+ * NOTE: mind your schema and execution times as leading wildcards may not be supported. + * + * @param s + * @return + */ + public Criteria endsWith(String s) { + assertNoBlankInWildcardedQuery(s, false, true); + queryCriteria.add(new CriteriaEntry(OperationKey.ENDS_WITH, s)); + return this; + } + + /** + * Crates new CriteriaEntry with trailing - + * + * @return + */ + public Criteria not() { + this.negating = true; + return this; + } + + /** + * Crates new CriteriaEntry with trailing ~ + * + * @param s + * @return + */ + public Criteria fuzzy(String s) { + queryCriteria.add(new CriteriaEntry(OperationKey.FUZZY, s)); + return this; + } + + /** + * Crates new CriteriaEntry allowing native elasticsearch expressions + * + * @param s + * @return + */ + public Criteria expression(String s) { + queryCriteria.add(new CriteriaEntry(OperationKey.EXPRESSION, s)); + return this; + } + + /** + * Boost positive hit with given factor. eg. ^2.3 + * + * @param boost + * @return + */ + public Criteria boost(float boost) { + if (boost < 0) { + throw new InvalidDataAccessApiUsageException("Boost must not be negative."); + } + this.boost = boost; + return this; + } + + /** + * Crates new CriteriaEntry for {@code RANGE [lowerBound TO upperBound]} + * + * @param lowerBound + * @param upperBound + * @return + */ + public Criteria between(Object lowerBound, Object upperBound) { + if (lowerBound == null && upperBound == null) { + throw new InvalidDataAccessApiUsageException("Range [* TO *] is not allowed"); + } + + queryCriteria.add(new CriteriaEntry(OperationKey.BETWEEN, new Object[]{lowerBound, upperBound})); + return this; + } + + /** + * Crates new CriteriaEntry for {@code RANGE [* TO upperBound]} + * + * @param upperBound + * @return + */ + public Criteria lessThanEqual(Object upperBound) { + if (upperBound == null) { + throw new InvalidDataAccessApiUsageException("UpperBound can't be null"); + } + queryCriteria.add(new CriteriaEntry(OperationKey.LESS_EQUAL, upperBound)); + return this; + } + + public Criteria lessThan(Object upperBound) { + if (upperBound == null) { + throw new InvalidDataAccessApiUsageException("UpperBound can't be null"); + } + queryCriteria.add(new CriteriaEntry(OperationKey.LESS, upperBound)); + return this; + } + + /** + * Crates new CriteriaEntry for {@code RANGE [lowerBound TO *]} + * + * @param lowerBound + * @return + */ + public Criteria greaterThanEqual(Object lowerBound) { + if (lowerBound == null) { + throw new InvalidDataAccessApiUsageException("LowerBound can't be null"); + } + queryCriteria.add(new CriteriaEntry(OperationKey.GREATER_EQUAL, lowerBound)); + return this; + } + + public Criteria greaterThan(Object lowerBound) { + if (lowerBound == null) { + throw new InvalidDataAccessApiUsageException("LowerBound can't be null"); + } + queryCriteria.add(new CriteriaEntry(OperationKey.GREATER, lowerBound)); + return this; + } + + /** + * Crates new CriteriaEntry for multiple values {@code (arg0 arg1 arg2 ...)} + * + * @param values + * @return + */ + public Criteria in(Object... values) { + return in(toCollection(values)); + } + + /** + * Crates new CriteriaEntry for multiple values {@code (arg0 arg1 arg2 ...)} + * + * @param values the collection containing the values to match against + * @return + */ + public Criteria in(Iterable values) { + Assert.notNull(values, "Collection of 'in' values must not be null"); + queryCriteria.add(new CriteriaEntry(OperationKey.IN, values)); + return this; + } + + private List toCollection(Object... values) { + if (values.length == 0 || (values.length > 1 && values[1] instanceof Collection)) { + throw new InvalidDataAccessApiUsageException("At least one element " + + (values.length > 0 ? ("of argument of type " + values[1].getClass().getName()) : "") + + " has to be present."); + } + return Arrays.asList(values); + } + + public Criteria notIn(Object... values) { + return notIn(toCollection(values)); + } + + public Criteria notIn(Iterable values) { + Assert.notNull(values, "Collection of 'NotIn' values must not be null"); + queryCriteria.add(new CriteriaEntry(OperationKey.NOT_IN, values)); + return this; + } + + /** + * Creates new CriteriaEntry for {@code location WITHIN distance} + * + * @param location {@link org.springframework.data.elasticsearch.core.geo.GeoPoint} center coordinates + * @param distance {@link String} radius as a string (e.g. : '100km'). + * Distance unit : + * either mi/miles or km can be set + * @return Criteria the chaind criteria with the new 'within' criteria included. + */ + public Criteria within(GeoPoint location, String distance) { + Assert.notNull(location, "Location value for near criteria must not be null"); + Assert.notNull(location, "Distance value for near criteria must not be null"); + filterCriteria.add(new CriteriaEntry(OperationKey.WITHIN, new Object[]{location, distance})); + return this; + } + + /** + * Creates new CriteriaEntry for {@code location WITHIN distance} + * + * @param location {@link org.springframework.data.geo.Point} center coordinates + * @param distance {@link org.springframework.data.geo.Distance} radius + * . + * @return Criteria the chaind criteria with the new 'within' criteria included. + */ + public Criteria within(Point location, Distance distance) { + Assert.notNull(location, "Location value for near criteria must not be null"); + Assert.notNull(location, "Distance value for near criteria must not be null"); + filterCriteria.add(new CriteriaEntry(OperationKey.WITHIN, new Object[]{location, distance})); + return this; + } + + /** + * Creates new CriteriaEntry for {@code geoLocation WITHIN distance} + * + * @param geoLocation {@link String} center point + * supported formats: + * lat on = > "41.2,45.1", + * geohash = > "asd9as0d" + * @param distance {@link String} radius as a string (e.g. : '100km'). + * Distance unit : + * either mi/miles or km can be set + * @return + */ + public Criteria within(String geoLocation, String distance) { + Assert.isTrue(StringUtils.isNotBlank(geoLocation), "geoLocation value must not be null"); + filterCriteria.add(new CriteriaEntry(OperationKey.WITHIN, new Object[]{geoLocation, distance})); + return this; + } + + /** + * Creates new CriteriaEntry for {@code location GeoBox bounding box} + * + * @param boundingBox {@link org.springframework.data.elasticsearch.core.geo.GeoBox} bounding box(left top corner + right bottom corner) + * @return Criteria the chaind criteria with the new 'boundingBox' criteria included. + */ + public Criteria boundedBy(GeoBox boundingBox) { + Assert.notNull(boundingBox, "boundingBox value for boundedBy criteria must not be null"); + filterCriteria.add(new CriteriaEntry(OperationKey.BBOX, new Object[]{boundingBox})); + return this; + } + + /** + * Creates new CriteriaEntry for {@code location Box bounding box} + * + * @param boundingBox {@link org.springframework.data.elasticsearch.core.geo.GeoBox} bounding box(left top corner + right bottom corner) + * @return Criteria the chaind criteria with the new 'boundingBox' criteria included. + */ + public Criteria boundedBy(Box boundingBox) { + Assert.notNull(boundingBox, "boundingBox value for boundedBy criteria must not be null"); + filterCriteria.add(new CriteriaEntry(OperationKey.BBOX, new Object[]{boundingBox.getFirst(), boundingBox.getSecond()})); + return this; + } + + /** + * Creates new CriteriaEntry for bounding box created from points + * + * @param topLeftGeohash left top corner of bounding box as geohash + * @param bottomRightGeohash right bottom corner of bounding box as geohash + * @return Criteria the chaind criteria with the new 'boundedBy' criteria included. + */ + public Criteria boundedBy(String topLeftGeohash, String bottomRightGeohash) { + Assert.isTrue(StringUtils.isNotBlank(topLeftGeohash), "topLeftGeohash must not be empty"); + Assert.isTrue(StringUtils.isNotBlank(bottomRightGeohash), "bottomRightGeohash must not be empty"); + filterCriteria.add(new CriteriaEntry(OperationKey.BBOX, new Object[]{topLeftGeohash, bottomRightGeohash})); + return this; + } + + /** + * Creates new CriteriaEntry for bounding box created from points + * + * @param topLeftPoint left top corner of bounding box + * @param bottomRightPoint right bottom corner of bounding box + * @return Criteria the chaind criteria with the new 'boundedBy' criteria included. + */ + public Criteria boundedBy(GeoPoint topLeftPoint, GeoPoint bottomRightPoint) { + Assert.notNull(topLeftPoint, "topLeftPoint must not be null"); + Assert.notNull(bottomRightPoint, "bottomRightPoint must not be null"); + filterCriteria.add(new CriteriaEntry(OperationKey.BBOX, new Object[]{topLeftPoint, bottomRightPoint})); + return this; + } + + public Criteria boundedBy(Point topLeftPoint, Point bottomRightPoint) { + Assert.notNull(topLeftPoint, "topLeftPoint must not be null"); + Assert.notNull(bottomRightPoint, "bottomRightPoint must not be null"); + filterCriteria.add(new CriteriaEntry(OperationKey.BBOX, new Object[]{GeoPoint.fromPoint(topLeftPoint), GeoPoint.fromPoint(bottomRightPoint)})); + return this; + } + + private void assertNoBlankInWildcardedQuery(String searchString, boolean leadingWildcard, boolean trailingWildcard) { + if (StringUtils.contains(searchString, CRITERIA_VALUE_SEPERATOR)) { + throw new InvalidDataAccessApiUsageException("Cannot constructQuery '" + (leadingWildcard ? "*" : "") + "\"" + + searchString + "\"" + (trailingWildcard ? "*" : "") + "'. Use expression or multiple clauses instead."); + } + } + + /** + * Field targeted by this Criteria + * + * @return + */ + public Field getField() { + return this.field; + } + + public Set getQueryCriteriaEntries() { + return Collections.unmodifiableSet(this.queryCriteria); + } + + public Set getFilterCriteriaEntries() { + return Collections.unmodifiableSet(this.filterCriteria); + } + + public Set getFilterCriteria() { + return filterCriteria; + } + + /** + * Conjunction to be used with this criteria (AND | OR) + * + * @return + */ + public String getConjunctionOperator() { + return AND_OPERATOR; + } + + public List getCriteriaChain() { + return Collections.unmodifiableList(this.criteriaChain); + } + + public boolean isNegating() { + return this.negating; + } + + public boolean isAnd() { + return AND_OPERATOR == getConjunctionOperator(); + } + + public boolean isOr() { + return OR_OPERATOR == getConjunctionOperator(); + } + + public float getBoost() { + return this.boost; + } + + static class OrCriteria extends Criteria { + + public OrCriteria() { + super(); + } + + public OrCriteria(Field field) { + super(field); + } + + public OrCriteria(List criteriaChain, Field field) { + super(criteriaChain, field); + } + + public OrCriteria(List criteriaChain, String fieldname) { + super(criteriaChain, fieldname); + } + + public OrCriteria(String fieldname) { + super(fieldname); + } + + @Override + public String getConjunctionOperator() { + return OR_OPERATOR; + } + } + + public enum OperationKey { + EQUALS, CONTAINS, STARTS_WITH, ENDS_WITH, EXPRESSION, BETWEEN, FUZZY, IN, NOT_IN, WITHIN, BBOX, NEAR, LESS, LESS_EQUAL, GREATER, GREATER_EQUAL; + } + + public static class CriteriaEntry { + + private OperationKey key; + private Object value; + + CriteriaEntry(OperationKey key, Object value) { + this.key = key; + this.value = value; + } + + public OperationKey getKey() { + return key; + } + + public Object getValue() { + return value; + } + + @Override + public String toString() { + return "CriteriaEntry{" + + "key=" + key + + ", value=" + value + + '}'; + } + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/CriteriaQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/CriteriaQuery.java index 5e9d91760..00b5cb159 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/CriteriaQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/CriteriaQuery.java @@ -1,82 +1,82 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -import org.springframework.data.domain.Pageable; -import org.springframework.util.Assert; - -/** - * CriteriaQuery - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Mark Paluch - */ -public class CriteriaQuery extends AbstractQuery { - - private Criteria criteria; - - private CriteriaQuery() {} - - public CriteriaQuery(Criteria criteria) { - this(criteria, Pageable.unpaged()); - } - - public CriteriaQuery(Criteria criteria, Pageable pageable) { - - Assert.notNull(criteria, "Criteria must not be null!"); - Assert.notNull(pageable, "Pageable must not be null!"); - - this.criteria = criteria; - this.pageable = pageable; - this.addSort(pageable.getSort()); - } - - public static final Query fromQuery(CriteriaQuery source) { - return fromQuery(source, new CriteriaQuery()); - } - - public static T fromQuery(CriteriaQuery source, T destination) { - if (source == null || destination == null) { - return null; - } - - if (source.getCriteria() != null) { - destination.addCriteria(source.getCriteria()); - } - - if (source.getSort() != null) { - destination.addSort(source.getSort()); - } - - return destination; - } - - @SuppressWarnings("unchecked") - public final T addCriteria(Criteria criteria) { - Assert.notNull(criteria, "Cannot add null criteria."); - if (this.criteria == null) { - this.criteria = criteria; - } else { - this.criteria.and(criteria); - } - return (T) this; - } - - public Criteria getCriteria() { - return this.criteria; - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +import org.springframework.data.domain.Pageable; +import org.springframework.util.Assert; + +/** + * CriteriaQuery + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Mark Paluch + */ +public class CriteriaQuery extends AbstractQuery { + + private Criteria criteria; + + private CriteriaQuery() {} + + public CriteriaQuery(Criteria criteria) { + this(criteria, Pageable.unpaged()); + } + + public CriteriaQuery(Criteria criteria, Pageable pageable) { + + Assert.notNull(criteria, "Criteria must not be null!"); + Assert.notNull(pageable, "Pageable must not be null!"); + + this.criteria = criteria; + this.pageable = pageable; + this.addSort(pageable.getSort()); + } + + public static final Query fromQuery(CriteriaQuery source) { + return fromQuery(source, new CriteriaQuery()); + } + + public static T fromQuery(CriteriaQuery source, T destination) { + if (source == null || destination == null) { + return null; + } + + if (source.getCriteria() != null) { + destination.addCriteria(source.getCriteria()); + } + + if (source.getSort() != null) { + destination.addSort(source.getSort()); + } + + return destination; + } + + @SuppressWarnings("unchecked") + public final T addCriteria(Criteria criteria) { + Assert.notNull(criteria, "Cannot add null criteria."); + if (this.criteria == null) { + this.criteria = criteria; + } else { + this.criteria.and(criteria); + } + return (T) this; + } + + public Criteria getCriteria() { + return this.criteria; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/DeleteQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/DeleteQuery.java index d36a8bdae..be2cae43b 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/DeleteQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/DeleteQuery.java @@ -1,73 +1,73 @@ -/* - * Copyright 2013-2016 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -import org.elasticsearch.index.query.QueryBuilder; - -/** - * DeleteQuery - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ -public class DeleteQuery { - - private QueryBuilder query; - private String index; - private String type; - private Integer pageSize; - private Long scrollTimeInMillis; - - public QueryBuilder getQuery() { - return query; - } - - public void setQuery(QueryBuilder query) { - this.query = query; - } - - public String getIndex() { - return index; - } - - public void setIndex(String index) { - this.index = index; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public Integer getPageSize() { - return pageSize; - } - - public void setPageSize(Integer pageSize) { - this.pageSize = pageSize; - } - - public Long getScrollTimeInMillis() { - return scrollTimeInMillis; - } - - public void setScrollTimeInMillis(Long scrollTimeInMillis) { - this.scrollTimeInMillis = scrollTimeInMillis; - } -} +/* + * Copyright 2013-2016 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +import org.elasticsearch.index.query.QueryBuilder; + +/** + * DeleteQuery + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public class DeleteQuery { + + private QueryBuilder query; + private String index; + private String type; + private Integer pageSize; + private Long scrollTimeInMillis; + + public QueryBuilder getQuery() { + return query; + } + + public void setQuery(QueryBuilder query) { + this.query = query; + } + + public String getIndex() { + return index; + } + + public void setIndex(String index) { + this.index = index; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public Long getScrollTimeInMillis() { + return scrollTimeInMillis; + } + + public void setScrollTimeInMillis(Long scrollTimeInMillis) { + this.scrollTimeInMillis = scrollTimeInMillis; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/Field.java b/src/main/java/org/springframework/data/elasticsearch/core/query/Field.java index 0be8a3363..33c097da6 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/Field.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/Field.java @@ -1,32 +1,32 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -/** - * Defines a Field that can be used within a Criteria. - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ -public interface Field { - - /** - * Get the name of the field used in schema.xml of elasticsearch server - * - * @return - */ - String getName(); -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +/** + * Defines a Field that can be used within a Criteria. + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public interface Field { + + /** + * Get the name of the field used in schema.xml of elasticsearch server + * + * @return + */ + String getName(); +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/GetQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/GetQuery.java index 53dcd55de..c5409d5b3 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/GetQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/GetQuery.java @@ -1,35 +1,35 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -/** - * GetQuery - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ -public class GetQuery { - - private String id; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +/** + * GetQuery + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public class GetQuery { + + private String id; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/IndexQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/IndexQuery.java index b3ffb1678..69a0b9119 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/IndexQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/IndexQuery.java @@ -1,90 +1,90 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -/** - * IndexQuery - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ - -public class IndexQuery { - - private String id; - private Object object; - private Long version; - private String indexName; - private String type; - private String source; - private String parentId; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public Object getObject() { - return object; - } - - public void setObject(Object object) { - this.object = object; - } - - public Long getVersion() { - return version; - } - - public void setVersion(Long version) { - this.version = version; - } - - public String getIndexName() { - return indexName; - } - - public void setIndexName(String indexName) { - this.indexName = indexName; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getSource() { - return source; - } - - public void setSource(String source) { - this.source = source; - } - - public String getParentId() { - return parentId; - } - - public void setParentId(String parentId) { - this.parentId = parentId; - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +/** + * IndexQuery + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ + +public class IndexQuery { + + private String id; + private Object object; + private Long version; + private String indexName; + private String type; + private String source; + private String parentId; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Object getObject() { + return object; + } + + public void setObject(Object object) { + this.object = object; + } + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } + + public String getIndexName() { + return indexName; + } + + public void setIndexName(String indexName) { + this.indexName = indexName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/MoreLikeThisQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/MoreLikeThisQuery.java index 3311432e2..610e3171c 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/MoreLikeThisQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/MoreLikeThisQuery.java @@ -1,187 +1,187 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -import static java.util.Collections.addAll; -import static org.springframework.data.elasticsearch.core.query.AbstractQuery.*; - -import java.util.ArrayList; -import java.util.List; - -import org.springframework.data.domain.Pageable; - -/** - * MoreLikeThisQuery - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ -public class MoreLikeThisQuery { - - private String id; - private String indexName; - private String type; - private List searchIndices = new ArrayList<>(); - private List searchTypes = new ArrayList<>(); - private List fields = new ArrayList<>(); - private String routing; - private Float percentTermsToMatch; - private Integer minTermFreq; - private Integer maxQueryTerms; - private List stopWords = new ArrayList<>(); - private Integer minDocFreq; - private Integer maxDocFreq; - private Integer minWordLen; - private Integer maxWordLen; - private Float boostTerms; - private Pageable pageable = DEFAULT_PAGE; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getIndexName() { - return indexName; - } - - public void setIndexName(String indexName) { - this.indexName = indexName; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public List getSearchIndices() { - return searchIndices; - } - - public void addSearchIndices(String... searchIndices) { - addAll(this.searchIndices, searchIndices); - } - - public List getSearchTypes() { - return searchTypes; - } - - public void addSearchTypes(String... searchTypes) { - addAll(this.searchTypes, searchTypes); - } - - public List getFields() { - return fields; - } - - public void addFields(String... fields) { - addAll(this.fields, fields); - } - - public String getRouting() { - return routing; - } - - public void setRouting(String routing) { - this.routing = routing; - } - - public Float getPercentTermsToMatch() { - return percentTermsToMatch; - } - - public void setPercentTermsToMatch(Float percentTermsToMatch) { - this.percentTermsToMatch = percentTermsToMatch; - } - - public Integer getMinTermFreq() { - return minTermFreq; - } - - public void setMinTermFreq(Integer minTermFreq) { - this.minTermFreq = minTermFreq; - } - - public Integer getMaxQueryTerms() { - return maxQueryTerms; - } - - public void setMaxQueryTerms(Integer maxQueryTerms) { - this.maxQueryTerms = maxQueryTerms; - } - - public List getStopWords() { - return stopWords; - } - - public void addStopWords(String... stopWords) { - addAll(this.stopWords, stopWords); - } - - public Integer getMinDocFreq() { - return minDocFreq; - } - - public void setMinDocFreq(Integer minDocFreq) { - this.minDocFreq = minDocFreq; - } - - public Integer getMaxDocFreq() { - return maxDocFreq; - } - - public void setMaxDocFreq(Integer maxDocFreq) { - this.maxDocFreq = maxDocFreq; - } - - public Integer getMinWordLen() { - return minWordLen; - } - - public void setMinWordLen(Integer minWordLen) { - this.minWordLen = minWordLen; - } - - public Integer getMaxWordLen() { - return maxWordLen; - } - - public void setMaxWordLen(Integer maxWordLen) { - this.maxWordLen = maxWordLen; - } - - public Float getBoostTerms() { - return boostTerms; - } - - public void setBoostTerms(Float boostTerms) { - this.boostTerms = boostTerms; - } - - public Pageable getPageable() { - return pageable; - } - - public void setPageable(Pageable pageable) { - this.pageable = pageable; - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +import static java.util.Collections.addAll; +import static org.springframework.data.elasticsearch.core.query.AbstractQuery.*; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.data.domain.Pageable; + +/** + * MoreLikeThisQuery + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public class MoreLikeThisQuery { + + private String id; + private String indexName; + private String type; + private List searchIndices = new ArrayList<>(); + private List searchTypes = new ArrayList<>(); + private List fields = new ArrayList<>(); + private String routing; + private Float percentTermsToMatch; + private Integer minTermFreq; + private Integer maxQueryTerms; + private List stopWords = new ArrayList<>(); + private Integer minDocFreq; + private Integer maxDocFreq; + private Integer minWordLen; + private Integer maxWordLen; + private Float boostTerms; + private Pageable pageable = DEFAULT_PAGE; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIndexName() { + return indexName; + } + + public void setIndexName(String indexName) { + this.indexName = indexName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getSearchIndices() { + return searchIndices; + } + + public void addSearchIndices(String... searchIndices) { + addAll(this.searchIndices, searchIndices); + } + + public List getSearchTypes() { + return searchTypes; + } + + public void addSearchTypes(String... searchTypes) { + addAll(this.searchTypes, searchTypes); + } + + public List getFields() { + return fields; + } + + public void addFields(String... fields) { + addAll(this.fields, fields); + } + + public String getRouting() { + return routing; + } + + public void setRouting(String routing) { + this.routing = routing; + } + + public Float getPercentTermsToMatch() { + return percentTermsToMatch; + } + + public void setPercentTermsToMatch(Float percentTermsToMatch) { + this.percentTermsToMatch = percentTermsToMatch; + } + + public Integer getMinTermFreq() { + return minTermFreq; + } + + public void setMinTermFreq(Integer minTermFreq) { + this.minTermFreq = minTermFreq; + } + + public Integer getMaxQueryTerms() { + return maxQueryTerms; + } + + public void setMaxQueryTerms(Integer maxQueryTerms) { + this.maxQueryTerms = maxQueryTerms; + } + + public List getStopWords() { + return stopWords; + } + + public void addStopWords(String... stopWords) { + addAll(this.stopWords, stopWords); + } + + public Integer getMinDocFreq() { + return minDocFreq; + } + + public void setMinDocFreq(Integer minDocFreq) { + this.minDocFreq = minDocFreq; + } + + public Integer getMaxDocFreq() { + return maxDocFreq; + } + + public void setMaxDocFreq(Integer maxDocFreq) { + this.maxDocFreq = maxDocFreq; + } + + public Integer getMinWordLen() { + return minWordLen; + } + + public void setMinWordLen(Integer minWordLen) { + this.minWordLen = minWordLen; + } + + public Integer getMaxWordLen() { + return maxWordLen; + } + + public void setMaxWordLen(Integer maxWordLen) { + this.maxWordLen = maxWordLen; + } + + public Float getBoostTerms() { + return boostTerms; + } + + public void setBoostTerms(Float boostTerms) { + this.boostTerms = boostTerms; + } + + public Pageable getPageable() { + return pageable; + } + + public void setPageable(Pageable pageable) { + this.pageable = pageable; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQuery.java index c2ef8284a..59050c8fe 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQuery.java @@ -1,140 +1,140 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -import java.util.ArrayList; -import java.util.List; - -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; -import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; -import org.elasticsearch.search.sort.SortBuilder; -import org.springframework.data.elasticsearch.core.facet.FacetRequest; - -import java.util.Arrays; - -/** - * NativeSearchQuery - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - */ -public class NativeSearchQuery extends AbstractQuery implements SearchQuery { - - private QueryBuilder query; - private QueryBuilder filter; - private List sorts; - private final List scriptFields = new ArrayList<>(); - private List facets; - private List aggregations; - private HighlightBuilder.Field[] highlightFields; - private List indicesBoost; - - - public NativeSearchQuery(QueryBuilder query) { - this.query = query; - } - - public NativeSearchQuery(QueryBuilder query, QueryBuilder filter) { - this.query = query; - this.filter = filter; - } - - public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List sorts) { - this.query = query; - this.filter = filter; - this.sorts = sorts; - } - - public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List sorts, HighlightBuilder.Field[] highlightFields) { - this.query = query; - this.filter = filter; - this.sorts = sorts; - this.highlightFields = highlightFields; - } - - public QueryBuilder getQuery() { - return query; - } - - public QueryBuilder getFilter() { - return filter; - } - - public List getElasticsearchSorts() { - return sorts; - } - - @Override - public HighlightBuilder.Field[] getHighlightFields() { - return highlightFields; - } - - @Override - public List getScriptFields() { return scriptFields; } - - public void setScriptFields(List scriptFields) { - this.scriptFields.addAll(scriptFields); - } - - public void addScriptField(ScriptField... scriptField) { - scriptFields.addAll(Arrays.asList(scriptField)); - } - - public void addFacet(FacetRequest facetRequest) { - if (facets == null) { - facets = new ArrayList<>(); - } - facets.add(facetRequest); - } - - public void setFacets(List facets) { - this.facets = facets; - } - - @Override - public List getFacets() { - return facets; - } - - @Override - public List getAggregations() { - return aggregations; - } - - - public void addAggregation(AbstractAggregationBuilder aggregationBuilder) { - if (aggregations == null) { - aggregations = new ArrayList<>(); - } - aggregations.add(aggregationBuilder); - } - - public void setAggregations(List aggregations) { - this.aggregations = aggregations; - } - - @Override - public List getIndicesBoost() { - return indicesBoost; - } - - public void setIndicesBoost(List indicesBoost) { - this.indicesBoost = indicesBoost; - } - -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +import java.util.ArrayList; +import java.util.List; + +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.elasticsearch.search.sort.SortBuilder; +import org.springframework.data.elasticsearch.core.facet.FacetRequest; + +import java.util.Arrays; + +/** + * NativeSearchQuery + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Artur Konczak + */ +public class NativeSearchQuery extends AbstractQuery implements SearchQuery { + + private QueryBuilder query; + private QueryBuilder filter; + private List sorts; + private final List scriptFields = new ArrayList<>(); + private List facets; + private List aggregations; + private HighlightBuilder.Field[] highlightFields; + private List indicesBoost; + + + public NativeSearchQuery(QueryBuilder query) { + this.query = query; + } + + public NativeSearchQuery(QueryBuilder query, QueryBuilder filter) { + this.query = query; + this.filter = filter; + } + + public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List sorts) { + this.query = query; + this.filter = filter; + this.sorts = sorts; + } + + public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List sorts, HighlightBuilder.Field[] highlightFields) { + this.query = query; + this.filter = filter; + this.sorts = sorts; + this.highlightFields = highlightFields; + } + + public QueryBuilder getQuery() { + return query; + } + + public QueryBuilder getFilter() { + return filter; + } + + public List getElasticsearchSorts() { + return sorts; + } + + @Override + public HighlightBuilder.Field[] getHighlightFields() { + return highlightFields; + } + + @Override + public List getScriptFields() { return scriptFields; } + + public void setScriptFields(List scriptFields) { + this.scriptFields.addAll(scriptFields); + } + + public void addScriptField(ScriptField... scriptField) { + scriptFields.addAll(Arrays.asList(scriptField)); + } + + public void addFacet(FacetRequest facetRequest) { + if (facets == null) { + facets = new ArrayList<>(); + } + facets.add(facetRequest); + } + + public void setFacets(List facets) { + this.facets = facets; + } + + @Override + public List getFacets() { + return facets; + } + + @Override + public List getAggregations() { + return aggregations; + } + + + public void addAggregation(AbstractAggregationBuilder aggregationBuilder) { + if (aggregations == null) { + aggregations = new ArrayList<>(); + } + aggregations.add(aggregationBuilder); + } + + public void setAggregations(List aggregations) { + this.aggregations = aggregations; + } + + @Override + public List getIndicesBoost() { + return indicesBoost; + } + + public void setIndicesBoost(List indicesBoost) { + this.indicesBoost = indicesBoost; + } + +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java index 1b1072440..82db91307 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java @@ -1,197 +1,197 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -import static org.springframework.util.CollectionUtils.isEmpty; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import org.elasticsearch.action.search.SearchType; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; -import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; -import org.elasticsearch.search.sort.SortBuilder; -import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.core.facet.FacetRequest; - -/** - * NativeSearchQuery - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - * @author Mark Paluch - */ -public class NativeSearchQueryBuilder { - - private QueryBuilder queryBuilder; - private QueryBuilder filterBuilder; - private List scriptFields = new ArrayList<>(); - private List sortBuilders = new ArrayList<>(); - private List facetRequests = new ArrayList<>(); - private List aggregationBuilders = new ArrayList<>(); - private HighlightBuilder.Field[] highlightFields; - private Pageable pageable = Pageable.unpaged(); - private String[] indices; - private String[] types; - private String[] fields; - private SourceFilter sourceFilter; - private List indicesBoost; - private float minScore; - private Collection ids; - private String route; - private SearchType searchType; - - public NativeSearchQueryBuilder withQuery(QueryBuilder queryBuilder) { - this.queryBuilder = queryBuilder; - return this; - } - - public NativeSearchQueryBuilder withFilter(QueryBuilder filterBuilder) { - this.filterBuilder = filterBuilder; - return this; - } - - public NativeSearchQueryBuilder withSort(SortBuilder sortBuilder) { - this.sortBuilders.add(sortBuilder); - return this; - } - - public NativeSearchQueryBuilder withScriptField(ScriptField scriptField) { - this.scriptFields.add(scriptField); - return this; - } - - public NativeSearchQueryBuilder addAggregation(AbstractAggregationBuilder aggregationBuilder) { - this.aggregationBuilders.add(aggregationBuilder); - return this; - } - - public NativeSearchQueryBuilder withFacet(FacetRequest facetRequest) { - facetRequests.add(facetRequest); - return this; - } - - public NativeSearchQueryBuilder withHighlightFields(HighlightBuilder.Field... highlightFields) { - this.highlightFields = highlightFields; - return this; - } - - public NativeSearchQueryBuilder withIndicesBoost(List indicesBoost) { - this.indicesBoost = indicesBoost; - return this; - } - - public NativeSearchQueryBuilder withPageable(Pageable pageable) { - this.pageable = pageable; - return this; - } - - public NativeSearchQueryBuilder withIndices(String... indices) { - this.indices = indices; - return this; - } - - public NativeSearchQueryBuilder withTypes(String... types) { - this.types = types; - return this; - } - - public NativeSearchQueryBuilder withFields(String... fields) { - this.fields = fields; - return this; - } - - public NativeSearchQueryBuilder withSourceFilter(SourceFilter sourceFilter) { - this.sourceFilter = sourceFilter; - return this; - } - - public NativeSearchQueryBuilder withMinScore(float minScore) { - this.minScore = minScore; - return this; - } - - public NativeSearchQueryBuilder withIds(Collection ids) { - this.ids = ids; - return this; - } - - public NativeSearchQueryBuilder withRoute(String route) { - this.route = route; - return this; - } - - public NativeSearchQueryBuilder withSearchType(SearchType searchType) { - this.searchType = searchType; - return this; - } - - public NativeSearchQuery build() { - NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(queryBuilder, filterBuilder, sortBuilders, highlightFields); - nativeSearchQuery.setPageable(pageable); - - if (indices != null) { - nativeSearchQuery.addIndices(indices); - } - - if (types != null) { - nativeSearchQuery.addTypes(types); - } - - if (fields != null) { - nativeSearchQuery.addFields(fields); - } - - if (sourceFilter != null) { - nativeSearchQuery.addSourceFilter(sourceFilter); - } - - if(indicesBoost != null) { - nativeSearchQuery.setIndicesBoost(indicesBoost); - } - - if (!isEmpty(scriptFields)) { - nativeSearchQuery.setScriptFields(scriptFields); - } - - if (!isEmpty(facetRequests)) { - nativeSearchQuery.setFacets(facetRequests); - } - - if (!isEmpty(aggregationBuilders)) { - nativeSearchQuery.setAggregations(aggregationBuilders); - } - - if (minScore > 0) { - nativeSearchQuery.setMinScore(minScore); - } - - if (ids != null) { - nativeSearchQuery.setIds(ids); - } - - if (route != null) { - nativeSearchQuery.setRoute(route); - } - - if (searchType != null) { - nativeSearchQuery.setSearchType(searchType); - } - - return nativeSearchQuery; - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +import static org.springframework.util.CollectionUtils.isEmpty; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.elasticsearch.search.sort.SortBuilder; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.core.facet.FacetRequest; + +/** + * NativeSearchQuery + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Artur Konczak + * @author Mark Paluch + */ +public class NativeSearchQueryBuilder { + + private QueryBuilder queryBuilder; + private QueryBuilder filterBuilder; + private List scriptFields = new ArrayList<>(); + private List sortBuilders = new ArrayList<>(); + private List facetRequests = new ArrayList<>(); + private List aggregationBuilders = new ArrayList<>(); + private HighlightBuilder.Field[] highlightFields; + private Pageable pageable = Pageable.unpaged(); + private String[] indices; + private String[] types; + private String[] fields; + private SourceFilter sourceFilter; + private List indicesBoost; + private float minScore; + private Collection ids; + private String route; + private SearchType searchType; + + public NativeSearchQueryBuilder withQuery(QueryBuilder queryBuilder) { + this.queryBuilder = queryBuilder; + return this; + } + + public NativeSearchQueryBuilder withFilter(QueryBuilder filterBuilder) { + this.filterBuilder = filterBuilder; + return this; + } + + public NativeSearchQueryBuilder withSort(SortBuilder sortBuilder) { + this.sortBuilders.add(sortBuilder); + return this; + } + + public NativeSearchQueryBuilder withScriptField(ScriptField scriptField) { + this.scriptFields.add(scriptField); + return this; + } + + public NativeSearchQueryBuilder addAggregation(AbstractAggregationBuilder aggregationBuilder) { + this.aggregationBuilders.add(aggregationBuilder); + return this; + } + + public NativeSearchQueryBuilder withFacet(FacetRequest facetRequest) { + facetRequests.add(facetRequest); + return this; + } + + public NativeSearchQueryBuilder withHighlightFields(HighlightBuilder.Field... highlightFields) { + this.highlightFields = highlightFields; + return this; + } + + public NativeSearchQueryBuilder withIndicesBoost(List indicesBoost) { + this.indicesBoost = indicesBoost; + return this; + } + + public NativeSearchQueryBuilder withPageable(Pageable pageable) { + this.pageable = pageable; + return this; + } + + public NativeSearchQueryBuilder withIndices(String... indices) { + this.indices = indices; + return this; + } + + public NativeSearchQueryBuilder withTypes(String... types) { + this.types = types; + return this; + } + + public NativeSearchQueryBuilder withFields(String... fields) { + this.fields = fields; + return this; + } + + public NativeSearchQueryBuilder withSourceFilter(SourceFilter sourceFilter) { + this.sourceFilter = sourceFilter; + return this; + } + + public NativeSearchQueryBuilder withMinScore(float minScore) { + this.minScore = minScore; + return this; + } + + public NativeSearchQueryBuilder withIds(Collection ids) { + this.ids = ids; + return this; + } + + public NativeSearchQueryBuilder withRoute(String route) { + this.route = route; + return this; + } + + public NativeSearchQueryBuilder withSearchType(SearchType searchType) { + this.searchType = searchType; + return this; + } + + public NativeSearchQuery build() { + NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(queryBuilder, filterBuilder, sortBuilders, highlightFields); + nativeSearchQuery.setPageable(pageable); + + if (indices != null) { + nativeSearchQuery.addIndices(indices); + } + + if (types != null) { + nativeSearchQuery.addTypes(types); + } + + if (fields != null) { + nativeSearchQuery.addFields(fields); + } + + if (sourceFilter != null) { + nativeSearchQuery.addSourceFilter(sourceFilter); + } + + if(indicesBoost != null) { + nativeSearchQuery.setIndicesBoost(indicesBoost); + } + + if (!isEmpty(scriptFields)) { + nativeSearchQuery.setScriptFields(scriptFields); + } + + if (!isEmpty(facetRequests)) { + nativeSearchQuery.setFacets(facetRequests); + } + + if (!isEmpty(aggregationBuilders)) { + nativeSearchQuery.setAggregations(aggregationBuilders); + } + + if (minScore > 0) { + nativeSearchQuery.setMinScore(minScore); + } + + if (ids != null) { + nativeSearchQuery.setIds(ids); + } + + if (route != null) { + nativeSearchQuery.setRoute(route); + } + + if (searchType != null) { + nativeSearchQuery.setSearchType(searchType); + } + + return nativeSearchQuery; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java b/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java index 4895fb892..258e9b72c 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java @@ -1,150 +1,150 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -import java.util.Collection; -import java.util.List; -import org.elasticsearch.action.search.SearchType; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; - -/** - * Query - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Mark Paluch - */ -public interface Query { - - int DEFAULT_PAGE_SIZE = 10; - Pageable DEFAULT_PAGE = PageRequest.of(0, DEFAULT_PAGE_SIZE); - - /** - * restrict result to entries on given page. Corresponds to the 'start' and 'rows' parameter in elasticsearch - * - * @param pageable - * @return - */ - T setPageable(Pageable pageable); - - /** - * Get page settings if defined - * - * @return - */ - Pageable getPageable(); - - /** - * Add {@link org.springframework.data.domain.Sort} to query - * - * @param sort - * @return - */ - T addSort(Sort sort); - - /** - * @return null if not set - */ - Sort getSort(); - - /** - * Get Indices to be searched - * - * @return - */ - List getIndices(); - - /** - * Add Indices to be added as part of search request - * - * @param indices - */ - void addIndices(String... indices); - - /** - * Add types to be searched - * - * @param types - */ - void addTypes(String... types); - - /** - * Get types to be searched - * - * @return - */ - List getTypes(); - - /** - * Add fields to be added as part of search request - * - * @param fields - */ - void addFields(String... fields); - - /** - * Get fields to be returned as part of search request - * - * @return - */ - List getFields(); - - /** - * Add source filter to be added as part of search request - * - * @param sourceFilter - */ - void addSourceFilter(SourceFilter sourceFilter); - - /** - * Get SourceFilter to be returned to get include and exclude source - * fields as part of search request. - * - * @return SourceFilter - */ - SourceFilter getSourceFilter(); - - /** - * Get minimum score - * - * @return - */ - float getMinScore(); - - /** - * Get Ids - * - * @return - */ - Collection getIds(); - - /** - * Get route - * - * @return - */ - String getRoute(); - - - /** - * Type of search - * - * @return - */ - SearchType getSearchType(); -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +import java.util.Collection; +import java.util.List; +import org.elasticsearch.action.search.SearchType; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +/** + * Query + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Mark Paluch + */ +public interface Query { + + int DEFAULT_PAGE_SIZE = 10; + Pageable DEFAULT_PAGE = PageRequest.of(0, DEFAULT_PAGE_SIZE); + + /** + * restrict result to entries on given page. Corresponds to the 'start' and 'rows' parameter in elasticsearch + * + * @param pageable + * @return + */ + T setPageable(Pageable pageable); + + /** + * Get page settings if defined + * + * @return + */ + Pageable getPageable(); + + /** + * Add {@link org.springframework.data.domain.Sort} to query + * + * @param sort + * @return + */ + T addSort(Sort sort); + + /** + * @return null if not set + */ + Sort getSort(); + + /** + * Get Indices to be searched + * + * @return + */ + List getIndices(); + + /** + * Add Indices to be added as part of search request + * + * @param indices + */ + void addIndices(String... indices); + + /** + * Add types to be searched + * + * @param types + */ + void addTypes(String... types); + + /** + * Get types to be searched + * + * @return + */ + List getTypes(); + + /** + * Add fields to be added as part of search request + * + * @param fields + */ + void addFields(String... fields); + + /** + * Get fields to be returned as part of search request + * + * @return + */ + List getFields(); + + /** + * Add source filter to be added as part of search request + * + * @param sourceFilter + */ + void addSourceFilter(SourceFilter sourceFilter); + + /** + * Get SourceFilter to be returned to get include and exclude source + * fields as part of search request. + * + * @return SourceFilter + */ + SourceFilter getSourceFilter(); + + /** + * Get minimum score + * + * @return + */ + float getMinScore(); + + /** + * Get Ids + * + * @return + */ + Collection getIds(); + + /** + * Get route + * + * @return + */ + String getRoute(); + + + /** + * Type of search + * + * @return + */ + SearchType getSearchType(); +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java index f2e3f29e4..754c2c551 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java @@ -1,52 +1,52 @@ -/* - * Copyright 2013-2016 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -import java.util.List; - -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; -import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; -import org.elasticsearch.search.sort.SortBuilder; -import org.springframework.data.elasticsearch.core.facet.FacetRequest; - -/** - * NativeSearchQuery - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - */ -public interface SearchQuery extends Query { - - QueryBuilder getQuery(); - - QueryBuilder getFilter(); - - List getElasticsearchSorts(); - - @Deprecated - List getFacets(); - - List getAggregations(); - - HighlightBuilder.Field[] getHighlightFields(); - - List getIndicesBoost(); - - List getScriptFields(); - -} +/* + * Copyright 2013-2016 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +import java.util.List; + +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.elasticsearch.search.sort.SortBuilder; +import org.springframework.data.elasticsearch.core.facet.FacetRequest; + +/** + * NativeSearchQuery + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Artur Konczak + */ +public interface SearchQuery extends Query { + + QueryBuilder getQuery(); + + QueryBuilder getFilter(); + + List getElasticsearchSorts(); + + @Deprecated + List getFacets(); + + List getAggregations(); + + HighlightBuilder.Field[] getHighlightFields(); + + List getIndicesBoost(); + + List getScriptFields(); + +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/SimpleField.java b/src/main/java/org/springframework/data/elasticsearch/core/query/SimpleField.java index 494be9a68..c4bf75960 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/SimpleField.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/SimpleField.java @@ -1,41 +1,41 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -/** - * The most trivial implementation of a Field - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ -public class SimpleField implements Field { - - private final String name; - - public SimpleField(String name) { - this.name = name; - } - - @Override - public String getName() { - return this.name; - } - - @Override - public String toString() { - return this.name; - } +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +/** + * The most trivial implementation of a Field + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public class SimpleField implements Field { + + private final String name; + + public SimpleField(String name) { + this.name = name; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public String toString() { + return this.name; + } } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/StringQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/StringQuery.java index f0c49b689..5ad650750 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/StringQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/StringQuery.java @@ -1,49 +1,49 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; - -/** - * StringQuery - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ -public class StringQuery extends AbstractQuery { - - private String source; - - public StringQuery(String source) { - this.source = source; - } - - public StringQuery(String source, Pageable pageable) { - this.source = source; - this.pageable = pageable; - } - - public StringQuery(String source, Pageable pageable, Sort sort) { - this.pageable = pageable; - this.sort = sort; - this.source = source; - } - - public String getSource() { - return source; - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +/** + * StringQuery + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public class StringQuery extends AbstractQuery { + + private String source; + + public StringQuery(String source) { + this.source = source; + } + + public StringQuery(String source, Pageable pageable) { + this.source = source; + this.pageable = pageable; + } + + public StringQuery(String source, Pageable pageable, Sort sort) { + this.pageable = pageable; + this.sort = sort; + this.source = source; + } + + public String getSource() { + return source; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/ElasticsearchCrudRepository.java b/src/main/java/org/springframework/data/elasticsearch/repository/ElasticsearchCrudRepository.java index 2df696fbe..cd74a985f 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/ElasticsearchCrudRepository.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/ElasticsearchCrudRepository.java @@ -1,33 +1,33 @@ -/* - * Copyright 2013-2014 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository; - -import java.io.Serializable; - -import org.springframework.data.repository.NoRepositoryBean; -import org.springframework.data.repository.PagingAndSortingRepository; - -/** - * @param - * @param - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Oliver Gierke - */ -@NoRepositoryBean -public interface ElasticsearchCrudRepository extends PagingAndSortingRepository { - -} +/* + * Copyright 2013-2014 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository; + +import java.io.Serializable; + +import org.springframework.data.repository.NoRepositoryBean; +import org.springframework.data.repository.PagingAndSortingRepository; + +/** + * @param + * @param + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Oliver Gierke + */ +@NoRepositoryBean +public interface ElasticsearchCrudRepository extends PagingAndSortingRepository { + +} diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/ElasticsearchRepository.java b/src/main/java/org/springframework/data/elasticsearch/repository/ElasticsearchRepository.java index 455c2821e..a349058a6 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/ElasticsearchRepository.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/ElasticsearchRepository.java @@ -1,48 +1,48 @@ -/* - * Copyright 2013-2016 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository; - -import java.io.Serializable; - -import org.elasticsearch.index.query.QueryBuilder; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.core.query.SearchQuery; -import org.springframework.data.repository.NoRepositoryBean; - -/** - * @param - * @param - * @author Rizwan Idrees - * @author Mohsin Husen - */ -@NoRepositoryBean -public interface ElasticsearchRepository extends ElasticsearchCrudRepository { - - S index(S entity); - - Iterable search(QueryBuilder query); - - Page search(QueryBuilder query, Pageable pageable); - - Page search(SearchQuery searchQuery); - - Page searchSimilar(T entity, String[] fields, Pageable pageable); - - void refresh(); - - Class getEntityClass(); -} +/* + * Copyright 2013-2016 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository; + +import java.io.Serializable; + +import org.elasticsearch.index.query.QueryBuilder; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.core.query.SearchQuery; +import org.springframework.data.repository.NoRepositoryBean; + +/** + * @param + * @param + * @author Rizwan Idrees + * @author Mohsin Husen + */ +@NoRepositoryBean +public interface ElasticsearchRepository extends ElasticsearchCrudRepository { + + S index(S entity); + + Iterable search(QueryBuilder query); + + Page search(QueryBuilder query, Pageable pageable); + + Page search(SearchQuery searchQuery); + + Page searchSimilar(T entity, String[] fields, Pageable pageable); + + void refresh(); + + Class getEntityClass(); +} diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/cdi/ElasticsearchRepositoryBean.java b/src/main/java/org/springframework/data/elasticsearch/repository/cdi/ElasticsearchRepositoryBean.java index 6d69a1967..ace15bf36 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/cdi/ElasticsearchRepositoryBean.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/cdi/ElasticsearchRepositoryBean.java @@ -1,87 +1,87 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository.cdi; - -import java.lang.annotation.Annotation; -import java.util.Optional; -import java.util.Set; - -import javax.enterprise.context.spi.CreationalContext; -import javax.enterprise.inject.spi.Bean; -import javax.enterprise.inject.spi.BeanManager; - -import org.springframework.data.elasticsearch.core.ElasticsearchOperations; -import org.springframework.data.elasticsearch.repository.support.ElasticsearchRepositoryFactory; -import org.springframework.data.repository.cdi.CdiRepositoryBean; -import org.springframework.data.repository.config.CustomRepositoryImplementationDetector; -import org.springframework.util.Assert; - -/** - * Uses {@link CdiRepositoryBean} to create - * {@link org.springframework.data.elasticsearch.repository.ElasticsearchRepository} instances. - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Mark Paluch - */ -public class ElasticsearchRepositoryBean extends CdiRepositoryBean { - - private final Bean elasticsearchOperationsBean; - - /** - * Creates a new {@link ElasticsearchRepositoryBean}. - * - * @param operations must not be {@literal null}. - * @param qualifiers must not be {@literal null}. - * @param repositoryType must not be {@literal null}. - * @param beanManager must not be {@literal null}. - * @param detector detector for the custom {@link org.springframework.data.repository.Repository} implementations - * {@link CustomRepositoryImplementationDetector}, can be {@literal null}. - */ - public ElasticsearchRepositoryBean(Bean operations, Set qualifiers, - Class repositoryType, BeanManager beanManager, CustomRepositoryImplementationDetector detector) { - - super(qualifiers, repositoryType, beanManager, Optional.of(detector)); - - Assert.notNull(operations, "Cannot create repository with 'null' for ElasticsearchOperations."); - this.elasticsearchOperationsBean = operations; - } - - /* (non-Javadoc) - * @see org.springframework.data.repository.cdi.CdiRepositoryBean#create(javax.enterprise.context.spi.CreationalContext, java.lang.Class, java.util.Optional) - */ - @Override - protected T create(CreationalContext creationalContext, Class repositoryType, - Optional customImplementation) { - - ElasticsearchOperations elasticsearchOperations = getDependencyInstance(elasticsearchOperationsBean, - ElasticsearchOperations.class); - - ElasticsearchRepositoryFactory factory = new ElasticsearchRepositoryFactory(elasticsearchOperations); - - return customImplementation // - .map(o -> factory.getRepository(repositoryType, o)) // - .orElseGet(() -> factory.getRepository(repositoryType)); - } - - /* (non-Javadoc) - * @see org.springframework.data.repository.cdi.CdiRepositoryBean#getScope() - */ - @Override - public Class getScope() { - return elasticsearchOperationsBean.getScope(); - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository.cdi; + +import java.lang.annotation.Annotation; +import java.util.Optional; +import java.util.Set; + +import javax.enterprise.context.spi.CreationalContext; +import javax.enterprise.inject.spi.Bean; +import javax.enterprise.inject.spi.BeanManager; + +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.repository.support.ElasticsearchRepositoryFactory; +import org.springframework.data.repository.cdi.CdiRepositoryBean; +import org.springframework.data.repository.config.CustomRepositoryImplementationDetector; +import org.springframework.util.Assert; + +/** + * Uses {@link CdiRepositoryBean} to create + * {@link org.springframework.data.elasticsearch.repository.ElasticsearchRepository} instances. + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Mark Paluch + */ +public class ElasticsearchRepositoryBean extends CdiRepositoryBean { + + private final Bean elasticsearchOperationsBean; + + /** + * Creates a new {@link ElasticsearchRepositoryBean}. + * + * @param operations must not be {@literal null}. + * @param qualifiers must not be {@literal null}. + * @param repositoryType must not be {@literal null}. + * @param beanManager must not be {@literal null}. + * @param detector detector for the custom {@link org.springframework.data.repository.Repository} implementations + * {@link CustomRepositoryImplementationDetector}, can be {@literal null}. + */ + public ElasticsearchRepositoryBean(Bean operations, Set qualifiers, + Class repositoryType, BeanManager beanManager, CustomRepositoryImplementationDetector detector) { + + super(qualifiers, repositoryType, beanManager, Optional.of(detector)); + + Assert.notNull(operations, "Cannot create repository with 'null' for ElasticsearchOperations."); + this.elasticsearchOperationsBean = operations; + } + + /* (non-Javadoc) + * @see org.springframework.data.repository.cdi.CdiRepositoryBean#create(javax.enterprise.context.spi.CreationalContext, java.lang.Class, java.util.Optional) + */ + @Override + protected T create(CreationalContext creationalContext, Class repositoryType, + Optional customImplementation) { + + ElasticsearchOperations elasticsearchOperations = getDependencyInstance(elasticsearchOperationsBean, + ElasticsearchOperations.class); + + ElasticsearchRepositoryFactory factory = new ElasticsearchRepositoryFactory(elasticsearchOperations); + + return customImplementation // + .map(o -> factory.getRepository(repositoryType, o)) // + .orElseGet(() -> factory.getRepository(repositoryType)); + } + + /* (non-Javadoc) + * @see org.springframework.data.repository.cdi.CdiRepositoryBean#getScope() + */ + @Override + public Class getScope() { + return elasticsearchOperationsBean.getScope(); + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/cdi/ElasticsearchRepositoryExtension.java b/src/main/java/org/springframework/data/elasticsearch/repository/cdi/ElasticsearchRepositoryExtension.java index 4c2ac69a5..aaf37dbe2 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/cdi/ElasticsearchRepositoryExtension.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/cdi/ElasticsearchRepositoryExtension.java @@ -1,83 +1,83 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository.cdi; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import javax.enterprise.event.Observes; -import javax.enterprise.inject.UnsatisfiedResolutionException; -import javax.enterprise.inject.spi.AfterBeanDiscovery; -import javax.enterprise.inject.spi.Bean; -import javax.enterprise.inject.spi.BeanManager; -import javax.enterprise.inject.spi.ProcessBean; - -import org.springframework.data.elasticsearch.core.ElasticsearchOperations; -import org.springframework.data.repository.cdi.CdiRepositoryBean; -import org.springframework.data.repository.cdi.CdiRepositoryExtensionSupport; - -/** - * CDI extension to export Elasticsearch repositories. - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Oliver Gierke - * @author Mark Paluch - */ -public class ElasticsearchRepositoryExtension extends CdiRepositoryExtensionSupport { - - private final Map, Bean> elasticsearchOperationsMap = new HashMap<>(); - - @SuppressWarnings("unchecked") - void processBean(@Observes ProcessBean processBean) { - Bean bean = processBean.getBean(); - for (Type type : bean.getTypes()) { - if (type instanceof Class && ElasticsearchOperations.class.isAssignableFrom((Class) type)) { - elasticsearchOperationsMap.put(bean.getQualifiers(), ((Bean) bean)); - } - } - } - - void afterBeanDiscovery(@Observes AfterBeanDiscovery afterBeanDiscovery, BeanManager beanManager) { - for (Entry, Set> entry : getRepositoryTypes()) { - - Class repositoryType = entry.getKey(); - Set qualifiers = entry.getValue(); - - CdiRepositoryBean repositoryBean = createRepositoryBean(repositoryType, qualifiers, beanManager); - afterBeanDiscovery.addBean(repositoryBean); - registerBean(repositoryBean); - } - } - - private CdiRepositoryBean createRepositoryBean(Class repositoryType, Set qualifiers, - BeanManager beanManager) { - - if (!this.elasticsearchOperationsMap.containsKey(qualifiers)) { - throw new UnsatisfiedResolutionException(String.format("Unable to resolve a bean for '%s' with qualifiers %s.", - ElasticsearchOperations.class.getName(), qualifiers)); - } - - Bean elasticsearchOperationsBean = this.elasticsearchOperationsMap.get(qualifiers); - - return new ElasticsearchRepositoryBean<>(elasticsearchOperationsBean, qualifiers, repositoryType, beanManager, - getCustomImplementationDetector()); - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository.cdi; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import javax.enterprise.event.Observes; +import javax.enterprise.inject.UnsatisfiedResolutionException; +import javax.enterprise.inject.spi.AfterBeanDiscovery; +import javax.enterprise.inject.spi.Bean; +import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.ProcessBean; + +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.repository.cdi.CdiRepositoryBean; +import org.springframework.data.repository.cdi.CdiRepositoryExtensionSupport; + +/** + * CDI extension to export Elasticsearch repositories. + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Oliver Gierke + * @author Mark Paluch + */ +public class ElasticsearchRepositoryExtension extends CdiRepositoryExtensionSupport { + + private final Map, Bean> elasticsearchOperationsMap = new HashMap<>(); + + @SuppressWarnings("unchecked") + void processBean(@Observes ProcessBean processBean) { + Bean bean = processBean.getBean(); + for (Type type : bean.getTypes()) { + if (type instanceof Class && ElasticsearchOperations.class.isAssignableFrom((Class) type)) { + elasticsearchOperationsMap.put(bean.getQualifiers(), ((Bean) bean)); + } + } + } + + void afterBeanDiscovery(@Observes AfterBeanDiscovery afterBeanDiscovery, BeanManager beanManager) { + for (Entry, Set> entry : getRepositoryTypes()) { + + Class repositoryType = entry.getKey(); + Set qualifiers = entry.getValue(); + + CdiRepositoryBean repositoryBean = createRepositoryBean(repositoryType, qualifiers, beanManager); + afterBeanDiscovery.addBean(repositoryBean); + registerBean(repositoryBean); + } + } + + private CdiRepositoryBean createRepositoryBean(Class repositoryType, Set qualifiers, + BeanManager beanManager) { + + if (!this.elasticsearchOperationsMap.containsKey(qualifiers)) { + throw new UnsatisfiedResolutionException(String.format("Unable to resolve a bean for '%s' with qualifiers %s.", + ElasticsearchOperations.class.getName(), qualifiers)); + } + + Bean elasticsearchOperationsBean = this.elasticsearchOperationsMap.get(qualifiers); + + return new ElasticsearchRepositoryBean<>(elasticsearchOperationsBean, qualifiers, repositoryType, beanManager, + getCustomImplementationDetector()); + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractElasticsearchRepositoryQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractElasticsearchRepositoryQuery.java index f2aafc6dc..5f9a9b54c 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractElasticsearchRepositoryQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractElasticsearchRepositoryQuery.java @@ -1,44 +1,44 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository.query; - -import org.springframework.data.elasticsearch.core.ElasticsearchOperations; -import org.springframework.data.repository.query.QueryMethod; -import org.springframework.data.repository.query.RepositoryQuery; - -/** - * AbstractElasticsearchRepositoryQuery - * - * @author Rizwan Idrees - * @author Mohsin Husen - */ - -public abstract class AbstractElasticsearchRepositoryQuery implements RepositoryQuery { - - protected ElasticsearchQueryMethod queryMethod; - protected ElasticsearchOperations elasticsearchOperations; - - public AbstractElasticsearchRepositoryQuery(ElasticsearchQueryMethod queryMethod, - ElasticsearchOperations elasticsearchOperations) { - this.queryMethod = queryMethod; - this.elasticsearchOperations = elasticsearchOperations; - } - - @Override - public QueryMethod getQueryMethod() { - return queryMethod; - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository.query; + +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.repository.query.QueryMethod; +import org.springframework.data.repository.query.RepositoryQuery; + +/** + * AbstractElasticsearchRepositoryQuery + * + * @author Rizwan Idrees + * @author Mohsin Husen + */ + +public abstract class AbstractElasticsearchRepositoryQuery implements RepositoryQuery { + + protected ElasticsearchQueryMethod queryMethod; + protected ElasticsearchOperations elasticsearchOperations; + + public AbstractElasticsearchRepositoryQuery(ElasticsearchQueryMethod queryMethod, + ElasticsearchOperations elasticsearchOperations) { + this.queryMethod = queryMethod; + this.elasticsearchOperations = elasticsearchOperations; + } + + @Override + public QueryMethod getQueryMethod() { + return queryMethod; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java index dab180b1e..b4123d94d 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java @@ -1,107 +1,107 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository.query; - -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.core.ElasticsearchOperations; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; -import org.springframework.data.elasticsearch.core.query.CriteriaQuery; -import org.springframework.data.elasticsearch.repository.query.parser.ElasticsearchQueryCreator; -import org.springframework.data.mapping.context.MappingContext; -import org.springframework.data.repository.query.ParametersParameterAccessor; -import org.springframework.data.repository.query.parser.PartTree; -import org.springframework.util.ClassUtils; -import org.springframework.data.util.CloseableIterator; -import org.springframework.data.util.StreamUtils; - -/** - * ElasticsearchPartQuery - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Kevin Leturc - * @author Mark Paluch - */ -public class ElasticsearchPartQuery extends AbstractElasticsearchRepositoryQuery { - - private final PartTree tree; - private final MappingContext mappingContext; - - public ElasticsearchPartQuery(ElasticsearchQueryMethod method, ElasticsearchOperations elasticsearchOperations) { - super(method, elasticsearchOperations); - this.tree = new PartTree(method.getName(), method.getEntityInformation().getJavaType()); - this.mappingContext = elasticsearchOperations.getElasticsearchConverter().getMappingContext(); - } - - @Override - public Object execute(Object[] parameters) { - ParametersParameterAccessor accessor = new ParametersParameterAccessor(queryMethod.getParameters(), parameters); - CriteriaQuery query = createQuery(accessor); - if(tree.isDelete()) { - Object result = countOrGetDocumentsForDelete(query, accessor); - elasticsearchOperations.delete(query, queryMethod.getEntityInformation().getJavaType()); - return result; - } else if (queryMethod.isPageQuery()) { - query.setPageable(accessor.getPageable()); - return elasticsearchOperations.queryForPage(query, queryMethod.getEntityInformation().getJavaType()); - } else if (queryMethod.isStreamQuery()) { - Class entityType = queryMethod.getEntityInformation().getJavaType(); - if (query.getPageable().isUnpaged()) { - int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType()); - query.setPageable(PageRequest.of(0, Math.max(1, itemCount))); - } - - return StreamUtils.createStreamFromIterator((CloseableIterator) elasticsearchOperations.stream(query, entityType)); - - } else if (queryMethod.isCollectionQuery()) { - if (accessor.getPageable() == null) { - int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType()); - query.setPageable(PageRequest.of(0, Math.max(1, itemCount))); - } else { - query.setPageable(accessor.getPageable()); - } - return elasticsearchOperations.queryForList(query, queryMethod.getEntityInformation().getJavaType()); - } else if (tree.isCountProjection()) { - return elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType()); - } - return elasticsearchOperations.queryForObject(query, queryMethod.getEntityInformation().getJavaType()); - } - - private Object countOrGetDocumentsForDelete(CriteriaQuery query, ParametersParameterAccessor accessor) { - - Object result = null; - - if (queryMethod.isCollectionQuery()) { - if (accessor.getPageable().isUnpaged()) { - int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType()); - query.setPageable(PageRequest.of(0, Math.max(1, itemCount))); - } else { - query.setPageable(accessor.getPageable()); - } - result = elasticsearchOperations.queryForList(query, queryMethod.getEntityInformation().getJavaType()); - } - - if (ClassUtils.isAssignable(Number.class, queryMethod.getReturnedObjectType())) { - result = elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType()); - } - return result; - } - - public CriteriaQuery createQuery(ParametersParameterAccessor accessor) { - return new ElasticsearchQueryCreator(tree, accessor, mappingContext).createQuery(); - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository.query; + +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; +import org.springframework.data.elasticsearch.core.query.CriteriaQuery; +import org.springframework.data.elasticsearch.repository.query.parser.ElasticsearchQueryCreator; +import org.springframework.data.mapping.context.MappingContext; +import org.springframework.data.repository.query.ParametersParameterAccessor; +import org.springframework.data.repository.query.parser.PartTree; +import org.springframework.util.ClassUtils; +import org.springframework.data.util.CloseableIterator; +import org.springframework.data.util.StreamUtils; + +/** + * ElasticsearchPartQuery + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Kevin Leturc + * @author Mark Paluch + */ +public class ElasticsearchPartQuery extends AbstractElasticsearchRepositoryQuery { + + private final PartTree tree; + private final MappingContext mappingContext; + + public ElasticsearchPartQuery(ElasticsearchQueryMethod method, ElasticsearchOperations elasticsearchOperations) { + super(method, elasticsearchOperations); + this.tree = new PartTree(method.getName(), method.getEntityInformation().getJavaType()); + this.mappingContext = elasticsearchOperations.getElasticsearchConverter().getMappingContext(); + } + + @Override + public Object execute(Object[] parameters) { + ParametersParameterAccessor accessor = new ParametersParameterAccessor(queryMethod.getParameters(), parameters); + CriteriaQuery query = createQuery(accessor); + if(tree.isDelete()) { + Object result = countOrGetDocumentsForDelete(query, accessor); + elasticsearchOperations.delete(query, queryMethod.getEntityInformation().getJavaType()); + return result; + } else if (queryMethod.isPageQuery()) { + query.setPageable(accessor.getPageable()); + return elasticsearchOperations.queryForPage(query, queryMethod.getEntityInformation().getJavaType()); + } else if (queryMethod.isStreamQuery()) { + Class entityType = queryMethod.getEntityInformation().getJavaType(); + if (query.getPageable().isUnpaged()) { + int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType()); + query.setPageable(PageRequest.of(0, Math.max(1, itemCount))); + } + + return StreamUtils.createStreamFromIterator((CloseableIterator) elasticsearchOperations.stream(query, entityType)); + + } else if (queryMethod.isCollectionQuery()) { + if (accessor.getPageable() == null) { + int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType()); + query.setPageable(PageRequest.of(0, Math.max(1, itemCount))); + } else { + query.setPageable(accessor.getPageable()); + } + return elasticsearchOperations.queryForList(query, queryMethod.getEntityInformation().getJavaType()); + } else if (tree.isCountProjection()) { + return elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType()); + } + return elasticsearchOperations.queryForObject(query, queryMethod.getEntityInformation().getJavaType()); + } + + private Object countOrGetDocumentsForDelete(CriteriaQuery query, ParametersParameterAccessor accessor) { + + Object result = null; + + if (queryMethod.isCollectionQuery()) { + if (accessor.getPageable().isUnpaged()) { + int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType()); + query.setPageable(PageRequest.of(0, Math.max(1, itemCount))); + } else { + query.setPageable(accessor.getPageable()); + } + result = elasticsearchOperations.queryForList(query, queryMethod.getEntityInformation().getJavaType()); + } + + if (ClassUtils.isAssignable(Number.class, queryMethod.getReturnedObjectType())) { + result = elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType()); + } + return result; + } + + public CriteriaQuery createQuery(ParametersParameterAccessor accessor) { + return new ElasticsearchQueryCreator(tree, accessor, mappingContext).createQuery(); + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchQueryMethod.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchQueryMethod.java index 5aed6246e..0aa6ba0d1 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchQueryMethod.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchQueryMethod.java @@ -1,50 +1,50 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository.query; - -import java.lang.reflect.Method; - -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.data.elasticsearch.annotations.Query; -import org.springframework.data.projection.ProjectionFactory; -import org.springframework.data.repository.core.RepositoryMetadata; -import org.springframework.data.repository.query.QueryMethod; - -/** - * ElasticsearchQueryMethod - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Oliver Gierke - * @author Mark Paluch - */ -public class ElasticsearchQueryMethod extends QueryMethod { - - private final Query queryAnnotation; - - public ElasticsearchQueryMethod(Method method, RepositoryMetadata metadata, ProjectionFactory factory) { - super(method, metadata, factory); - this.queryAnnotation = method.getAnnotation(Query.class); - } - - public boolean hasAnnotatedQuery() { - return this.queryAnnotation != null; - } - - public String getAnnotatedQuery() { - return (String) AnnotationUtils.getValue(queryAnnotation, "value"); - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository.query; + +import java.lang.reflect.Method; + +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.data.elasticsearch.annotations.Query; +import org.springframework.data.projection.ProjectionFactory; +import org.springframework.data.repository.core.RepositoryMetadata; +import org.springframework.data.repository.query.QueryMethod; + +/** + * ElasticsearchQueryMethod + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Oliver Gierke + * @author Mark Paluch + */ +public class ElasticsearchQueryMethod extends QueryMethod { + + private final Query queryAnnotation; + + public ElasticsearchQueryMethod(Method method, RepositoryMetadata metadata, ProjectionFactory factory) { + super(method, metadata, factory); + this.queryAnnotation = method.getAnnotation(Query.class); + } + + public boolean hasAnnotatedQuery() { + return this.queryAnnotation != null; + } + + public String getAnnotatedQuery() { + return (String) AnnotationUtils.getValue(queryAnnotation, "value"); + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java index 99500b6c9..c7555ae84 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java @@ -1,105 +1,105 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository.query; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.springframework.core.convert.support.GenericConversionService; -import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.core.ElasticsearchOperations; -import org.springframework.data.elasticsearch.core.convert.DateTimeConverters; -import org.springframework.data.elasticsearch.core.query.StringQuery; -import org.springframework.data.repository.query.ParametersParameterAccessor; -import org.springframework.util.Assert; - -/** - * ElasticsearchStringQuery - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Mark Paluch - */ -public class ElasticsearchStringQuery extends AbstractElasticsearchRepositoryQuery { - - private static final Pattern PARAMETER_PLACEHOLDER = Pattern.compile("\\?(\\d+)"); - private String query; - - private final GenericConversionService conversionService = new GenericConversionService(); - - { - if (!conversionService.canConvert(java.util.Date.class, String.class)) { - conversionService.addConverter(DateTimeConverters.JavaDateConverter.INSTANCE); - } - if (!conversionService.canConvert(org.joda.time.ReadableInstant.class, String.class)) { - conversionService.addConverter(DateTimeConverters.JodaDateTimeConverter.INSTANCE); - } - if (!conversionService.canConvert(org.joda.time.LocalDateTime.class, String.class)) { - conversionService.addConverter(DateTimeConverters.JodaLocalDateTimeConverter.INSTANCE); - } - } - - public ElasticsearchStringQuery(ElasticsearchQueryMethod queryMethod, ElasticsearchOperations elasticsearchOperations, - String query) { - super(queryMethod, elasticsearchOperations); - Assert.notNull(query, "Query cannot be empty"); - this.query = query; - } - - @Override - public Object execute(Object[] parameters) { - ParametersParameterAccessor accessor = new ParametersParameterAccessor(queryMethod.getParameters(), parameters); - StringQuery stringQuery = createQuery(accessor); - if (queryMethod.isPageQuery()) { - stringQuery.setPageable(accessor.getPageable()); - return elasticsearchOperations.queryForPage(stringQuery, queryMethod.getEntityInformation().getJavaType()); - } else if (queryMethod.isCollectionQuery()) { - if (accessor.getPageable().isPaged()) { - stringQuery.setPageable(accessor.getPageable()); - } - return elasticsearchOperations.queryForList(stringQuery, queryMethod.getEntityInformation().getJavaType()); - } - - return elasticsearchOperations.queryForObject(stringQuery, queryMethod.getEntityInformation().getJavaType()); - } - - protected StringQuery createQuery(ParametersParameterAccessor parameterAccessor) { - String queryString = replacePlaceholders(this.query, parameterAccessor); - return new StringQuery(queryString); - } - - private String replacePlaceholders(String input, ParametersParameterAccessor accessor) { - Matcher matcher = PARAMETER_PLACEHOLDER.matcher(input); - String result = input; - while (matcher.find()) { - String group = matcher.group(); - int index = Integer.parseInt(matcher.group(1)); - result = result.replace(group, getParameterWithIndex(accessor, index)); - } - return result; - } - - private String getParameterWithIndex(ParametersParameterAccessor accessor, int index) { - Object parameter = accessor.getBindableValue(index); - if (parameter == null) { - return "null"; - } - if (conversionService.canConvert(parameter.getClass(), String.class)) { - return conversionService.convert(parameter, String.class); - } - return parameter.toString(); - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository.query; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.springframework.core.convert.support.GenericConversionService; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.core.convert.DateTimeConverters; +import org.springframework.data.elasticsearch.core.query.StringQuery; +import org.springframework.data.repository.query.ParametersParameterAccessor; +import org.springframework.util.Assert; + +/** + * ElasticsearchStringQuery + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Mark Paluch + */ +public class ElasticsearchStringQuery extends AbstractElasticsearchRepositoryQuery { + + private static final Pattern PARAMETER_PLACEHOLDER = Pattern.compile("\\?(\\d+)"); + private String query; + + private final GenericConversionService conversionService = new GenericConversionService(); + + { + if (!conversionService.canConvert(java.util.Date.class, String.class)) { + conversionService.addConverter(DateTimeConverters.JavaDateConverter.INSTANCE); + } + if (!conversionService.canConvert(org.joda.time.ReadableInstant.class, String.class)) { + conversionService.addConverter(DateTimeConverters.JodaDateTimeConverter.INSTANCE); + } + if (!conversionService.canConvert(org.joda.time.LocalDateTime.class, String.class)) { + conversionService.addConverter(DateTimeConverters.JodaLocalDateTimeConverter.INSTANCE); + } + } + + public ElasticsearchStringQuery(ElasticsearchQueryMethod queryMethod, ElasticsearchOperations elasticsearchOperations, + String query) { + super(queryMethod, elasticsearchOperations); + Assert.notNull(query, "Query cannot be empty"); + this.query = query; + } + + @Override + public Object execute(Object[] parameters) { + ParametersParameterAccessor accessor = new ParametersParameterAccessor(queryMethod.getParameters(), parameters); + StringQuery stringQuery = createQuery(accessor); + if (queryMethod.isPageQuery()) { + stringQuery.setPageable(accessor.getPageable()); + return elasticsearchOperations.queryForPage(stringQuery, queryMethod.getEntityInformation().getJavaType()); + } else if (queryMethod.isCollectionQuery()) { + if (accessor.getPageable().isPaged()) { + stringQuery.setPageable(accessor.getPageable()); + } + return elasticsearchOperations.queryForList(stringQuery, queryMethod.getEntityInformation().getJavaType()); + } + + return elasticsearchOperations.queryForObject(stringQuery, queryMethod.getEntityInformation().getJavaType()); + } + + protected StringQuery createQuery(ParametersParameterAccessor parameterAccessor) { + String queryString = replacePlaceholders(this.query, parameterAccessor); + return new StringQuery(queryString); + } + + private String replacePlaceholders(String input, ParametersParameterAccessor accessor) { + Matcher matcher = PARAMETER_PLACEHOLDER.matcher(input); + String result = input; + while (matcher.find()) { + String group = matcher.group(); + int index = Integer.parseInt(matcher.group(1)); + result = result.replace(group, getParameterWithIndex(accessor, index)); + } + return result; + } + + private String getParameterWithIndex(ParametersParameterAccessor accessor, int index) { + Object parameter = accessor.getBindableValue(index); + if (parameter == null) { + return "null"; + } + if (conversionService.canConvert(parameter.getClass(), String.class)) { + return conversionService.convert(parameter, String.class); + } + return parameter.toString(); + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/parser/ElasticsearchQueryCreator.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/parser/ElasticsearchQueryCreator.java index 9b54f5f59..a5555c0d0 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/parser/ElasticsearchQueryCreator.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/parser/ElasticsearchQueryCreator.java @@ -1,195 +1,195 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository.query.parser; - -import java.util.Collection; -import java.util.Iterator; - -import org.springframework.dao.InvalidDataAccessApiUsageException; -import org.springframework.data.domain.Sort; -import org.springframework.data.elasticsearch.core.geo.GeoBox; -import org.springframework.data.elasticsearch.core.geo.GeoPoint; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; -import org.springframework.data.elasticsearch.core.query.Criteria; -import org.springframework.data.elasticsearch.core.query.CriteriaQuery; -import org.springframework.data.geo.Box; -import org.springframework.data.geo.Distance; -import org.springframework.data.geo.Point; -import org.springframework.data.mapping.context.MappingContext; -import org.springframework.data.mapping.context.PersistentPropertyPath; -import org.springframework.data.repository.query.ParameterAccessor; -import org.springframework.data.repository.query.parser.AbstractQueryCreator; -import org.springframework.data.repository.query.parser.Part; -import org.springframework.data.repository.query.parser.PartTree; - -/** - * ElasticsearchQueryCreator - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Franck Marchand - * @author Artur Konczak - */ -public class ElasticsearchQueryCreator extends AbstractQueryCreator { - - private final MappingContext context; - - public ElasticsearchQueryCreator(PartTree tree, ParameterAccessor parameters, - MappingContext context) { - super(tree, parameters); - this.context = context; - } - - public ElasticsearchQueryCreator(PartTree tree, MappingContext context) { - super(tree); - this.context = context; - } - - @Override - protected CriteriaQuery create(Part part, Iterator iterator) { - PersistentPropertyPath path = context - .getPersistentPropertyPath(part.getProperty()); - return new CriteriaQuery(from(part, - new Criteria(path.toDotPath(ElasticsearchPersistentProperty.PropertyToFieldNameConverter.INSTANCE)), iterator)); - } - - @Override - protected CriteriaQuery and(Part part, CriteriaQuery base, Iterator iterator) { - if (base == null) { - return create(part, iterator); - } - PersistentPropertyPath path = context - .getPersistentPropertyPath(part.getProperty()); - return base.addCriteria(from(part, - new Criteria(path.toDotPath(ElasticsearchPersistentProperty.PropertyToFieldNameConverter.INSTANCE)), iterator)); - } - - @Override - protected CriteriaQuery or(CriteriaQuery base, CriteriaQuery query) { - return new CriteriaQuery(base.getCriteria().or(query.getCriteria())); - } - - @Override - protected CriteriaQuery complete(CriteriaQuery query, Sort sort) { - if (query == null) { - return null; - } - return query.addSort(sort); - } - - private Criteria from(Part part, Criteria instance, Iterator parameters) { - Part.Type type = part.getType(); - - Criteria criteria = instance; - if (criteria == null) { - criteria = new Criteria(); - } - switch (type) { - case TRUE: - return criteria.is(true); - case FALSE: - return criteria.is(false); - case NEGATING_SIMPLE_PROPERTY: - return criteria.is(parameters.next()).not(); - case REGEX: - return criteria.expression(parameters.next().toString()); - case LIKE: - case STARTING_WITH: - return criteria.startsWith(parameters.next().toString()); - case ENDING_WITH: - return criteria.endsWith(parameters.next().toString()); - case CONTAINING: - return criteria.contains(parameters.next().toString()); - case GREATER_THAN: - return criteria.greaterThan(parameters.next()); - case AFTER: - case GREATER_THAN_EQUAL: - return criteria.greaterThanEqual(parameters.next()); - case LESS_THAN: - return criteria.lessThan(parameters.next()); - case BEFORE: - case LESS_THAN_EQUAL: - return criteria.lessThanEqual(parameters.next()); - case BETWEEN: - return criteria.between(parameters.next(), parameters.next()); - case IN: - return criteria.in(asArray(parameters.next())); - case NOT_IN: - return criteria.notIn(asArray(parameters.next())); - case SIMPLE_PROPERTY: - case WITHIN: { - Object firstParameter = parameters.next(); - Object secondParameter = null; - if (type == Part.Type.SIMPLE_PROPERTY) { - if (part.getProperty().getType() != GeoPoint.class) - return criteria.is(firstParameter); - else { - // it means it's a simple find with exact geopoint matching (e.g. findByLocation) - // and because Elasticsearch does not have any kind of query with just a geopoint - // as argument we use a "geo distance" query with a distance of one meter. - secondParameter = ".001km"; - } - } else { - secondParameter = parameters.next(); - } - - if (firstParameter instanceof GeoPoint && secondParameter instanceof String) - return criteria.within((GeoPoint) firstParameter, (String) secondParameter); - - if (firstParameter instanceof Point && secondParameter instanceof Distance) - return criteria.within((Point) firstParameter, (Distance) secondParameter); - - if (firstParameter instanceof String && secondParameter instanceof String) - return criteria.within((String) firstParameter, (String) secondParameter); - } - case NEAR: { - Object firstParameter = parameters.next(); - - if (firstParameter instanceof GeoBox) { - return criteria.boundedBy((GeoBox) firstParameter); - } - - if (firstParameter instanceof Box) { - return criteria.boundedBy(GeoBox.fromBox((Box) firstParameter)); - } - - Object secondParameter = parameters.next(); - - // "near" query can be the same query as the "within" query - if (firstParameter instanceof GeoPoint && secondParameter instanceof String) - return criteria.within((GeoPoint) firstParameter, (String) secondParameter); - - if (firstParameter instanceof Point && secondParameter instanceof Distance) - return criteria.within((Point) firstParameter, (Distance) secondParameter); - - if (firstParameter instanceof String && secondParameter instanceof String) - return criteria.within((String) firstParameter, (String) secondParameter); - } - - default: - throw new InvalidDataAccessApiUsageException("Illegal criteria found '" + type + "'."); - } - } - - private Object[] asArray(Object o) { - if (o instanceof Collection) { - return ((Collection) o).toArray(); - } else if (o.getClass().isArray()) { - return (Object[]) o; - } - return new Object[]{o}; - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository.query.parser; + +import java.util.Collection; +import java.util.Iterator; + +import org.springframework.dao.InvalidDataAccessApiUsageException; +import org.springframework.data.domain.Sort; +import org.springframework.data.elasticsearch.core.geo.GeoBox; +import org.springframework.data.elasticsearch.core.geo.GeoPoint; +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; +import org.springframework.data.elasticsearch.core.query.Criteria; +import org.springframework.data.elasticsearch.core.query.CriteriaQuery; +import org.springframework.data.geo.Box; +import org.springframework.data.geo.Distance; +import org.springframework.data.geo.Point; +import org.springframework.data.mapping.context.MappingContext; +import org.springframework.data.mapping.context.PersistentPropertyPath; +import org.springframework.data.repository.query.ParameterAccessor; +import org.springframework.data.repository.query.parser.AbstractQueryCreator; +import org.springframework.data.repository.query.parser.Part; +import org.springframework.data.repository.query.parser.PartTree; + +/** + * ElasticsearchQueryCreator + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Franck Marchand + * @author Artur Konczak + */ +public class ElasticsearchQueryCreator extends AbstractQueryCreator { + + private final MappingContext context; + + public ElasticsearchQueryCreator(PartTree tree, ParameterAccessor parameters, + MappingContext context) { + super(tree, parameters); + this.context = context; + } + + public ElasticsearchQueryCreator(PartTree tree, MappingContext context) { + super(tree); + this.context = context; + } + + @Override + protected CriteriaQuery create(Part part, Iterator iterator) { + PersistentPropertyPath path = context + .getPersistentPropertyPath(part.getProperty()); + return new CriteriaQuery(from(part, + new Criteria(path.toDotPath(ElasticsearchPersistentProperty.PropertyToFieldNameConverter.INSTANCE)), iterator)); + } + + @Override + protected CriteriaQuery and(Part part, CriteriaQuery base, Iterator iterator) { + if (base == null) { + return create(part, iterator); + } + PersistentPropertyPath path = context + .getPersistentPropertyPath(part.getProperty()); + return base.addCriteria(from(part, + new Criteria(path.toDotPath(ElasticsearchPersistentProperty.PropertyToFieldNameConverter.INSTANCE)), iterator)); + } + + @Override + protected CriteriaQuery or(CriteriaQuery base, CriteriaQuery query) { + return new CriteriaQuery(base.getCriteria().or(query.getCriteria())); + } + + @Override + protected CriteriaQuery complete(CriteriaQuery query, Sort sort) { + if (query == null) { + return null; + } + return query.addSort(sort); + } + + private Criteria from(Part part, Criteria instance, Iterator parameters) { + Part.Type type = part.getType(); + + Criteria criteria = instance; + if (criteria == null) { + criteria = new Criteria(); + } + switch (type) { + case TRUE: + return criteria.is(true); + case FALSE: + return criteria.is(false); + case NEGATING_SIMPLE_PROPERTY: + return criteria.is(parameters.next()).not(); + case REGEX: + return criteria.expression(parameters.next().toString()); + case LIKE: + case STARTING_WITH: + return criteria.startsWith(parameters.next().toString()); + case ENDING_WITH: + return criteria.endsWith(parameters.next().toString()); + case CONTAINING: + return criteria.contains(parameters.next().toString()); + case GREATER_THAN: + return criteria.greaterThan(parameters.next()); + case AFTER: + case GREATER_THAN_EQUAL: + return criteria.greaterThanEqual(parameters.next()); + case LESS_THAN: + return criteria.lessThan(parameters.next()); + case BEFORE: + case LESS_THAN_EQUAL: + return criteria.lessThanEqual(parameters.next()); + case BETWEEN: + return criteria.between(parameters.next(), parameters.next()); + case IN: + return criteria.in(asArray(parameters.next())); + case NOT_IN: + return criteria.notIn(asArray(parameters.next())); + case SIMPLE_PROPERTY: + case WITHIN: { + Object firstParameter = parameters.next(); + Object secondParameter = null; + if (type == Part.Type.SIMPLE_PROPERTY) { + if (part.getProperty().getType() != GeoPoint.class) + return criteria.is(firstParameter); + else { + // it means it's a simple find with exact geopoint matching (e.g. findByLocation) + // and because Elasticsearch does not have any kind of query with just a geopoint + // as argument we use a "geo distance" query with a distance of one meter. + secondParameter = ".001km"; + } + } else { + secondParameter = parameters.next(); + } + + if (firstParameter instanceof GeoPoint && secondParameter instanceof String) + return criteria.within((GeoPoint) firstParameter, (String) secondParameter); + + if (firstParameter instanceof Point && secondParameter instanceof Distance) + return criteria.within((Point) firstParameter, (Distance) secondParameter); + + if (firstParameter instanceof String && secondParameter instanceof String) + return criteria.within((String) firstParameter, (String) secondParameter); + } + case NEAR: { + Object firstParameter = parameters.next(); + + if (firstParameter instanceof GeoBox) { + return criteria.boundedBy((GeoBox) firstParameter); + } + + if (firstParameter instanceof Box) { + return criteria.boundedBy(GeoBox.fromBox((Box) firstParameter)); + } + + Object secondParameter = parameters.next(); + + // "near" query can be the same query as the "within" query + if (firstParameter instanceof GeoPoint && secondParameter instanceof String) + return criteria.within((GeoPoint) firstParameter, (String) secondParameter); + + if (firstParameter instanceof Point && secondParameter instanceof Distance) + return criteria.within((Point) firstParameter, (Distance) secondParameter); + + if (firstParameter instanceof String && secondParameter instanceof String) + return criteria.within((String) firstParameter, (String) secondParameter); + } + + default: + throw new InvalidDataAccessApiUsageException("Illegal criteria found '" + type + "'."); + } + } + + private Object[] asArray(Object o) { + if (o instanceof Collection) { + return ((Collection) o).toArray(); + } else if (o.getClass().isArray()) { + return (Object[]) o; + } + return new Object[]{o}; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchEntityInformation.java b/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchEntityInformation.java index 4a738c921..c30ee73df 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchEntityInformation.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchEntityInformation.java @@ -1,38 +1,38 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository.support; - -import org.springframework.data.repository.core.EntityInformation; - -/** - * @param - * @param - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Christoph Strobl - */ -public interface ElasticsearchEntityInformation extends EntityInformation { - - String getIdAttribute(); - - String getIndexName(); - - String getType(); - - Long getVersion(T entity); - - String getParentId(T entity); -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository.support; + +import org.springframework.data.repository.core.EntityInformation; + +/** + * @param + * @param + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Christoph Strobl + */ +public interface ElasticsearchEntityInformation extends EntityInformation { + + String getIdAttribute(); + + String getIndexName(); + + String getType(); + + Long getVersion(T entity); + + String getParentId(T entity); +} diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchEntityInformationCreator.java b/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchEntityInformationCreator.java index 3a7570a5c..6bdc78b24 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchEntityInformationCreator.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchEntityInformationCreator.java @@ -1,28 +1,28 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository.support; - -/** - * ElasticsearchEntityInformationCreator - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Christoph Strobl - */ -public interface ElasticsearchEntityInformationCreator { - - ElasticsearchEntityInformation getEntityInformation(Class domainClass); -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository.support; + +/** + * ElasticsearchEntityInformationCreator + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Christoph Strobl + */ +public interface ElasticsearchEntityInformationCreator { + + ElasticsearchEntityInformation getEntityInformation(Class domainClass); +} diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchEntityInformationCreatorImpl.java b/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchEntityInformationCreatorImpl.java index 2d8d03ccb..46421e0ed 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchEntityInformationCreatorImpl.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchEntityInformationCreatorImpl.java @@ -1,56 +1,56 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository.support; - -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; -import org.springframework.data.mapping.context.MappingContext; -import org.springframework.util.Assert; - -/** - * ElasticsearchEntityInformationCreatorImpl - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Oliver Gierke - * @author Mark Paluch - * @author Christoph Strobl - */ -public class ElasticsearchEntityInformationCreatorImpl implements ElasticsearchEntityInformationCreator { - - private final MappingContext, ElasticsearchPersistentProperty> mappingContext; - - public ElasticsearchEntityInformationCreatorImpl( - MappingContext, ElasticsearchPersistentProperty> mappingContext) { - - Assert.notNull(mappingContext, "MappingContext must not be null!"); - - this.mappingContext = mappingContext; - } - - @Override - @SuppressWarnings("unchecked") - public ElasticsearchEntityInformation getEntityInformation(Class domainClass) { - - ElasticsearchPersistentEntity persistentEntity = (ElasticsearchPersistentEntity) mappingContext - .getRequiredPersistentEntity(domainClass); - - Assert.notNull(persistentEntity, String.format("Unable to obtain mapping metadata for %s!", domainClass)); - Assert.notNull(persistentEntity.getIdProperty(), String.format("No id property found for %s!", domainClass)); - - return new MappingElasticsearchEntityInformation<>(persistentEntity); - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository.support; + +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; +import org.springframework.data.mapping.context.MappingContext; +import org.springframework.util.Assert; + +/** + * ElasticsearchEntityInformationCreatorImpl + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Oliver Gierke + * @author Mark Paluch + * @author Christoph Strobl + */ +public class ElasticsearchEntityInformationCreatorImpl implements ElasticsearchEntityInformationCreator { + + private final MappingContext, ElasticsearchPersistentProperty> mappingContext; + + public ElasticsearchEntityInformationCreatorImpl( + MappingContext, ElasticsearchPersistentProperty> mappingContext) { + + Assert.notNull(mappingContext, "MappingContext must not be null!"); + + this.mappingContext = mappingContext; + } + + @Override + @SuppressWarnings("unchecked") + public ElasticsearchEntityInformation getEntityInformation(Class domainClass) { + + ElasticsearchPersistentEntity persistentEntity = (ElasticsearchPersistentEntity) mappingContext + .getRequiredPersistentEntity(domainClass); + + Assert.notNull(persistentEntity, String.format("Unable to obtain mapping metadata for %s!", domainClass)); + Assert.notNull(persistentEntity.getIdProperty(), String.format("No id property found for %s!", domainClass)); + + return new MappingElasticsearchEntityInformation<>(persistentEntity); + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepository.java b/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepository.java index e6bef78b1..25472b605 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepository.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepository.java @@ -1,47 +1,47 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository.support; - -import org.springframework.data.elasticsearch.core.ElasticsearchOperations; - -/** - * Elasticsearch specific repository implementation. Likely to be used as target within - * {@link ElasticsearchRepositoryFactory} - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Ryan Henszey - */ -public class SimpleElasticsearchRepository extends AbstractElasticsearchRepository { - - public SimpleElasticsearchRepository() { - super(); - } - - public SimpleElasticsearchRepository(ElasticsearchEntityInformation metadata, - ElasticsearchOperations elasticsearchOperations) { - super(metadata, elasticsearchOperations); - } - - public SimpleElasticsearchRepository(ElasticsearchOperations elasticsearchOperations) { - super(elasticsearchOperations); - } - - @Override - protected String stringIdRepresentation(String id) { - return id; - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository.support; + +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; + +/** + * Elasticsearch specific repository implementation. Likely to be used as target within + * {@link ElasticsearchRepositoryFactory} + * + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Ryan Henszey + */ +public class SimpleElasticsearchRepository extends AbstractElasticsearchRepository { + + public SimpleElasticsearchRepository() { + super(); + } + + public SimpleElasticsearchRepository(ElasticsearchEntityInformation metadata, + ElasticsearchOperations elasticsearchOperations) { + super(metadata, elasticsearchOperations); + } + + public SimpleElasticsearchRepository(ElasticsearchOperations elasticsearchOperations) { + super(elasticsearchOperations); + } + + @Override + protected String stringIdRepresentation(String id) { + return id; + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/InnerObjectTests.java b/src/test/java/org/springframework/data/elasticsearch/InnerObjectTests.java index 6e62ad0b5..024059eeb 100644 --- a/src/test/java/org/springframework/data/elasticsearch/InnerObjectTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/InnerObjectTests.java @@ -1,73 +1,73 @@ -/* - * Copyright 2014-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch; - -import static org.apache.commons.lang.RandomStringUtils.*; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.entities.Author; -import org.springframework.data.elasticsearch.entities.Book; -import org.springframework.data.elasticsearch.repositories.book.SampleElasticSearchBookRepository; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -/** - * @author Mohsin Husen - * @author Christoph Strobl - */ - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("classpath:/repository-test-nested-object-books.xml") -public class InnerObjectTests { - - @Autowired private SampleElasticSearchBookRepository bookRepository; - - @Autowired private ElasticsearchTemplate elasticsearchTemplate; - - @Before - public void before() { - elasticsearchTemplate.deleteIndex(Book.class); - elasticsearchTemplate.createIndex(Book.class); - elasticsearchTemplate.putMapping(Book.class); - elasticsearchTemplate.refresh(Book.class); - } - - @Test - public void shouldIndexInnerObject() { - // given - String id = randomAlphanumeric(5); - Book book = new Book(); - book.setId(id); - book.setName("xyz"); - Author author = new Author(); - author.setId("1"); - author.setName("ABC"); - book.setAuthor(author); - // when - bookRepository.save(book); - // then - assertThat(bookRepository.findById(id), is(notNullValue())); - } -} +/* + * Copyright 2014-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch; + +import static org.apache.commons.lang.RandomStringUtils.*; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.entities.Author; +import org.springframework.data.elasticsearch.entities.Book; +import org.springframework.data.elasticsearch.repositories.book.SampleElasticSearchBookRepository; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Mohsin Husen + * @author Christoph Strobl + */ + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:/repository-test-nested-object-books.xml") +public class InnerObjectTests { + + @Autowired private SampleElasticSearchBookRepository bookRepository; + + @Autowired private ElasticsearchTemplate elasticsearchTemplate; + + @Before + public void before() { + elasticsearchTemplate.deleteIndex(Book.class); + elasticsearchTemplate.createIndex(Book.class); + elasticsearchTemplate.putMapping(Book.class); + elasticsearchTemplate.refresh(Book.class); + } + + @Test + public void shouldIndexInnerObject() { + // given + String id = randomAlphanumeric(5); + Book book = new Book(); + book.setId(id); + book.setName("xyz"); + Author author = new Author(); + author.setId("1"); + author.setName("ABC"); + book.setAuthor(author); + // when + bookRepository.save(book); + // then + assertThat(bookRepository.findById(id), is(notNullValue())); + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/NestedObjectTests.java b/src/test/java/org/springframework/data/elasticsearch/NestedObjectTests.java index c37c4b75c..066178c84 100644 --- a/src/test/java/org/springframework/data/elasticsearch/NestedObjectTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/NestedObjectTests.java @@ -1,385 +1,385 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch; - -import static org.apache.commons.lang.RandomStringUtils.*; -import static org.elasticsearch.index.query.QueryBuilders.*; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.*; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.lucene.search.join.ScoreMode; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilder; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.query.GetQuery; -import org.springframework.data.elasticsearch.core.query.IndexQuery; -import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; -import org.springframework.data.elasticsearch.core.query.SearchQuery; -import org.springframework.data.elasticsearch.entities.Author; -import org.springframework.data.elasticsearch.entities.Book; -import org.springframework.data.elasticsearch.entities.Car; -import org.springframework.data.elasticsearch.entities.GirlFriend; -import org.springframework.data.elasticsearch.entities.Person; -import org.springframework.data.elasticsearch.entities.PersonMultipleLevelNested; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - */ -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("classpath:/repository-test-nested-object.xml") -public class NestedObjectTests { - - @Autowired - private ElasticsearchTemplate elasticsearchTemplate; - - - @Before - public void before() { - elasticsearchTemplate.deleteIndex(Book.class); - elasticsearchTemplate.createIndex(Book.class); - elasticsearchTemplate.putMapping(Book.class); - elasticsearchTemplate.refresh(Book.class); - elasticsearchTemplate.deleteIndex(Person.class); - elasticsearchTemplate.createIndex(Person.class); - elasticsearchTemplate.putMapping(Person.class); - elasticsearchTemplate.refresh(Person.class); - elasticsearchTemplate.deleteIndex(PersonMultipleLevelNested.class); - elasticsearchTemplate.createIndex(PersonMultipleLevelNested.class); - elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class); - elasticsearchTemplate.refresh(PersonMultipleLevelNested.class); - } - - @Test - public void shouldIndexInitialLevelNestedObject() { - - final List cars = new ArrayList<>(); - - final Car saturn = new Car(); - saturn.setName("Saturn"); - saturn.setModel("SL"); - - final Car subaru = new Car(); - subaru.setName("Subaru"); - subaru.setModel("Imprezza"); - - final Car ford = new Car(); - ford.setName("Ford"); - ford.setModel("Focus"); - - cars.add(saturn); - cars.add(subaru); - cars.add(ford); - - final Person foo = new Person(); - foo.setName("Foo"); - foo.setId("1"); - foo.setCar(cars); - - final Car car = new Car(); - car.setName("Saturn"); - car.setModel("Imprezza"); - - final Person bar = new Person(); - bar.setId("2"); - bar.setName("Bar"); - bar.setCar(Arrays.asList(car)); - - final List indexQueries = new ArrayList<>(); - final IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(foo.getId()); - indexQuery1.setObject(foo); - - final IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(bar.getId()); - indexQuery2.setObject(bar); - - indexQueries.add(indexQuery1); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.putMapping(Person.class); - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(Person.class); - - final QueryBuilder builder = nestedQuery("car", boolQuery().must(termQuery("car.name", "saturn")).must(termQuery("car.model", "imprezza")), ScoreMode.None); - - final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); - final List persons = elasticsearchTemplate.queryForList(searchQuery, Person.class); - - assertThat(persons.size(), is(1)); - } - - @Test - public void shouldIndexMultipleLevelNestedObject() { - //given - final List indexQueries = createPerson(); - - //when - elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class); - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(PersonMultipleLevelNested.class); - - //then - final GetQuery getQuery = new GetQuery(); - getQuery.setId("1"); - final PersonMultipleLevelNested personIndexed = elasticsearchTemplate.queryForObject(getQuery, PersonMultipleLevelNested.class); - assertThat(personIndexed, is(notNullValue())); - } - - @Test - public void shouldIndexMultipleLevelNestedObjectWithIncludeInParent() { - //given - final List indexQueries = createPerson(); - - //when - elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class); - elasticsearchTemplate.bulkIndex(indexQueries); - // then - - final Map mapping = elasticsearchTemplate.getMapping(PersonMultipleLevelNested.class); - - assertThat(mapping, is(notNullValue())); - final Map propertyMap = (Map) mapping.get("properties"); - assertThat(propertyMap, is(notNullValue())); - final Map bestCarsAttributes = (Map) propertyMap.get("bestCars"); - assertThat(bestCarsAttributes.get("include_in_parent"), is(notNullValue())); - } - - - @Test - public void shouldSearchUsingNestedQueryOnMultipleLevelNestedObject() { - //given - final List indexQueries = createPerson(); - - //when - elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class); - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(PersonMultipleLevelNested.class); - - //then - final BoolQueryBuilder builder = boolQuery(); - builder.must(nestedQuery("girlFriends", termQuery("girlFriends.type", "temp"),ScoreMode.None)) - .must(nestedQuery("girlFriends.cars", termQuery("girlFriends.cars.name", "Ford".toLowerCase()),ScoreMode.None)); - - final SearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(builder) - .build(); - - final Page personIndexed = elasticsearchTemplate.queryForPage(searchQuery, PersonMultipleLevelNested.class); - assertThat(personIndexed, is(notNullValue())); - assertThat(personIndexed.getTotalElements(), is(1L)); - assertThat(personIndexed.getContent().get(0).getId(), is("1")); - } - - - private List createPerson() { - - final PersonMultipleLevelNested person1 = new PersonMultipleLevelNested(); - - person1.setId("1"); - person1.setName("name"); - - final Car saturn = new Car(); - saturn.setName("Saturn"); - saturn.setModel("SL"); - - final Car subaru = new Car(); - subaru.setName("Subaru"); - subaru.setModel("Imprezza"); - - final Car car = new Car(); - car.setName("Saturn"); - car.setModel("Imprezza"); - - final Car ford = new Car(); - ford.setName("Ford"); - ford.setModel("Focus"); - - final GirlFriend permanent = new GirlFriend(); - permanent.setName("permanent"); - permanent.setType("permanent"); - permanent.setCars(Arrays.asList(saturn, subaru)); - - final GirlFriend temp = new GirlFriend(); - temp.setName("temp"); - temp.setType("temp"); - temp.setCars(Arrays.asList(car, ford)); - - person1.setGirlFriends(Arrays.asList(permanent, temp)); - - final IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(person1.getId()); - indexQuery1.setObject(person1); - - final PersonMultipleLevelNested person2 = new PersonMultipleLevelNested(); - - person2.setId("2"); - person2.setName("name"); - - person2.setGirlFriends(Arrays.asList(permanent)); - - final IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(person2.getId()); - indexQuery2.setObject(person2); - - final List indexQueries = new ArrayList<>(); - indexQueries.add(indexQuery1); - indexQueries.add(indexQuery2); - - return indexQueries; - } - - @Test - public void shouldSearchBooksForPersonInitialLevelNestedType() { - - final List cars = new ArrayList<>(); - - final Car saturn = new Car(); - saturn.setName("Saturn"); - saturn.setModel("SL"); - - final Car subaru = new Car(); - subaru.setName("Subaru"); - subaru.setModel("Imprezza"); - - final Car ford = new Car(); - ford.setName("Ford"); - ford.setModel("Focus"); - - cars.add(saturn); - cars.add(subaru); - cars.add(ford); - - final Book java = new Book(); - java.setId("1"); - java.setName("java"); - final Author javaAuthor = new Author(); - javaAuthor.setId("1"); - javaAuthor.setName("javaAuthor"); - java.setAuthor(javaAuthor); - - final Book spring = new Book(); - spring.setId("2"); - spring.setName("spring"); - final Author springAuthor = new Author(); - springAuthor.setId("2"); - springAuthor.setName("springAuthor"); - spring.setAuthor(springAuthor); - - final Person foo = new Person(); - foo.setName("Foo"); - foo.setId("1"); - foo.setCar(cars); - foo.setBooks(Arrays.asList(java, spring)); - - final Car car = new Car(); - car.setName("Saturn"); - car.setModel("Imprezza"); - - final Person bar = new Person(); - bar.setId("2"); - bar.setName("Bar"); - bar.setCar(Arrays.asList(car)); - - final List indexQueries = new ArrayList<>(); - final IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(foo.getId()); - indexQuery1.setObject(foo); - - final IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(bar.getId()); - indexQuery2.setObject(bar); - - indexQueries.add(indexQuery1); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.putMapping(Person.class); - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(Person.class); - - final QueryBuilder builder = nestedQuery("books", boolQuery().must(termQuery("books.name", "java")), ScoreMode.None); - - final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); - final List persons = elasticsearchTemplate.queryForList(searchQuery, Person.class); - - assertThat(persons.size(), is(1)); - } - - /* - DATAES-73 - */ - @Test - public void shouldIndexAndSearchMapAsNestedType() { - //given - final Book book1 = new Book(); - final Book book2 = new Book(); - - book1.setId(randomNumeric(5)); - book1.setName("testBook1"); - - book2.setId(randomNumeric(5)); - book2.setName("testBook2"); - - final Map> map1 = new HashMap<>(); - map1.put(1, Arrays.asList("test1", "test2")); - - final Map> map2 = new HashMap<>(); - map2.put(1, Arrays.asList("test3", "test4")); - - book1.setBuckets(map1); - book2.setBuckets(map2); - - final List indexQueries = new ArrayList<>(); - final IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(book1.getId()); - indexQuery1.setObject(book1); - - final IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(book2.getId()); - indexQuery2.setObject(book2); - - indexQueries.add(indexQuery1); - indexQueries.add(indexQuery2); - //when - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(Book.class); - //then - final SearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(nestedQuery("buckets", termQuery("buckets.1", "test3"),ScoreMode.None)) - .build(); - final Page books = elasticsearchTemplate.queryForPage(searchQuery, Book.class); - - assertThat(books.getContent().size(), is(1)); - assertThat(books.getContent().get(0).getId(), is(book2.getId())); - } -} - +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch; + +import static org.apache.commons.lang.RandomStringUtils.*; +import static org.elasticsearch.index.query.QueryBuilders.*; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.lucene.search.join.ScoreMode; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.query.GetQuery; +import org.springframework.data.elasticsearch.core.query.IndexQuery; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; +import org.springframework.data.elasticsearch.core.query.SearchQuery; +import org.springframework.data.elasticsearch.entities.Author; +import org.springframework.data.elasticsearch.entities.Book; +import org.springframework.data.elasticsearch.entities.Car; +import org.springframework.data.elasticsearch.entities.GirlFriend; +import org.springframework.data.elasticsearch.entities.Person; +import org.springframework.data.elasticsearch.entities.PersonMultipleLevelNested; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Artur Konczak + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:/repository-test-nested-object.xml") +public class NestedObjectTests { + + @Autowired + private ElasticsearchTemplate elasticsearchTemplate; + + + @Before + public void before() { + elasticsearchTemplate.deleteIndex(Book.class); + elasticsearchTemplate.createIndex(Book.class); + elasticsearchTemplate.putMapping(Book.class); + elasticsearchTemplate.refresh(Book.class); + elasticsearchTemplate.deleteIndex(Person.class); + elasticsearchTemplate.createIndex(Person.class); + elasticsearchTemplate.putMapping(Person.class); + elasticsearchTemplate.refresh(Person.class); + elasticsearchTemplate.deleteIndex(PersonMultipleLevelNested.class); + elasticsearchTemplate.createIndex(PersonMultipleLevelNested.class); + elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class); + elasticsearchTemplate.refresh(PersonMultipleLevelNested.class); + } + + @Test + public void shouldIndexInitialLevelNestedObject() { + + final List cars = new ArrayList<>(); + + final Car saturn = new Car(); + saturn.setName("Saturn"); + saturn.setModel("SL"); + + final Car subaru = new Car(); + subaru.setName("Subaru"); + subaru.setModel("Imprezza"); + + final Car ford = new Car(); + ford.setName("Ford"); + ford.setModel("Focus"); + + cars.add(saturn); + cars.add(subaru); + cars.add(ford); + + final Person foo = new Person(); + foo.setName("Foo"); + foo.setId("1"); + foo.setCar(cars); + + final Car car = new Car(); + car.setName("Saturn"); + car.setModel("Imprezza"); + + final Person bar = new Person(); + bar.setId("2"); + bar.setName("Bar"); + bar.setCar(Arrays.asList(car)); + + final List indexQueries = new ArrayList<>(); + final IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(foo.getId()); + indexQuery1.setObject(foo); + + final IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(bar.getId()); + indexQuery2.setObject(bar); + + indexQueries.add(indexQuery1); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.putMapping(Person.class); + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(Person.class); + + final QueryBuilder builder = nestedQuery("car", boolQuery().must(termQuery("car.name", "saturn")).must(termQuery("car.model", "imprezza")), ScoreMode.None); + + final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); + final List persons = elasticsearchTemplate.queryForList(searchQuery, Person.class); + + assertThat(persons.size(), is(1)); + } + + @Test + public void shouldIndexMultipleLevelNestedObject() { + //given + final List indexQueries = createPerson(); + + //when + elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class); + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(PersonMultipleLevelNested.class); + + //then + final GetQuery getQuery = new GetQuery(); + getQuery.setId("1"); + final PersonMultipleLevelNested personIndexed = elasticsearchTemplate.queryForObject(getQuery, PersonMultipleLevelNested.class); + assertThat(personIndexed, is(notNullValue())); + } + + @Test + public void shouldIndexMultipleLevelNestedObjectWithIncludeInParent() { + //given + final List indexQueries = createPerson(); + + //when + elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class); + elasticsearchTemplate.bulkIndex(indexQueries); + // then + + final Map mapping = elasticsearchTemplate.getMapping(PersonMultipleLevelNested.class); + + assertThat(mapping, is(notNullValue())); + final Map propertyMap = (Map) mapping.get("properties"); + assertThat(propertyMap, is(notNullValue())); + final Map bestCarsAttributes = (Map) propertyMap.get("bestCars"); + assertThat(bestCarsAttributes.get("include_in_parent"), is(notNullValue())); + } + + + @Test + public void shouldSearchUsingNestedQueryOnMultipleLevelNestedObject() { + //given + final List indexQueries = createPerson(); + + //when + elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class); + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(PersonMultipleLevelNested.class); + + //then + final BoolQueryBuilder builder = boolQuery(); + builder.must(nestedQuery("girlFriends", termQuery("girlFriends.type", "temp"),ScoreMode.None)) + .must(nestedQuery("girlFriends.cars", termQuery("girlFriends.cars.name", "Ford".toLowerCase()),ScoreMode.None)); + + final SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(builder) + .build(); + + final Page personIndexed = elasticsearchTemplate.queryForPage(searchQuery, PersonMultipleLevelNested.class); + assertThat(personIndexed, is(notNullValue())); + assertThat(personIndexed.getTotalElements(), is(1L)); + assertThat(personIndexed.getContent().get(0).getId(), is("1")); + } + + + private List createPerson() { + + final PersonMultipleLevelNested person1 = new PersonMultipleLevelNested(); + + person1.setId("1"); + person1.setName("name"); + + final Car saturn = new Car(); + saturn.setName("Saturn"); + saturn.setModel("SL"); + + final Car subaru = new Car(); + subaru.setName("Subaru"); + subaru.setModel("Imprezza"); + + final Car car = new Car(); + car.setName("Saturn"); + car.setModel("Imprezza"); + + final Car ford = new Car(); + ford.setName("Ford"); + ford.setModel("Focus"); + + final GirlFriend permanent = new GirlFriend(); + permanent.setName("permanent"); + permanent.setType("permanent"); + permanent.setCars(Arrays.asList(saturn, subaru)); + + final GirlFriend temp = new GirlFriend(); + temp.setName("temp"); + temp.setType("temp"); + temp.setCars(Arrays.asList(car, ford)); + + person1.setGirlFriends(Arrays.asList(permanent, temp)); + + final IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(person1.getId()); + indexQuery1.setObject(person1); + + final PersonMultipleLevelNested person2 = new PersonMultipleLevelNested(); + + person2.setId("2"); + person2.setName("name"); + + person2.setGirlFriends(Arrays.asList(permanent)); + + final IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(person2.getId()); + indexQuery2.setObject(person2); + + final List indexQueries = new ArrayList<>(); + indexQueries.add(indexQuery1); + indexQueries.add(indexQuery2); + + return indexQueries; + } + + @Test + public void shouldSearchBooksForPersonInitialLevelNestedType() { + + final List cars = new ArrayList<>(); + + final Car saturn = new Car(); + saturn.setName("Saturn"); + saturn.setModel("SL"); + + final Car subaru = new Car(); + subaru.setName("Subaru"); + subaru.setModel("Imprezza"); + + final Car ford = new Car(); + ford.setName("Ford"); + ford.setModel("Focus"); + + cars.add(saturn); + cars.add(subaru); + cars.add(ford); + + final Book java = new Book(); + java.setId("1"); + java.setName("java"); + final Author javaAuthor = new Author(); + javaAuthor.setId("1"); + javaAuthor.setName("javaAuthor"); + java.setAuthor(javaAuthor); + + final Book spring = new Book(); + spring.setId("2"); + spring.setName("spring"); + final Author springAuthor = new Author(); + springAuthor.setId("2"); + springAuthor.setName("springAuthor"); + spring.setAuthor(springAuthor); + + final Person foo = new Person(); + foo.setName("Foo"); + foo.setId("1"); + foo.setCar(cars); + foo.setBooks(Arrays.asList(java, spring)); + + final Car car = new Car(); + car.setName("Saturn"); + car.setModel("Imprezza"); + + final Person bar = new Person(); + bar.setId("2"); + bar.setName("Bar"); + bar.setCar(Arrays.asList(car)); + + final List indexQueries = new ArrayList<>(); + final IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(foo.getId()); + indexQuery1.setObject(foo); + + final IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(bar.getId()); + indexQuery2.setObject(bar); + + indexQueries.add(indexQuery1); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.putMapping(Person.class); + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(Person.class); + + final QueryBuilder builder = nestedQuery("books", boolQuery().must(termQuery("books.name", "java")), ScoreMode.None); + + final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); + final List persons = elasticsearchTemplate.queryForList(searchQuery, Person.class); + + assertThat(persons.size(), is(1)); + } + + /* + DATAES-73 + */ + @Test + public void shouldIndexAndSearchMapAsNestedType() { + //given + final Book book1 = new Book(); + final Book book2 = new Book(); + + book1.setId(randomNumeric(5)); + book1.setName("testBook1"); + + book2.setId(randomNumeric(5)); + book2.setName("testBook2"); + + final Map> map1 = new HashMap<>(); + map1.put(1, Arrays.asList("test1", "test2")); + + final Map> map2 = new HashMap<>(); + map2.put(1, Arrays.asList("test3", "test4")); + + book1.setBuckets(map1); + book2.setBuckets(map2); + + final List indexQueries = new ArrayList<>(); + final IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(book1.getId()); + indexQuery1.setObject(book1); + + final IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(book2.getId()); + indexQuery2.setObject(book2); + + indexQueries.add(indexQuery1); + indexQueries.add(indexQuery2); + //when + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(Book.class); + //then + final SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(nestedQuery("buckets", termQuery("buckets.1", "test3"),ScoreMode.None)) + .build(); + final Page books = elasticsearchTemplate.queryForPage(searchQuery, Book.class); + + assertThat(books.getContent().size(), is(1)); + assertThat(books.getContent().get(0).getId(), is(book2.getId())); + } +} + diff --git a/src/test/java/org/springframework/data/elasticsearch/NonDocumentEntityTests.java b/src/test/java/org/springframework/data/elasticsearch/NonDocumentEntityTests.java index 8242e88bf..e1ce1bdf5 100644 --- a/src/test/java/org/springframework/data/elasticsearch/NonDocumentEntityTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/NonDocumentEntityTests.java @@ -1,35 +1,35 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch; - -import org.junit.Test; -import org.springframework.beans.factory.BeanCreationException; -import org.springframework.context.support.ClassPathXmlApplicationContext; -import org.springframework.data.elasticsearch.repositories.nondocument.NonDocumentEntityRepository; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - */ -public class NonDocumentEntityTests { - - @Test(expected = BeanCreationException.class) - public void shouldNotInitialiseRepositoryWithNonDocument() { - // when - ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/repository-non-document-entity.xml"); - ctx.getBean(NonDocumentEntityRepository.class); - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch; + +import org.junit.Test; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.data.elasticsearch.repositories.nondocument.NonDocumentEntityRepository; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public class NonDocumentEntityTests { + + @Test(expected = BeanCreationException.class) + public void shouldNotInitialiseRepositoryWithNonDocument() { + // when + ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/repository-non-document-entity.xml"); + ctx.getBean(NonDocumentEntityRepository.class); + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/config/ElasticsearchNamespaceHandlerTests.java b/src/test/java/org/springframework/data/elasticsearch/config/ElasticsearchNamespaceHandlerTests.java index fcfb895c6..ac9e1834d 100644 --- a/src/test/java/org/springframework/data/elasticsearch/config/ElasticsearchNamespaceHandlerTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/config/ElasticsearchNamespaceHandlerTests.java @@ -1,55 +1,55 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.config; - -import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.*; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.data.elasticsearch.client.TransportClientFactoryBean; -import org.springframework.data.elasticsearch.repositories.sample.SampleElasticsearchRepository; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - */ - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("namespace.xml") -public class ElasticsearchNamespaceHandlerTests { - - @Autowired - private ApplicationContext context; - - @Test - public void shouldCreateTransportClient() { - assertThat(context.getBean(TransportClientFactoryBean.class), is(notNullValue())); - assertThat(context.getBean(TransportClientFactoryBean.class), is(instanceOf(TransportClientFactoryBean.class))); - } - - @Test - public void shouldCreateRepository() { - assertThat(context.getBean(TransportClientFactoryBean.class), is(notNullValue())); - assertThat(context.getBean(SampleElasticsearchRepository.class), - is(instanceOf(SampleElasticsearchRepository.class))); - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.config; + +import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.*; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.data.elasticsearch.client.TransportClientFactoryBean; +import org.springframework.data.elasticsearch.repositories.sample.SampleElasticsearchRepository; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + */ + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("namespace.xml") +public class ElasticsearchNamespaceHandlerTests { + + @Autowired + private ApplicationContext context; + + @Test + public void shouldCreateTransportClient() { + assertThat(context.getBean(TransportClientFactoryBean.class), is(notNullValue())); + assertThat(context.getBean(TransportClientFactoryBean.class), is(instanceOf(TransportClientFactoryBean.class))); + } + + @Test + public void shouldCreateRepository() { + assertThat(context.getBean(TransportClientFactoryBean.class), is(notNullValue())); + assertThat(context.getBean(SampleElasticsearchRepository.class), + is(instanceOf(SampleElasticsearchRepository.class))); + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java index c01710d35..30918ba3e 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -1,2014 +1,2014 @@ -/* - * Copyright 2014-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import org.apache.commons.lang.StringUtils; -import org.elasticsearch.action.get.MultiGetItemResponse; -import org.elasticsearch.action.get.MultiGetResponse; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.index.engine.DocumentMissingException; -import org.elasticsearch.script.Script; -import org.elasticsearch.script.ScriptType; -import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.SortOrder; -import org.hamcrest.Matchers; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.data.elasticsearch.ElasticsearchException; -import org.springframework.data.elasticsearch.annotations.Document; -import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; -import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl; -import org.springframework.data.elasticsearch.core.query.*; -import org.springframework.data.elasticsearch.entities.HetroEntity1; -import org.springframework.data.elasticsearch.entities.HetroEntity2; -import org.springframework.data.elasticsearch.entities.SampleEntity; -import org.springframework.data.elasticsearch.entities.SampleMappingEntity; -import org.springframework.data.elasticsearch.entities.UseServerConfigurationEntity; -import org.springframework.data.util.CloseableIterator; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import static org.apache.commons.lang.RandomStringUtils.*; -import static org.elasticsearch.index.query.QueryBuilders.*; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; -import static org.springframework.data.elasticsearch.utils.IndexBuilder.*; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Franck Marchand - * @author Abdul Mohammed - * @author Kevin Leturc - * @author Mason Chan - */ -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("classpath:elasticsearch-template-test.xml") -public class ElasticsearchTemplateTests { - - private static final String INDEX_NAME = "test-index-sample"; - private static final String INDEX_1_NAME = "test-index-1"; - private static final String INDEX_2_NAME = "test-index-2"; - private static final String TYPE_NAME = "test-type"; - - @Autowired - private ElasticsearchTemplate elasticsearchTemplate; - - @Before - public void before() { - elasticsearchTemplate.deleteIndex(SampleEntity.class); - elasticsearchTemplate.createIndex(SampleEntity.class); - elasticsearchTemplate.putMapping(SampleEntity.class); - elasticsearchTemplate.deleteIndex(INDEX_1_NAME); - elasticsearchTemplate.deleteIndex(INDEX_2_NAME); - elasticsearchTemplate.deleteIndex(UseServerConfigurationEntity.class); - elasticsearchTemplate.refresh(SampleEntity.class); - } - - /* - DATAES-106 - */ - @Test - public void shouldReturnCountForGivenCriteriaQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); - // when - long count = elasticsearchTemplate.count(criteriaQuery, SampleEntity.class); - // then - assertThat(count, is(equalTo(1L))); - } - - @Test - public void shouldReturnCountForGivenSearchQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - // when - long count = elasticsearchTemplate.count(searchQuery, SampleEntity.class); - // then - assertThat(count, is(equalTo(1L))); - } - - @Test - public void shouldReturnObjectForGivenId() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); - // when - GetQuery getQuery = new GetQuery(); - getQuery.setId(documentId); - SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); - // then - assertNotNull("entity can't be null....", sampleEntity1); - assertEquals(sampleEntity, sampleEntity1); - } - - @Test - public void shouldReturnObjectsForGivenIdsUsingMultiGet() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some message") - .version(System.currentTimeMillis()).build(); - - indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2)); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - - // when - SearchQuery query = new NativeSearchQueryBuilder().withIds(Arrays.asList(documentId, documentId2)).build(); - LinkedList sampleEntities = elasticsearchTemplate.multiGet(query, SampleEntity.class); - // then - assertThat(sampleEntities.size(), is(equalTo(2))); - assertEquals(sampleEntities.get(0), sampleEntity1); - assertEquals(sampleEntities.get(1), sampleEntity2); - } - - @Test - public void shouldReturnObjectsForGivenIdsUsingMultiGetWithFields() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) - .message("some message") - .type("type1") - .version(System.currentTimeMillis()).build(); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) - .message("some message") - .type("type2") - .version(System.currentTimeMillis()).build(); - - indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2)); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - - // when - SearchQuery query = new NativeSearchQueryBuilder() - .withIds(Arrays.asList(documentId, documentId2)) - .withFields("message", "type") - .build(); - LinkedList sampleEntities = elasticsearchTemplate.multiGet(query, SampleEntity.class, new MultiGetResultMapper() { - @Override - public LinkedList mapResults(MultiGetResponse responses, Class clazz) { - LinkedList list = new LinkedList<>(); - for (MultiGetItemResponse response : responses.getResponses()) { - SampleEntity entity = new SampleEntity(); - entity.setId(response.getResponse().getId()); - entity.setMessage((String) response.getResponse().getSource().get("message")); - entity.setType((String) response.getResponse().getSource().get("type")); - list.add((T) entity); - } - return list; - } - }); - // then - assertThat(sampleEntities.size(), is(equalTo(2))); - } - - @Test - public void shouldReturnPageForGivenSearchQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - // then - assertThat(sampleEntities, is(notNullValue())); - assertThat(sampleEntities.getTotalElements(), greaterThanOrEqualTo(1L)); - } - - @Test - public void shouldDoBulkIndex() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some message") - .version(System.currentTimeMillis()).build(); - - indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2)); - - // when - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - assertThat(sampleEntities.getTotalElements(), is(equalTo(2L))); - } - - - @Test - public void shouldDoBulkUpdate() { - //given - String documentId = randomNumeric(5); - String messageBeforeUpdate = "some test message"; - String messageAfterUpdate = "test message"; - - SampleEntity sampleEntity = SampleEntity.builder().id(documentId) - .message(messageBeforeUpdate) - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - - IndexRequest indexRequest = new IndexRequest(); - indexRequest.source("message", messageAfterUpdate); - UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId) - .withClass(SampleEntity.class).withIndexRequest(indexRequest).build(); - - List queries = new ArrayList<>(); - queries.add(updateQuery); - - // when - elasticsearchTemplate.bulkUpdate(queries); - //then - GetQuery getQuery = new GetQuery(); - getQuery.setId(documentId); - SampleEntity indexedEntity = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); - assertThat(indexedEntity.getMessage(), is(messageAfterUpdate)); - } - - @Test - public void shouldDeleteDocumentForGivenId() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - // when - elasticsearchTemplate.delete(INDEX_NAME, TYPE_NAME, documentId); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - assertThat(sampleEntities.getTotalElements(), equalTo(0L)); - } - - @Test - public void shouldDeleteEntityForGivenId() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - // when - elasticsearchTemplate.delete(SampleEntity.class, documentId); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - assertThat(sampleEntities.getTotalElements(), equalTo(0L)); - } - - @Test - public void shouldDeleteDocumentForGivenQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - - // when - DeleteQuery deleteQuery = new DeleteQuery(); - deleteQuery.setQuery(termQuery("id", documentId)); - elasticsearchTemplate.delete(deleteQuery, SampleEntity.class); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - assertThat(sampleEntities.getTotalElements(), equalTo(0L)); - } - - @Test - public void shouldFilterSearchResultsForGivenFilter() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFilter(boolQuery().filter(termQuery("id", documentId))).build(); - // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - // then - assertThat(sampleEntities.getTotalElements(), equalTo(1L)); - } - - @Test - public void shouldSortResultsGivenSortCriteria() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) - .message("abc") - .rate(10) - .version(System.currentTimeMillis()).build(); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) - .message("xyz") - .rate(5) - .version(System.currentTimeMillis()).build(); - - // third document - String documentId3 = randomNumeric(5); - SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3) - .message("xyz") - .rate(15) - .version(System.currentTimeMillis()).build(); - - indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withSort(new FieldSortBuilder("rate").order(SortOrder.ASC)).build(); - // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - // then - assertThat(sampleEntities.getTotalElements(), equalTo(3L)); - assertThat(sampleEntities.getContent().get(0).getRate(), is(sampleEntity2.getRate())); - } - - @Test - public void shouldSortResultsGivenMultipleSortCriteria() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) - .message("abc") - .rate(10) - .version(System.currentTimeMillis()).build(); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) - .message("xyz") - .rate(5) - .version(System.currentTimeMillis()).build(); - - // third document - String documentId3 = randomNumeric(5); - SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3) - .message("xyz") - .rate(15) - .version(System.currentTimeMillis()).build(); - - indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withSort(new FieldSortBuilder("rate").order(SortOrder.ASC)) - .withSort(new FieldSortBuilder("message").order(SortOrder.ASC)).build(); - // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - // then - assertThat(sampleEntities.getTotalElements(), equalTo(3L)); - assertThat(sampleEntities.getContent().get(0).getRate(), is(sampleEntity2.getRate())); - assertThat(sampleEntities.getContent().get(1).getMessage(), is(sampleEntity1.getMessage())); - } - - @Test - public void shouldExecuteStringQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - - StringQuery stringQuery = new StringQuery(matchAllQuery().toString()); - // when - Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); - // then - assertThat(sampleEntities.getTotalElements(), equalTo(1L)); - } - - @Test - public void shouldUseScriptedFields() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setRate(2); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - - Map params = new HashMap<>(); - params.put("factor", 2); - // when - SearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(matchAllQuery()) - .withScriptField(new ScriptField("scriptedRate", - new Script(ScriptType.INLINE, "expression", "doc['rate'] * factor", params))) - .build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - // then - assertThat(sampleEntities.getTotalElements(), equalTo(1L)); - assertThat(sampleEntities.getContent().get(0).getScriptedRate(), equalTo(4.0)); - } - - @Test - public void shouldReturnPageableResultsGivenStringQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - - StringQuery stringQuery = new StringQuery(matchAllQuery().toString(), new PageRequest(0, 10)); - // when - Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); - - // then - assertThat(sampleEntities.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Test - public void shouldReturnSortedPageableResultsGivenStringQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - - StringQuery stringQuery = new StringQuery(matchAllQuery().toString(), new PageRequest(0, 10), new Sort( - new Sort.Order(Sort.Direction.ASC, "message"))); - // when - Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); - // then - assertThat(sampleEntities.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Test - public void shouldReturnObjectMatchingGivenStringQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - - StringQuery stringQuery = new StringQuery(termQuery("id", documentId).toString()); - // when - SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(stringQuery, SampleEntity.class); - // then - assertThat(sampleEntity1, is(notNullValue())); - assertThat(sampleEntity1.getId(), is(equalTo(documentId))); - } - - @Test - public void shouldCreateIndexGivenEntityClass() { - // when - boolean created = elasticsearchTemplate.createIndex(SampleEntity.class); - elasticsearchTemplate.putMapping(SampleEntity.class); - final Map setting = elasticsearchTemplate.getSetting(SampleEntity.class); - // then - assertThat(created, is(true)); - assertThat(setting.get("index.number_of_shards"), Matchers.is("1")); - assertThat(setting.get("index.number_of_replicas"), Matchers.is("0")); - } - - @Test - public void shouldExecuteGivenCriteriaQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("test message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("test")); - - // when - SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); - // then - assertThat(sampleEntity1, is(notNullValue())); - } - - @Test - public void shouldDeleteGivenCriteriaQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("test message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("test")); - - // when - elasticsearchTemplate.delete(criteriaQuery, SampleEntity.class); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - StringQuery stringQuery = new StringQuery(matchAllQuery().toString()); - List sampleEntities = elasticsearchTemplate.queryForList(stringQuery, SampleEntity.class); - - assertThat(sampleEntities.size(), is(0)); - } - - @Test - public void shouldReturnSpecifiedFields() { - // given - String documentId = randomNumeric(5); - String message = "some test message"; - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message(message) - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices(INDEX_NAME) - .withTypes(TYPE_NAME).withFields("message").build(); - // when - Page page = elasticsearchTemplate.queryForPage(searchQuery, String.class, new SearchResultMapper() { - @Override - public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { - List values = new ArrayList<>(); - for (SearchHit searchHit : response.getHits()) { - values.add((String) searchHit.getSource().get("message")); - } - return new AggregatedPageImpl<>((List) values); - } - }); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - assertThat(page.getContent().get(0), is(message)); - } - - @Test - public void shouldReturnFieldsBasedOnSourceFilter() { - // given - String documentId = randomNumeric(5); - String message = "some test message"; - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message(message) - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - - FetchSourceFilterBuilder sourceFilter = new FetchSourceFilterBuilder(); - sourceFilter.withIncludes("message"); - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices(INDEX_NAME) - .withTypes(TYPE_NAME).withSourceFilter(sourceFilter.build()).build(); - // when - Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - assertThat(page.getContent().get(0).getMessage(), is(message)); - } - - - @Test - public void shouldReturnSimilarResultsGivenMoreLikeThisQuery() { - // given - String sampleMessage = "So we build a web site or an application and want to add search to it, " - + "and then it hits us: getting search working is hard. We want our search solution to be fast," - + " we want a painless setup and a completely free search schema, we want to be able to index data simply using JSON over HTTP, " - + "we want our search server to be always available, we want to be able to start with one machine and scale to hundreds, " - + "we want real-time search, we want simple multi-tenancy, and we want a solution that is built for the cloud."; - - String documentId1 = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId1).message(sampleMessage) - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - - String documentId2 = randomNumeric(5); - - elasticsearchTemplate.index(getIndexQuery(SampleEntity.builder().id(documentId2).message(sampleMessage) - .version(System.currentTimeMillis()).build())); - elasticsearchTemplate.refresh(SampleEntity.class); - - MoreLikeThisQuery moreLikeThisQuery = new MoreLikeThisQuery(); - moreLikeThisQuery.setId(documentId2); - moreLikeThisQuery.addFields("message"); - moreLikeThisQuery.setMinDocFreq(1); - // when - Page sampleEntities = elasticsearchTemplate.moreLikeThis(moreLikeThisQuery, SampleEntity.class); - - // then - assertThat(sampleEntities.getTotalElements(), is(equalTo(1L))); - assertThat(sampleEntities.getContent(), hasItem(sampleEntity)); - } - - /* - DATAES-167 - */ - @Test - public void shouldReturnResultsWithScanAndScrollForGivenCriteriaQuery() { - //given - List entities = createSampleEntitiesWithMessage("Test message", 30); - // when - elasticsearchTemplate.bulkIndex(entities); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); - criteriaQuery.addIndices(INDEX_NAME); - criteriaQuery.addTypes(TYPE_NAME); - criteriaQuery.setPageable(new PageRequest(0, 10)); - - ScrolledPage scroll = (ScrolledPage) elasticsearchTemplate.startScroll( 1000, criteriaQuery, SampleEntity.class); - List sampleEntities = new ArrayList<>(); - while (scroll.hasContent()) { - sampleEntities.addAll(scroll.getContent()); - scroll = (ScrolledPage) elasticsearchTemplate.continueScroll(scroll.getScrollId() , 1000, SampleEntity.class); - } - elasticsearchTemplate.clearScroll(scroll.getScrollId()); - assertThat(sampleEntities.size(), is(equalTo(30))); - } - - @Test - public void shouldReturnResultsWithScanAndScrollForGivenSearchQuery() { - //given - List entities = createSampleEntitiesWithMessage("Test message", 30); - // when - elasticsearchTemplate.bulkIndex(entities); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices(INDEX_NAME) - .withTypes(TYPE_NAME).withPageable(new PageRequest(0, 10)).build(); - - ScrolledPage scroll = (ScrolledPage) elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class); - List sampleEntities = new ArrayList<>(); - while (scroll.hasContent()) { - sampleEntities.addAll(scroll.getContent()); - scroll = (ScrolledPage) elasticsearchTemplate.continueScroll(scroll.getScrollId() , 1000, SampleEntity.class); - } - elasticsearchTemplate.clearScroll(scroll.getScrollId()); - assertThat(sampleEntities.size(), is(equalTo(30))); - } - - - final SearchResultMapper searchResultMapper = new SearchResultMapper() { - @Override - public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { - List result = new ArrayList(); - for (SearchHit searchHit : response.getHits()) { - if (response.getHits().getHits().length <= 0) { - return new AggregatedPageImpl(Collections.EMPTY_LIST, response.getScrollId()); - } - String message = (String) searchHit.getSource().get("message"); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(searchHit.getId()); - sampleEntity.setMessage(message); - result.add(sampleEntity); - } - - if (result.size() > 0) { - return new AggregatedPageImpl((List) result, response.getScrollId()); - } - return new AggregatedPageImpl(Collections.EMPTY_LIST, response.getScrollId()); - } - }; - - /* - DATAES-167 - */ - @Test - public void shouldReturnResultsWithScanAndScrollForSpecifiedFieldsForCriteriaQuery() { - //given - List entities = createSampleEntitiesWithMessage("Test message", 30); - // when - elasticsearchTemplate.bulkIndex(entities); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); - criteriaQuery.addIndices(INDEX_NAME); - criteriaQuery.addTypes(TYPE_NAME); - criteriaQuery.addFields("message"); - criteriaQuery.setPageable(new PageRequest(0, 10)); - - Page scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class, searchResultMapper); - String scrollId = ((ScrolledPage)scroll).getScrollId(); - List sampleEntities = new ArrayList<>(); - while (scroll.hasContent()) { - sampleEntities.addAll(scroll.getContent()); - scrollId = ((ScrolledPage)scroll).getScrollId(); - scroll = elasticsearchTemplate.continueScroll(scrollId , 1000, SampleEntity.class, searchResultMapper); - } - elasticsearchTemplate. clearScroll(scrollId); - assertThat(sampleEntities.size(), is(equalTo(30))); - } - - /* - DATAES-84 - */ - @Test - public void shouldReturnResultsWithScanAndScrollForSpecifiedFieldsForSearchCriteria() { - //given - List entities = createSampleEntitiesWithMessage("Test message", 30); - // when - elasticsearchTemplate.bulkIndex(entities); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withIndices(INDEX_NAME) - .withTypes(TYPE_NAME) - .withFields("message") - .withQuery(matchAllQuery()) - .withPageable(new PageRequest(0, 10)) - .build(); - - Page scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class, searchResultMapper); - String scrollId = ((ScrolledPage) scroll).getScrollId(); - List sampleEntities = new ArrayList<>(); - while (scroll.hasContent()) { - sampleEntities.addAll(scroll.getContent()); - scrollId = ((ScrolledPage) scroll).getScrollId(); - scroll = elasticsearchTemplate.continueScroll(scrollId, 1000, SampleEntity.class, searchResultMapper); - } - elasticsearchTemplate.clearScroll(scrollId); - assertThat(sampleEntities.size(), is(equalTo(30))); - } - - /* - DATAES-167 - */ - @Test - public void shouldReturnResultsForScanAndScrollWithCustomResultMapperForGivenCriteriaQuery() { - //given - List entities = createSampleEntitiesWithMessage("Test message", 30); - // when - elasticsearchTemplate.bulkIndex(entities); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); - criteriaQuery.addIndices(INDEX_NAME); - criteriaQuery.addTypes(TYPE_NAME); - criteriaQuery.setPageable(new PageRequest(0, 10)); - - Page scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class, searchResultMapper); - String scrollId = ((ScrolledPage) scroll).getScrollId(); - List sampleEntities = new ArrayList<>(); - while (scroll.hasContent()) { - sampleEntities.addAll(scroll.getContent()); - scrollId = ((ScrolledPage) scroll).getScrollId(); - scroll = elasticsearchTemplate.continueScroll(scrollId, 1000, SampleEntity.class, searchResultMapper); - } - elasticsearchTemplate.clearScroll(scrollId); - assertThat(sampleEntities.size(), is(equalTo(30))); - } - - @Test - public void shouldReturnResultsForScanAndScrollWithCustomResultMapperForGivenSearchQuery() { - //given - List entities = createSampleEntitiesWithMessage("Test message", 30); - // when - elasticsearchTemplate.bulkIndex(entities); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices(INDEX_NAME) - .withTypes(TYPE_NAME).withPageable(new PageRequest(0, 10)).build(); - - Page scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class,searchResultMapper); - String scrollId = ((ScrolledPage) scroll).getScrollId(); - List sampleEntities = new ArrayList<>(); - while (scroll.hasContent()) { - sampleEntities.addAll(scroll.getContent()); - scrollId = ((ScrolledPage) scroll).getScrollId(); - scroll = elasticsearchTemplate.continueScroll(scrollId, 1000, SampleEntity.class, searchResultMapper); - } - elasticsearchTemplate.clearScroll(scrollId); - assertThat(sampleEntities.size(), is(equalTo(30))); - } - - /* - DATAES-217 - */ - @Test - public void shouldReturnResultsWithScanAndScrollForGivenCriteriaQueryAndClass() { - //given - List entities = createSampleEntitiesWithMessage("Test message", 30); - // when - elasticsearchTemplate.bulkIndex(entities); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); - criteriaQuery.setPageable(new PageRequest(0, 10)); - - Page scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class); - String scrollId = ((ScrolledPage) scroll).getScrollId(); - List sampleEntities = new ArrayList<>(); - while (scroll.hasContent()) { - sampleEntities.addAll(scroll.getContent()); - scrollId = ((ScrolledPage) scroll).getScrollId(); - scroll = elasticsearchTemplate.continueScroll(scrollId, 1000, SampleEntity.class); - } - elasticsearchTemplate.clearScroll(scrollId); - assertThat(sampleEntities.size(), is(equalTo(30))); - } - - /* - DATAES-217 - */ - @Test - public void shouldReturnResultsWithScanAndScrollForGivenSearchQueryAndClass() { - //given - List entities = createSampleEntitiesWithMessage("Test message", 30); - // when - elasticsearchTemplate.bulkIndex(entities); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withPageable(new PageRequest(0, 10)).build(); - - Page scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class); - String scrollId = ((ScrolledPage) scroll).getScrollId(); - List sampleEntities = new ArrayList<>(); - while (scroll.hasContent()) { - sampleEntities.addAll(scroll.getContent()); - scrollId = ((ScrolledPage) scroll).getScrollId(); - scroll = elasticsearchTemplate.continueScroll(scrollId, 1000, SampleEntity.class); - } - elasticsearchTemplate.clearScroll(scrollId); - assertThat(sampleEntities.size(), is(equalTo(30))); - } - - /* - DATAES-167 - */ - @Test - public void shouldReturnResultsWithStreamForGivenCriteriaQuery() { - //given - List entities = createSampleEntitiesWithMessage("Test message", 30); - // when - elasticsearchTemplate.bulkIndex(entities); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); - criteriaQuery.addIndices(INDEX_NAME); - criteriaQuery.addTypes(TYPE_NAME); - criteriaQuery.setPageable(new PageRequest(0, 10)); - - CloseableIterator stream = elasticsearchTemplate.stream(criteriaQuery, SampleEntity.class); - List sampleEntities = new ArrayList<>(); - while (stream.hasNext()) { - sampleEntities.add(stream.next()); - } - assertThat(sampleEntities.size(), is(equalTo(30))); - } - - private static List createSampleEntitiesWithMessage(String message, int numberOfEntities) { - List indexQueries = new ArrayList<>(); - for (int i = 0; i < numberOfEntities; i++) { - String documentId = UUID.randomUUID().toString(); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage(message); - sampleEntity.setRate(2); - sampleEntity.setVersion(System.currentTimeMillis()); - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - indexQueries.add(indexQuery); - } - return indexQueries; - } - - @Test - public void shouldReturnListForGivenCriteria() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) - .message("test message") - .version(System.currentTimeMillis()).build(); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) - .message("test test") - .rate(5) - .version(System.currentTimeMillis()).build(); - - // third document - String documentId3 = randomNumeric(5); - SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3) - .message("some message") - .rate(15) - .version(System.currentTimeMillis()).build(); - - indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); - - // when - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - // when - CriteriaQuery singleCriteriaQuery = new CriteriaQuery(new Criteria("message").contains("test")); - CriteriaQuery multipleCriteriaQuery = new CriteriaQuery(new Criteria("message").contains("some").and("message") - .contains("message")); - List sampleEntitiesForSingleCriteria = elasticsearchTemplate.queryForList(singleCriteriaQuery, - SampleEntity.class); - List sampleEntitiesForAndCriteria = elasticsearchTemplate.queryForList(multipleCriteriaQuery, - SampleEntity.class); - // then - assertThat(sampleEntitiesForSingleCriteria.size(), is(2)); - assertThat(sampleEntitiesForAndCriteria.size(), is(1)); - } - - @Test - public void shouldReturnListForGivenStringQuery() { - // given - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) - .message("test message") - .version(System.currentTimeMillis()).build(); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) - .message("test test") - .rate(5) - .version(System.currentTimeMillis()).build(); - - // third document - String documentId3 = randomNumeric(5); - SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3) - .message("some message") - .rate(15) - .version(System.currentTimeMillis()).build(); - - List indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); - - // when - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - // when - StringQuery stringQuery = new StringQuery(matchAllQuery().toString()); - List sampleEntities = elasticsearchTemplate.queryForList(stringQuery, SampleEntity.class); - // then - assertThat(sampleEntities.size(), is(3)); - } - - @Test - public void shouldPutMappingForGivenEntity() throws Exception { - // given - Class entity = SampleMappingEntity.class; - elasticsearchTemplate.deleteIndex(entity); - elasticsearchTemplate.createIndex(entity); - // when - assertThat(elasticsearchTemplate.putMapping(entity), is(true)); - } - - @Test - public void shouldDeleteIndexForGivenEntity() { - // given - Class clazz = SampleEntity.class; - // when - elasticsearchTemplate.deleteIndex(clazz); - // then - assertThat(elasticsearchTemplate.indexExists(clazz), is(false)); - } - - @Test - public void shouldDoPartialUpdateForExistingDocument() { - //given - String documentId = randomNumeric(5); - String messageBeforeUpdate = "some test message"; - String messageAfterUpdate = "test message"; - - SampleEntity sampleEntity = SampleEntity.builder().id(documentId) - .message(messageBeforeUpdate) - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - - IndexRequest indexRequest = new IndexRequest(); - indexRequest.source("message", messageAfterUpdate); - UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId) - .withClass(SampleEntity.class).withIndexRequest(indexRequest).build(); - // when - elasticsearchTemplate.update(updateQuery); - //then - GetQuery getQuery = new GetQuery(); - getQuery.setId(documentId); - SampleEntity indexedEntity = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); - assertThat(indexedEntity.getMessage(), is(messageAfterUpdate)); - } - - @Test(expected = DocumentMissingException.class) - public void shouldThrowExceptionIfDocumentDoesNotExistWhileDoingPartialUpdate() { - // when - IndexRequest indexRequest = new IndexRequest(); - UpdateQuery updateQuery = new UpdateQueryBuilder().withId(randomNumeric(5)) - .withClass(SampleEntity.class).withIndexRequest(indexRequest).build(); - elasticsearchTemplate.update(updateQuery); - } - - @Test - public void shouldDoUpsertIfDocumentDoesNotExist() { - //given - String documentId = randomNumeric(5); - String message = "test message"; - IndexRequest indexRequest = new IndexRequest(); - indexRequest.source("message", message); - UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId) - .withDoUpsert(true).withClass(SampleEntity.class) - .withIndexRequest(indexRequest).build(); - //when - elasticsearchTemplate.update(updateQuery); - //then - GetQuery getQuery = new GetQuery(); - getQuery.setId(documentId); - SampleEntity indexedEntity = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); - assertThat(indexedEntity.getMessage(), is(message)); - } - - @Test - public void shouldReturnHighlightedFieldsForGivenQueryAndFields() { - - //given - String documentId = randomNumeric(5); - String actualMessage = "some test message"; - String highlightedMessage = "some test message"; - - SampleEntity sampleEntity = SampleEntity.builder().id(documentId) - .message(actualMessage) - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - - final List message = new HighlightBuilder().field("message").fields(); - SearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(termQuery("message", "test")) - .withHighlightFields(message.toArray(new HighlightBuilder.Field[message.size()])) - .build(); - - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, new SearchResultMapper() { - @Override - public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { - List chunk = new ArrayList<>(); - for (SearchHit searchHit : response.getHits()) { - if (response.getHits().getHits().length <= 0) { - return null; - } - SampleEntity user = new SampleEntity(); - user.setId(searchHit.getId()); - user.setMessage((String) searchHit.getSource().get("message")); - user.setHighlightedMessage(searchHit.getHighlightFields().get("message").fragments()[0].toString()); - chunk.add(user); - } - if (chunk.size() > 0) { - return new AggregatedPageImpl<>((List) chunk); - } - return null; - } - }); - - assertThat(sampleEntities.getContent().get(0).getHighlightedMessage(), is(highlightedMessage)); - } - - @Test - public void shouldDeleteDocumentBySpecifiedTypeUsingDeleteQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId) - .message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - // when - DeleteQuery deleteQuery = new DeleteQuery(); - deleteQuery.setQuery(termQuery("id", documentId)); - deleteQuery.setIndex(INDEX_NAME); - deleteQuery.setType(TYPE_NAME); - elasticsearchTemplate.delete(deleteQuery); - elasticsearchTemplate.refresh(INDEX_NAME); - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - assertThat(sampleEntities.getTotalElements(), equalTo(0L)); - } - - @Test - public void shouldIndexDocumentForSpecifiedSource() { - - // given - String documentSource = "{\"id\":\"2333343434\",\"type\":null,\"message\":\"some message\",\"rate\":0,\"available\":false,\"highlightedMessage\":null,\"version\":1385208779482}"; - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId("2333343434"); - indexQuery.setSource(documentSource); - indexQuery.setIndexName(INDEX_NAME); - indexQuery.setType(TYPE_NAME); - // when - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", indexQuery.getId())) - .withIndices(INDEX_NAME) - .withTypes(TYPE_NAME) - .build(); - // then - Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, new SearchResultMapper() { - @Override - public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { - List values = new ArrayList<>(); - for (SearchHit searchHit : response.getHits()) { - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(searchHit.getId()); - sampleEntity.setMessage((String) searchHit.getSource().get("message")); - values.add(sampleEntity); - } - return new AggregatedPageImpl<>((List) values); - } - }); - assertThat(page, is(notNullValue())); - assertThat(page.getContent().size(), is(1)); - assertThat(page.getContent().get(0).getId(), is(indexQuery.getId())); - } - - @Test(expected = ElasticsearchException.class) - public void shouldThrowElasticsearchExceptionWhenNoDocumentSpecified() { - // given - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId("2333343434"); - indexQuery.setIndexName(INDEX_NAME); - indexQuery.setType(TYPE_NAME); - - //when - elasticsearchTemplate.index(indexQuery); - } - - @Test - public void shouldReturnIds() { - //given - List entities = createSampleEntitiesWithMessage("Test message", 30); - // when - elasticsearchTemplate.bulkIndex(entities); - elasticsearchTemplate.refresh(SampleEntity.class); - SearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(termQuery("message", "message")) - .withIndices(INDEX_NAME) - .withTypes(TYPE_NAME) - .withPageable(new PageRequest(0, 100)) - .build(); - // then - List ids = elasticsearchTemplate.queryForIds(searchQuery); - assertThat(ids, is(notNullValue())); - assertThat(ids.size(), is(30)); - } - - @Test - public void shouldReturnDocumentAboveMinimalScoreGivenQuery() { - // given - List indexQueries = new ArrayList<>(); - - indexQueries.add(buildIndex(SampleEntity.builder().id("1").message("ab").build())); - indexQueries.add(buildIndex(SampleEntity.builder().id("2").message("bc").build())); - indexQueries.add(buildIndex(SampleEntity.builder().id("3").message("ac").build())); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - - // when - SearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(boolQuery() - .must(wildcardQuery("message", "*a*")) - .should(wildcardQuery("message", "*b*")) - ) - .withIndices(INDEX_NAME) - .withTypes(TYPE_NAME) - .withMinScore(2.0F) - .build(); - - Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - // then - assertThat(page.getTotalElements(), is(1L)); - assertThat(page.getContent().get(0).getMessage(), is("ab")); - } - - - @Test - public void shouldDoIndexWithoutId() { - // given - // document - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setObject(sampleEntity); - // when - String documentId = elasticsearchTemplate.index(indexQuery); - // then - assertThat(sampleEntity.getId(), is(equalTo(documentId))); - - GetQuery getQuery = new GetQuery(); - getQuery.setId(documentId); - SampleEntity result = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); - assertThat(result.getId(), is(equalTo(documentId))); - } - - @Test - public void shouldDoBulkIndexWithoutId() { - // given - List indexQueries = new ArrayList<>(); - // first document - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setMessage("some message"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setMessage("some message"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); - // when - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - assertThat(sampleEntities.getTotalElements(), is(equalTo(2L))); - - assertThat(sampleEntities.getContent().get(0).getId(), is(notNullValue())); - assertThat(sampleEntities.getContent().get(1).getId(), is(notNullValue())); - } - - @Test - public void shouldIndexMapWithIndexNameAndTypeAtRuntime() { - //given - Map person1 = new HashMap<>(); - person1.put("userId", "1"); - person1.put("email", "smhdiu@gmail.com"); - person1.put("title", "Mr"); - person1.put("firstName", "Mohsin"); - person1.put("lastName", "Husen"); - - Map person2 = new HashMap<>(); - person2.put("userId", "2"); - person2.put("email", "akonczak@gmail.com"); - person2.put("title", "Mr"); - person2.put("firstName", "Artur"); - person2.put("lastName", "Konczak"); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId("1"); - indexQuery1.setObject(person1); - indexQuery1.setIndexName(INDEX_NAME); - indexQuery1.setType(TYPE_NAME); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId("2"); - indexQuery2.setObject(person2); - indexQuery2.setIndexName(INDEX_NAME); - indexQuery2.setType(TYPE_NAME); - - List indexQueries = new ArrayList<>(); - indexQueries.add(indexQuery1); - indexQueries.add(indexQuery2); - - //when - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(INDEX_NAME); - - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices(INDEX_NAME) - .withTypes(TYPE_NAME).withQuery(matchAllQuery()).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, Map.class, new SearchResultMapper() { - @Override - public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { - List chunk = new ArrayList<>(); - for (SearchHit searchHit : response.getHits()) { - if (response.getHits().getHits().length <= 0) { - return null; - } - Map person = new HashMap<>(); - person.put("userId", searchHit.getSource().get("userId")); - person.put("email", searchHit.getSource().get("email")); - person.put("title", searchHit.getSource().get("title")); - person.put("firstName", searchHit.getSource().get("firstName")); - person.put("lastName", searchHit.getSource().get("lastName")); - chunk.add(person); - } - if (chunk.size() > 0) { - return new AggregatedPageImpl<>((List) chunk); - } - return null; - } - }); - assertThat(sampleEntities.getTotalElements(), is(equalTo(2L))); - assertThat(sampleEntities.getContent().get(0).get("userId"), is(person1.get("userId"))); - assertThat(sampleEntities.getContent().get(1).get("userId"), is(person2.get("userId"))); - } - - @Test - public void shouldIndexSampleEntityWithIndexAndTypeAtRuntime() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId) - .message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = new IndexQueryBuilder().withId(documentId) - .withIndexName(INDEX_NAME).withType(TYPE_NAME) - .withObject(sampleEntity).build(); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(INDEX_NAME); - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices(INDEX_NAME) - .withTypes(TYPE_NAME).withQuery(matchAllQuery()).build(); - // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - // then - assertThat(sampleEntities, is(notNullValue())); - assertThat(sampleEntities.getTotalElements(), greaterThanOrEqualTo(1L)); - } - - /* - DATAES-106 - */ - @Test - public void shouldReturnCountForGivenCriteriaQueryWithGivenIndexUsingCriteriaQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); - criteriaQuery.addIndices(INDEX_NAME); - // when - long count = elasticsearchTemplate.count(criteriaQuery); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-67 - */ - @Test - public void shouldReturnCountForGivenSearchQueryWithGivenIndexUsingSearchQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - SearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(matchAllQuery()) - .withIndices(INDEX_NAME) - .build(); - // when - long count = elasticsearchTemplate.count(searchQuery); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldReturnCountForGivenCriteriaQueryWithGivenIndexAndTypeUsingCriteriaQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); - criteriaQuery.addIndices(INDEX_NAME); - criteriaQuery.addTypes("test-type"); - // when - long count = elasticsearchTemplate.count(criteriaQuery); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-67 - */ - @Test - public void shouldReturnCountForGivenSearchQueryWithGivenIndexAndTypeUsingSearchQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - SearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(matchAllQuery()) - .withIndices(INDEX_NAME) - .withTypes("test-type") - .build(); - // when - long count = elasticsearchTemplate.count(searchQuery); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldReturnCountForGivenCriteriaQueryWithGivenMultiIndices() { - // given - cleanUpIndices(); - String documentId1 = randomNumeric(5); - SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) - .withIndexName("test-index-1") - .withObject(sampleEntity1) - .build(); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) - .withIndexName("test-index-2") - .withObject(sampleEntity2) - .build(); - - elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); - elasticsearchTemplate.refresh("test-index-1"); - elasticsearchTemplate.refresh("test-index-2"); - - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); - criteriaQuery.addIndices("test-index-1", "test-index-2"); - // when - long count = elasticsearchTemplate.count(criteriaQuery); - // then - assertThat(count, is(equalTo(2L))); - } - - /* - DATAES-67 - */ - @Test - public void shouldReturnCountForGivenSearchQueryWithGivenMultiIndices() { - // given - cleanUpIndices(); - String documentId1 = randomNumeric(5); - SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) - .withIndexName("test-index-1") - .withObject(sampleEntity1) - .build(); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) - .withIndexName("test-index-2") - .withObject(sampleEntity2) - .build(); - - elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); - elasticsearchTemplate.refresh("test-index-1"); - elasticsearchTemplate.refresh("test-index-2"); - - SearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(matchAllQuery()) - .withIndices("test-index-1", "test-index-2") - .build(); - // when - long count = elasticsearchTemplate.count(searchQuery); - // then - assertThat(count, is(equalTo(2L))); - } - - private void cleanUpIndices() { - elasticsearchTemplate.deleteIndex("test-index-1"); - elasticsearchTemplate.deleteIndex("test-index-2"); - elasticsearchTemplate.createIndex("test-index-1"); - elasticsearchTemplate.createIndex("test-index-2"); - elasticsearchTemplate.refresh("test-index-1"); - elasticsearchTemplate.refresh("test-index-2"); - } - - /* - DATAES-71 - */ - @Test - public void shouldCreatedIndexWithSpecifiedIndexName() { - // given - elasticsearchTemplate.deleteIndex("test-index"); - // when - elasticsearchTemplate.createIndex("test-index"); - // then - assertThat(elasticsearchTemplate.indexExists("test-index"), is(true)); - } - - /* - DATAES-72 - */ - @Test - public void shouldDeleteIndexForSpecifiedIndexName() { - // given - elasticsearchTemplate.createIndex(SampleEntity.class); - elasticsearchTemplate.refresh(SampleEntity.class); - - // when - elasticsearchTemplate.deleteIndex("test-index"); - // then - assertThat(elasticsearchTemplate.indexExists("test-index"), is(false)); - } - - /* - DATAES-106 - */ - @Test - public void shouldReturnCountForGivenCriteriaQueryWithGivenIndexNameForSpecificIndex() { - // given - cleanUpIndices(); - String documentId1 = randomNumeric(5); - SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) - .withIndexName("test-index-1") - .withObject(sampleEntity1) - .build(); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) - .withIndexName("test-index-2") - .withObject(sampleEntity2) - .build(); - - elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); - elasticsearchTemplate.refresh("test-index-1"); - elasticsearchTemplate.refresh("test-index-2"); - - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); - criteriaQuery.addIndices("test-index-1"); - // when - long count = elasticsearchTemplate.count(criteriaQuery); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-67 - */ - @Test - public void shouldReturnCountForGivenSearchQueryWithGivenIndexNameForSpecificIndex() { - // given - cleanUpIndices(); - String documentId1 = randomNumeric(5); - SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) - .withIndexName("test-index-1") - .withObject(sampleEntity1) - .build(); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) - .withIndexName("test-index-2") - .withObject(sampleEntity2) - .build(); - - elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); - elasticsearchTemplate.refresh("test-index-1"); - elasticsearchTemplate.refresh("test-index-2"); - - SearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(matchAllQuery()) - .withIndices("test-index-1") - .build(); - // when - long count = elasticsearchTemplate.count(searchQuery); - // then - assertThat(count, is(equalTo(1L))); - } - - @Test(expected = IllegalArgumentException.class) - public void shouldThrowAnExceptionForGivenCriteriaQueryWhenNoIndexSpecifiedForCountQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); - // when - long count = elasticsearchTemplate.count(criteriaQuery); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-67 - */ - @Test(expected = IllegalArgumentException.class) - public void shouldThrowAnExceptionForGivenSearchQueryWhenNoIndexSpecifiedForCountQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - SearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(matchAllQuery()) - .build(); - // when - long count = elasticsearchTemplate.count(searchQuery); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-71 - */ - @Test - public void shouldCreateIndexWithGivenSettings() { - // given - String settings = "{\n" + - " \"index\": {\n" + - " \"number_of_shards\": \"1\",\n" + - " \"number_of_replicas\": \"0\",\n" + - " \"analysis\": {\n" + - " \"analyzer\": {\n" + - " \"emailAnalyzer\": {\n" + - " \"type\": \"custom\",\n" + - " \"tokenizer\": \"uax_url_email\"\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - "}"; - - elasticsearchTemplate.deleteIndex("test-index"); - // when - elasticsearchTemplate.createIndex("test-index", settings); - // then - Map map = elasticsearchTemplate.getSetting("test-index"); - boolean hasAnalyzer = map.containsKey("index.analysis.analyzer.emailAnalyzer.tokenizer"); - String emailAnalyzer = (String) map.get("index.analysis.analyzer.emailAnalyzer.tokenizer"); - assertThat(elasticsearchTemplate.indexExists("test-index"), is(true)); - assertThat(hasAnalyzer, is(true)); - assertThat(emailAnalyzer, is("uax_url_email")); - } - - /* - DATAES-71 - */ - @Test - public void shouldCreateGivenSettingsForGivenIndex() { - //given - //delete , create and apply mapping in before method - - // then - Map map = elasticsearchTemplate.getSetting(SampleEntity.class); - assertThat(elasticsearchTemplate.indexExists("test-index"), is(true)); - assertThat(map.containsKey("index.refresh_interval"), is(true)); - assertThat(map.containsKey("index.number_of_replicas"), is(true)); - assertThat(map.containsKey("index.number_of_shards"), is(true)); - assertThat(map.containsKey("index.store.type"), is(true)); - assertThat((String) map.get("index.refresh_interval"), is("-1")); - assertThat((String) map.get("index.number_of_replicas"), is("0")); - assertThat((String) map.get("index.number_of_shards"), is("1")); - assertThat((String) map.get("index.store.type"), is("fs")); - } - - /* - DATAES-88 - */ - @Test - public void shouldCreateIndexWithGivenClassAndSettings() { - //given - String settings = "{\n" + - " \"index\": {\n" + - " \"number_of_shards\": \"1\",\n" + - " \"number_of_replicas\": \"0\",\n" + - " \"analysis\": {\n" + - " \"analyzer\": {\n" + - " \"emailAnalyzer\": {\n" + - " \"type\": \"custom\",\n" + - " \"tokenizer\": \"uax_url_email\"\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - "}"; - - elasticsearchTemplate.deleteIndex(SampleEntity.class); - elasticsearchTemplate.createIndex(SampleEntity.class, settings); - elasticsearchTemplate.putMapping(SampleEntity.class); - elasticsearchTemplate.refresh(SampleEntity.class); - - // then - Map map = elasticsearchTemplate.getSetting(SampleEntity.class); - assertThat(elasticsearchTemplate.indexExists(INDEX_NAME), is(true)); - assertThat(map.containsKey("index.number_of_replicas"), is(true)); - assertThat(map.containsKey("index.number_of_shards"), is(true)); - assertThat((String) map.get("index.number_of_replicas"), is("0")); - assertThat((String) map.get("index.number_of_shards"), is("1")); - } - - @Test - public void shouldTestResultsAcrossMultipleIndices() { - // given - String documentId1 = randomNumeric(5); - SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) - .withIndexName("test-index-1") - .withObject(sampleEntity1) - .build(); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") - .version(System.currentTimeMillis()).build(); - - IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) - .withIndexName("test-index-2") - .withObject(sampleEntity2) - .build(); - - elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); - elasticsearchTemplate.refresh("test-index-1"); - elasticsearchTemplate.refresh("test-index-2"); - - SearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(matchAllQuery()) - .withIndices("test-index-1", "test-index-2") - .build(); - // when - List sampleEntities = elasticsearchTemplate.queryForList(searchQuery, SampleEntity.class); - - // then - assertThat(sampleEntities.size(), is(equalTo(2))); - } - - @Test - /** - * This is basically a demonstration to show composing entities out of heterogeneous indexes. - */ - public void shouldComposeObjectsReturnedFromHeterogeneousIndexes() { - - // Given - - HetroEntity1 entity1 = new HetroEntity1(randomNumeric(3), "aFirstName"); - HetroEntity2 entity2 = new HetroEntity2(randomNumeric(4), "aLastName"); - - IndexQuery idxQuery1 = new IndexQueryBuilder().withIndexName(INDEX_1_NAME).withId(entity1.getId()).withObject(entity1).build(); - IndexQuery idxQuery2 = new IndexQueryBuilder().withIndexName(INDEX_2_NAME).withId(entity2.getId()).withObject(entity2).build(); - - elasticsearchTemplate.bulkIndex(Arrays.asList(idxQuery1, idxQuery2)); - elasticsearchTemplate.refresh(INDEX_1_NAME); - elasticsearchTemplate.refresh(INDEX_2_NAME); - - // When - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withTypes("hetro").withIndices(INDEX_1_NAME, INDEX_2_NAME).build(); - Page page = elasticsearchTemplate.queryForPage(searchQuery, ResultAggregator.class, new SearchResultMapper() { - @Override - public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { - List values = new ArrayList<>(); - for (SearchHit searchHit : response.getHits()) { - String id = String.valueOf(searchHit.getSource().get("id")); - String firstName = StringUtils.isNotEmpty((String) searchHit.getSource().get("firstName")) ? (String) searchHit.getSource().get("firstName") : ""; - String lastName = StringUtils.isNotEmpty((String) searchHit.getSource().get("lastName")) ? (String) searchHit.getSource().get("lastName") : ""; - values.add(new ResultAggregator(id, firstName, lastName)); - } - return new AggregatedPageImpl<>((List) values); - } - }); - - assertThat(page.getTotalElements(), is(2l)); - } - - @Test - public void shouldCreateIndexUsingServerDefaultConfiguration() { - //given - - //when - boolean created = elasticsearchTemplate.createIndex(UseServerConfigurationEntity.class); - //then - assertThat(created, is(true)); - final Map setting = elasticsearchTemplate.getSetting(UseServerConfigurationEntity.class); - assertThat(setting.get("index.number_of_shards"), Matchers.is("5")); - assertThat(setting.get("index.number_of_replicas"), Matchers.is("1")); - } - - @Test - public void shouldReadFileFromClasspathRetainingNewlines() { - // given - String settingsFile = "/settings/test-settings.yml"; - - // when - String content = ElasticsearchTemplate.readFileFromClasspath(settingsFile); - - // then - assertThat(content, is("index:\n" + - " number_of_shards: 1\n" + - " number_of_replicas: 0\n" + - " analysis:\n" + - " analyzer:\n" + - " emailAnalyzer:\n" + - " type: custom\n" + - " tokenizer: uax_url_email\n")); - } - - private IndexQuery getIndexQuery(SampleEntity sampleEntity) { - return new IndexQueryBuilder().withId(sampleEntity.getId()).withObject(sampleEntity).build(); - } - - private List getIndexQueries(List sampleEntities) { - List indexQueries = new ArrayList<>(); - for (SampleEntity sampleEntity : sampleEntities) { - indexQueries.add(new IndexQueryBuilder().withId(sampleEntity.getId()).withObject(sampleEntity).build()); - } - return indexQueries; - } - - @Document(indexName = INDEX_2_NAME, replicas = 0, shards = 1) - class ResultAggregator { - - private String id; - private String firstName; - private String lastName; - - ResultAggregator(String id, String firstName, String lastName) { - this.id = id; - this.firstName = firstName; - this.lastName = lastName; - } - } -} +/* + * Copyright 2014-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import org.apache.commons.lang.StringUtils; +import org.elasticsearch.action.get.MultiGetItemResponse; +import org.elasticsearch.action.get.MultiGetResponse; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.index.engine.DocumentMissingException; +import org.elasticsearch.script.Script; +import org.elasticsearch.script.ScriptType; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.hamcrest.Matchers; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.elasticsearch.ElasticsearchException; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; +import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl; +import org.springframework.data.elasticsearch.core.query.*; +import org.springframework.data.elasticsearch.entities.HetroEntity1; +import org.springframework.data.elasticsearch.entities.HetroEntity2; +import org.springframework.data.elasticsearch.entities.SampleEntity; +import org.springframework.data.elasticsearch.entities.SampleMappingEntity; +import org.springframework.data.elasticsearch.entities.UseServerConfigurationEntity; +import org.springframework.data.util.CloseableIterator; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import static org.apache.commons.lang.RandomStringUtils.*; +import static org.elasticsearch.index.query.QueryBuilders.*; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; +import static org.springframework.data.elasticsearch.utils.IndexBuilder.*; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Franck Marchand + * @author Abdul Mohammed + * @author Kevin Leturc + * @author Mason Chan + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:elasticsearch-template-test.xml") +public class ElasticsearchTemplateTests { + + private static final String INDEX_NAME = "test-index-sample"; + private static final String INDEX_1_NAME = "test-index-1"; + private static final String INDEX_2_NAME = "test-index-2"; + private static final String TYPE_NAME = "test-type"; + + @Autowired + private ElasticsearchTemplate elasticsearchTemplate; + + @Before + public void before() { + elasticsearchTemplate.deleteIndex(SampleEntity.class); + elasticsearchTemplate.createIndex(SampleEntity.class); + elasticsearchTemplate.putMapping(SampleEntity.class); + elasticsearchTemplate.deleteIndex(INDEX_1_NAME); + elasticsearchTemplate.deleteIndex(INDEX_2_NAME); + elasticsearchTemplate.deleteIndex(UseServerConfigurationEntity.class); + elasticsearchTemplate.refresh(SampleEntity.class); + } + + /* + DATAES-106 + */ + @Test + public void shouldReturnCountForGivenCriteriaQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); + // when + long count = elasticsearchTemplate.count(criteriaQuery, SampleEntity.class); + // then + assertThat(count, is(equalTo(1L))); + } + + @Test + public void shouldReturnCountForGivenSearchQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); + // when + long count = elasticsearchTemplate.count(searchQuery, SampleEntity.class); + // then + assertThat(count, is(equalTo(1L))); + } + + @Test + public void shouldReturnObjectForGivenId() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + IndexQuery indexQuery = getIndexQuery(sampleEntity); + elasticsearchTemplate.index(indexQuery); + // when + GetQuery getQuery = new GetQuery(); + getQuery.setId(documentId); + SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); + // then + assertNotNull("entity can't be null....", sampleEntity1); + assertEquals(sampleEntity, sampleEntity1); + } + + @Test + public void shouldReturnObjectsForGivenIdsUsingMultiGet() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some message") + .version(System.currentTimeMillis()).build(); + + indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2)); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + + // when + SearchQuery query = new NativeSearchQueryBuilder().withIds(Arrays.asList(documentId, documentId2)).build(); + LinkedList sampleEntities = elasticsearchTemplate.multiGet(query, SampleEntity.class); + // then + assertThat(sampleEntities.size(), is(equalTo(2))); + assertEquals(sampleEntities.get(0), sampleEntity1); + assertEquals(sampleEntities.get(1), sampleEntity2); + } + + @Test + public void shouldReturnObjectsForGivenIdsUsingMultiGetWithFields() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) + .message("some message") + .type("type1") + .version(System.currentTimeMillis()).build(); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) + .message("some message") + .type("type2") + .version(System.currentTimeMillis()).build(); + + indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2)); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + + // when + SearchQuery query = new NativeSearchQueryBuilder() + .withIds(Arrays.asList(documentId, documentId2)) + .withFields("message", "type") + .build(); + LinkedList sampleEntities = elasticsearchTemplate.multiGet(query, SampleEntity.class, new MultiGetResultMapper() { + @Override + public LinkedList mapResults(MultiGetResponse responses, Class clazz) { + LinkedList list = new LinkedList<>(); + for (MultiGetItemResponse response : responses.getResponses()) { + SampleEntity entity = new SampleEntity(); + entity.setId(response.getResponse().getId()); + entity.setMessage((String) response.getResponse().getSource().get("message")); + entity.setType((String) response.getResponse().getSource().get("type")); + list.add((T) entity); + } + return list; + } + }); + // then + assertThat(sampleEntities.size(), is(equalTo(2))); + } + + @Test + public void shouldReturnPageForGivenSearchQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); + // when + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + // then + assertThat(sampleEntities, is(notNullValue())); + assertThat(sampleEntities.getTotalElements(), greaterThanOrEqualTo(1L)); + } + + @Test + public void shouldDoBulkIndex() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some message") + .version(System.currentTimeMillis()).build(); + + indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2)); + + // when + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + assertThat(sampleEntities.getTotalElements(), is(equalTo(2L))); + } + + + @Test + public void shouldDoBulkUpdate() { + //given + String documentId = randomNumeric(5); + String messageBeforeUpdate = "some test message"; + String messageAfterUpdate = "test message"; + + SampleEntity sampleEntity = SampleEntity.builder().id(documentId) + .message(messageBeforeUpdate) + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + + IndexRequest indexRequest = new IndexRequest(); + indexRequest.source("message", messageAfterUpdate); + UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId) + .withClass(SampleEntity.class).withIndexRequest(indexRequest).build(); + + List queries = new ArrayList<>(); + queries.add(updateQuery); + + // when + elasticsearchTemplate.bulkUpdate(queries); + //then + GetQuery getQuery = new GetQuery(); + getQuery.setId(documentId); + SampleEntity indexedEntity = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); + assertThat(indexedEntity.getMessage(), is(messageAfterUpdate)); + } + + @Test + public void shouldDeleteDocumentForGivenId() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + // when + elasticsearchTemplate.delete(INDEX_NAME, TYPE_NAME, documentId); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + assertThat(sampleEntities.getTotalElements(), equalTo(0L)); + } + + @Test + public void shouldDeleteEntityForGivenId() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + // when + elasticsearchTemplate.delete(SampleEntity.class, documentId); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + assertThat(sampleEntities.getTotalElements(), equalTo(0L)); + } + + @Test + public void shouldDeleteDocumentForGivenQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + + // when + DeleteQuery deleteQuery = new DeleteQuery(); + deleteQuery.setQuery(termQuery("id", documentId)); + elasticsearchTemplate.delete(deleteQuery, SampleEntity.class); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + assertThat(sampleEntities.getTotalElements(), equalTo(0L)); + } + + @Test + public void shouldFilterSearchResultsForGivenFilter() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) + .withFilter(boolQuery().filter(termQuery("id", documentId))).build(); + // when + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + // then + assertThat(sampleEntities.getTotalElements(), equalTo(1L)); + } + + @Test + public void shouldSortResultsGivenSortCriteria() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) + .message("abc") + .rate(10) + .version(System.currentTimeMillis()).build(); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) + .message("xyz") + .rate(5) + .version(System.currentTimeMillis()).build(); + + // third document + String documentId3 = randomNumeric(5); + SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3) + .message("xyz") + .rate(15) + .version(System.currentTimeMillis()).build(); + + indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) + .withSort(new FieldSortBuilder("rate").order(SortOrder.ASC)).build(); + // when + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + // then + assertThat(sampleEntities.getTotalElements(), equalTo(3L)); + assertThat(sampleEntities.getContent().get(0).getRate(), is(sampleEntity2.getRate())); + } + + @Test + public void shouldSortResultsGivenMultipleSortCriteria() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) + .message("abc") + .rate(10) + .version(System.currentTimeMillis()).build(); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) + .message("xyz") + .rate(5) + .version(System.currentTimeMillis()).build(); + + // third document + String documentId3 = randomNumeric(5); + SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3) + .message("xyz") + .rate(15) + .version(System.currentTimeMillis()).build(); + + indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) + .withSort(new FieldSortBuilder("rate").order(SortOrder.ASC)) + .withSort(new FieldSortBuilder("message").order(SortOrder.ASC)).build(); + // when + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + // then + assertThat(sampleEntities.getTotalElements(), equalTo(3L)); + assertThat(sampleEntities.getContent().get(0).getRate(), is(sampleEntity2.getRate())); + assertThat(sampleEntities.getContent().get(1).getMessage(), is(sampleEntity1.getMessage())); + } + + @Test + public void shouldExecuteStringQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + + StringQuery stringQuery = new StringQuery(matchAllQuery().toString()); + // when + Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); + // then + assertThat(sampleEntities.getTotalElements(), equalTo(1L)); + } + + @Test + public void shouldUseScriptedFields() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setRate(2); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + + Map params = new HashMap<>(); + params.put("factor", 2); + // when + SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchAllQuery()) + .withScriptField(new ScriptField("scriptedRate", + new Script(ScriptType.INLINE, "expression", "doc['rate'] * factor", params))) + .build(); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + // then + assertThat(sampleEntities.getTotalElements(), equalTo(1L)); + assertThat(sampleEntities.getContent().get(0).getScriptedRate(), equalTo(4.0)); + } + + @Test + public void shouldReturnPageableResultsGivenStringQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + + StringQuery stringQuery = new StringQuery(matchAllQuery().toString(), new PageRequest(0, 10)); + // when + Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); + + // then + assertThat(sampleEntities.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Test + public void shouldReturnSortedPageableResultsGivenStringQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + + StringQuery stringQuery = new StringQuery(matchAllQuery().toString(), new PageRequest(0, 10), new Sort( + new Sort.Order(Sort.Direction.ASC, "message"))); + // when + Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); + // then + assertThat(sampleEntities.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Test + public void shouldReturnObjectMatchingGivenStringQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + + StringQuery stringQuery = new StringQuery(termQuery("id", documentId).toString()); + // when + SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(stringQuery, SampleEntity.class); + // then + assertThat(sampleEntity1, is(notNullValue())); + assertThat(sampleEntity1.getId(), is(equalTo(documentId))); + } + + @Test + public void shouldCreateIndexGivenEntityClass() { + // when + boolean created = elasticsearchTemplate.createIndex(SampleEntity.class); + elasticsearchTemplate.putMapping(SampleEntity.class); + final Map setting = elasticsearchTemplate.getSetting(SampleEntity.class); + // then + assertThat(created, is(true)); + assertThat(setting.get("index.number_of_shards"), Matchers.is("1")); + assertThat(setting.get("index.number_of_replicas"), Matchers.is("0")); + } + + @Test + public void shouldExecuteGivenCriteriaQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("test message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("test")); + + // when + SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + // then + assertThat(sampleEntity1, is(notNullValue())); + } + + @Test + public void shouldDeleteGivenCriteriaQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("test message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("test")); + + // when + elasticsearchTemplate.delete(criteriaQuery, SampleEntity.class); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + StringQuery stringQuery = new StringQuery(matchAllQuery().toString()); + List sampleEntities = elasticsearchTemplate.queryForList(stringQuery, SampleEntity.class); + + assertThat(sampleEntities.size(), is(0)); + } + + @Test + public void shouldReturnSpecifiedFields() { + // given + String documentId = randomNumeric(5); + String message = "some test message"; + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message(message) + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices(INDEX_NAME) + .withTypes(TYPE_NAME).withFields("message").build(); + // when + Page page = elasticsearchTemplate.queryForPage(searchQuery, String.class, new SearchResultMapper() { + @Override + public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { + List values = new ArrayList<>(); + for (SearchHit searchHit : response.getHits()) { + values.add((String) searchHit.getSource().get("message")); + } + return new AggregatedPageImpl<>((List) values); + } + }); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + assertThat(page.getContent().get(0), is(message)); + } + + @Test + public void shouldReturnFieldsBasedOnSourceFilter() { + // given + String documentId = randomNumeric(5); + String message = "some test message"; + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message(message) + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + + FetchSourceFilterBuilder sourceFilter = new FetchSourceFilterBuilder(); + sourceFilter.withIncludes("message"); + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices(INDEX_NAME) + .withTypes(TYPE_NAME).withSourceFilter(sourceFilter.build()).build(); + // when + Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + assertThat(page.getContent().get(0).getMessage(), is(message)); + } + + + @Test + public void shouldReturnSimilarResultsGivenMoreLikeThisQuery() { + // given + String sampleMessage = "So we build a web site or an application and want to add search to it, " + + "and then it hits us: getting search working is hard. We want our search solution to be fast," + + " we want a painless setup and a completely free search schema, we want to be able to index data simply using JSON over HTTP, " + + "we want our search server to be always available, we want to be able to start with one machine and scale to hundreds, " + + "we want real-time search, we want simple multi-tenancy, and we want a solution that is built for the cloud."; + + String documentId1 = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId1).message(sampleMessage) + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + + String documentId2 = randomNumeric(5); + + elasticsearchTemplate.index(getIndexQuery(SampleEntity.builder().id(documentId2).message(sampleMessage) + .version(System.currentTimeMillis()).build())); + elasticsearchTemplate.refresh(SampleEntity.class); + + MoreLikeThisQuery moreLikeThisQuery = new MoreLikeThisQuery(); + moreLikeThisQuery.setId(documentId2); + moreLikeThisQuery.addFields("message"); + moreLikeThisQuery.setMinDocFreq(1); + // when + Page sampleEntities = elasticsearchTemplate.moreLikeThis(moreLikeThisQuery, SampleEntity.class); + + // then + assertThat(sampleEntities.getTotalElements(), is(equalTo(1L))); + assertThat(sampleEntities.getContent(), hasItem(sampleEntity)); + } + + /* + DATAES-167 + */ + @Test + public void shouldReturnResultsWithScanAndScrollForGivenCriteriaQuery() { + //given + List entities = createSampleEntitiesWithMessage("Test message", 30); + // when + elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); + criteriaQuery.addIndices(INDEX_NAME); + criteriaQuery.addTypes(TYPE_NAME); + criteriaQuery.setPageable(new PageRequest(0, 10)); + + ScrolledPage scroll = (ScrolledPage) elasticsearchTemplate.startScroll( 1000, criteriaQuery, SampleEntity.class); + List sampleEntities = new ArrayList<>(); + while (scroll.hasContent()) { + sampleEntities.addAll(scroll.getContent()); + scroll = (ScrolledPage) elasticsearchTemplate.continueScroll(scroll.getScrollId() , 1000, SampleEntity.class); + } + elasticsearchTemplate.clearScroll(scroll.getScrollId()); + assertThat(sampleEntities.size(), is(equalTo(30))); + } + + @Test + public void shouldReturnResultsWithScanAndScrollForGivenSearchQuery() { + //given + List entities = createSampleEntitiesWithMessage("Test message", 30); + // when + elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices(INDEX_NAME) + .withTypes(TYPE_NAME).withPageable(new PageRequest(0, 10)).build(); + + ScrolledPage scroll = (ScrolledPage) elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class); + List sampleEntities = new ArrayList<>(); + while (scroll.hasContent()) { + sampleEntities.addAll(scroll.getContent()); + scroll = (ScrolledPage) elasticsearchTemplate.continueScroll(scroll.getScrollId() , 1000, SampleEntity.class); + } + elasticsearchTemplate.clearScroll(scroll.getScrollId()); + assertThat(sampleEntities.size(), is(equalTo(30))); + } + + + final SearchResultMapper searchResultMapper = new SearchResultMapper() { + @Override + public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { + List result = new ArrayList(); + for (SearchHit searchHit : response.getHits()) { + if (response.getHits().getHits().length <= 0) { + return new AggregatedPageImpl(Collections.EMPTY_LIST, response.getScrollId()); + } + String message = (String) searchHit.getSource().get("message"); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(searchHit.getId()); + sampleEntity.setMessage(message); + result.add(sampleEntity); + } + + if (result.size() > 0) { + return new AggregatedPageImpl((List) result, response.getScrollId()); + } + return new AggregatedPageImpl(Collections.EMPTY_LIST, response.getScrollId()); + } + }; + + /* + DATAES-167 + */ + @Test + public void shouldReturnResultsWithScanAndScrollForSpecifiedFieldsForCriteriaQuery() { + //given + List entities = createSampleEntitiesWithMessage("Test message", 30); + // when + elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); + criteriaQuery.addIndices(INDEX_NAME); + criteriaQuery.addTypes(TYPE_NAME); + criteriaQuery.addFields("message"); + criteriaQuery.setPageable(new PageRequest(0, 10)); + + Page scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class, searchResultMapper); + String scrollId = ((ScrolledPage)scroll).getScrollId(); + List sampleEntities = new ArrayList<>(); + while (scroll.hasContent()) { + sampleEntities.addAll(scroll.getContent()); + scrollId = ((ScrolledPage)scroll).getScrollId(); + scroll = elasticsearchTemplate.continueScroll(scrollId , 1000, SampleEntity.class, searchResultMapper); + } + elasticsearchTemplate. clearScroll(scrollId); + assertThat(sampleEntities.size(), is(equalTo(30))); + } + + /* + DATAES-84 + */ + @Test + public void shouldReturnResultsWithScanAndScrollForSpecifiedFieldsForSearchCriteria() { + //given + List entities = createSampleEntitiesWithMessage("Test message", 30); + // when + elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) + .withIndices(INDEX_NAME) + .withTypes(TYPE_NAME) + .withFields("message") + .withQuery(matchAllQuery()) + .withPageable(new PageRequest(0, 10)) + .build(); + + Page scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class, searchResultMapper); + String scrollId = ((ScrolledPage) scroll).getScrollId(); + List sampleEntities = new ArrayList<>(); + while (scroll.hasContent()) { + sampleEntities.addAll(scroll.getContent()); + scrollId = ((ScrolledPage) scroll).getScrollId(); + scroll = elasticsearchTemplate.continueScroll(scrollId, 1000, SampleEntity.class, searchResultMapper); + } + elasticsearchTemplate.clearScroll(scrollId); + assertThat(sampleEntities.size(), is(equalTo(30))); + } + + /* + DATAES-167 + */ + @Test + public void shouldReturnResultsForScanAndScrollWithCustomResultMapperForGivenCriteriaQuery() { + //given + List entities = createSampleEntitiesWithMessage("Test message", 30); + // when + elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); + criteriaQuery.addIndices(INDEX_NAME); + criteriaQuery.addTypes(TYPE_NAME); + criteriaQuery.setPageable(new PageRequest(0, 10)); + + Page scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class, searchResultMapper); + String scrollId = ((ScrolledPage) scroll).getScrollId(); + List sampleEntities = new ArrayList<>(); + while (scroll.hasContent()) { + sampleEntities.addAll(scroll.getContent()); + scrollId = ((ScrolledPage) scroll).getScrollId(); + scroll = elasticsearchTemplate.continueScroll(scrollId, 1000, SampleEntity.class, searchResultMapper); + } + elasticsearchTemplate.clearScroll(scrollId); + assertThat(sampleEntities.size(), is(equalTo(30))); + } + + @Test + public void shouldReturnResultsForScanAndScrollWithCustomResultMapperForGivenSearchQuery() { + //given + List entities = createSampleEntitiesWithMessage("Test message", 30); + // when + elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices(INDEX_NAME) + .withTypes(TYPE_NAME).withPageable(new PageRequest(0, 10)).build(); + + Page scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class,searchResultMapper); + String scrollId = ((ScrolledPage) scroll).getScrollId(); + List sampleEntities = new ArrayList<>(); + while (scroll.hasContent()) { + sampleEntities.addAll(scroll.getContent()); + scrollId = ((ScrolledPage) scroll).getScrollId(); + scroll = elasticsearchTemplate.continueScroll(scrollId, 1000, SampleEntity.class, searchResultMapper); + } + elasticsearchTemplate.clearScroll(scrollId); + assertThat(sampleEntities.size(), is(equalTo(30))); + } + + /* + DATAES-217 + */ + @Test + public void shouldReturnResultsWithScanAndScrollForGivenCriteriaQueryAndClass() { + //given + List entities = createSampleEntitiesWithMessage("Test message", 30); + // when + elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); + criteriaQuery.setPageable(new PageRequest(0, 10)); + + Page scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class); + String scrollId = ((ScrolledPage) scroll).getScrollId(); + List sampleEntities = new ArrayList<>(); + while (scroll.hasContent()) { + sampleEntities.addAll(scroll.getContent()); + scrollId = ((ScrolledPage) scroll).getScrollId(); + scroll = elasticsearchTemplate.continueScroll(scrollId, 1000, SampleEntity.class); + } + elasticsearchTemplate.clearScroll(scrollId); + assertThat(sampleEntities.size(), is(equalTo(30))); + } + + /* + DATAES-217 + */ + @Test + public void shouldReturnResultsWithScanAndScrollForGivenSearchQueryAndClass() { + //given + List entities = createSampleEntitiesWithMessage("Test message", 30); + // when + elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) + .withPageable(new PageRequest(0, 10)).build(); + + Page scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class); + String scrollId = ((ScrolledPage) scroll).getScrollId(); + List sampleEntities = new ArrayList<>(); + while (scroll.hasContent()) { + sampleEntities.addAll(scroll.getContent()); + scrollId = ((ScrolledPage) scroll).getScrollId(); + scroll = elasticsearchTemplate.continueScroll(scrollId, 1000, SampleEntity.class); + } + elasticsearchTemplate.clearScroll(scrollId); + assertThat(sampleEntities.size(), is(equalTo(30))); + } + + /* + DATAES-167 + */ + @Test + public void shouldReturnResultsWithStreamForGivenCriteriaQuery() { + //given + List entities = createSampleEntitiesWithMessage("Test message", 30); + // when + elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); + criteriaQuery.addIndices(INDEX_NAME); + criteriaQuery.addTypes(TYPE_NAME); + criteriaQuery.setPageable(new PageRequest(0, 10)); + + CloseableIterator stream = elasticsearchTemplate.stream(criteriaQuery, SampleEntity.class); + List sampleEntities = new ArrayList<>(); + while (stream.hasNext()) { + sampleEntities.add(stream.next()); + } + assertThat(sampleEntities.size(), is(equalTo(30))); + } + + private static List createSampleEntitiesWithMessage(String message, int numberOfEntities) { + List indexQueries = new ArrayList<>(); + for (int i = 0; i < numberOfEntities; i++) { + String documentId = UUID.randomUUID().toString(); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage(message); + sampleEntity.setRate(2); + sampleEntity.setVersion(System.currentTimeMillis()); + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + indexQueries.add(indexQuery); + } + return indexQueries; + } + + @Test + public void shouldReturnListForGivenCriteria() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) + .message("test message") + .version(System.currentTimeMillis()).build(); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) + .message("test test") + .rate(5) + .version(System.currentTimeMillis()).build(); + + // third document + String documentId3 = randomNumeric(5); + SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3) + .message("some message") + .rate(15) + .version(System.currentTimeMillis()).build(); + + indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); + + // when + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + // when + CriteriaQuery singleCriteriaQuery = new CriteriaQuery(new Criteria("message").contains("test")); + CriteriaQuery multipleCriteriaQuery = new CriteriaQuery(new Criteria("message").contains("some").and("message") + .contains("message")); + List sampleEntitiesForSingleCriteria = elasticsearchTemplate.queryForList(singleCriteriaQuery, + SampleEntity.class); + List sampleEntitiesForAndCriteria = elasticsearchTemplate.queryForList(multipleCriteriaQuery, + SampleEntity.class); + // then + assertThat(sampleEntitiesForSingleCriteria.size(), is(2)); + assertThat(sampleEntitiesForAndCriteria.size(), is(1)); + } + + @Test + public void shouldReturnListForGivenStringQuery() { + // given + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) + .message("test message") + .version(System.currentTimeMillis()).build(); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) + .message("test test") + .rate(5) + .version(System.currentTimeMillis()).build(); + + // third document + String documentId3 = randomNumeric(5); + SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3) + .message("some message") + .rate(15) + .version(System.currentTimeMillis()).build(); + + List indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); + + // when + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + // when + StringQuery stringQuery = new StringQuery(matchAllQuery().toString()); + List sampleEntities = elasticsearchTemplate.queryForList(stringQuery, SampleEntity.class); + // then + assertThat(sampleEntities.size(), is(3)); + } + + @Test + public void shouldPutMappingForGivenEntity() throws Exception { + // given + Class entity = SampleMappingEntity.class; + elasticsearchTemplate.deleteIndex(entity); + elasticsearchTemplate.createIndex(entity); + // when + assertThat(elasticsearchTemplate.putMapping(entity), is(true)); + } + + @Test + public void shouldDeleteIndexForGivenEntity() { + // given + Class clazz = SampleEntity.class; + // when + elasticsearchTemplate.deleteIndex(clazz); + // then + assertThat(elasticsearchTemplate.indexExists(clazz), is(false)); + } + + @Test + public void shouldDoPartialUpdateForExistingDocument() { + //given + String documentId = randomNumeric(5); + String messageBeforeUpdate = "some test message"; + String messageAfterUpdate = "test message"; + + SampleEntity sampleEntity = SampleEntity.builder().id(documentId) + .message(messageBeforeUpdate) + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + + IndexRequest indexRequest = new IndexRequest(); + indexRequest.source("message", messageAfterUpdate); + UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId) + .withClass(SampleEntity.class).withIndexRequest(indexRequest).build(); + // when + elasticsearchTemplate.update(updateQuery); + //then + GetQuery getQuery = new GetQuery(); + getQuery.setId(documentId); + SampleEntity indexedEntity = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); + assertThat(indexedEntity.getMessage(), is(messageAfterUpdate)); + } + + @Test(expected = DocumentMissingException.class) + public void shouldThrowExceptionIfDocumentDoesNotExistWhileDoingPartialUpdate() { + // when + IndexRequest indexRequest = new IndexRequest(); + UpdateQuery updateQuery = new UpdateQueryBuilder().withId(randomNumeric(5)) + .withClass(SampleEntity.class).withIndexRequest(indexRequest).build(); + elasticsearchTemplate.update(updateQuery); + } + + @Test + public void shouldDoUpsertIfDocumentDoesNotExist() { + //given + String documentId = randomNumeric(5); + String message = "test message"; + IndexRequest indexRequest = new IndexRequest(); + indexRequest.source("message", message); + UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId) + .withDoUpsert(true).withClass(SampleEntity.class) + .withIndexRequest(indexRequest).build(); + //when + elasticsearchTemplate.update(updateQuery); + //then + GetQuery getQuery = new GetQuery(); + getQuery.setId(documentId); + SampleEntity indexedEntity = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); + assertThat(indexedEntity.getMessage(), is(message)); + } + + @Test + public void shouldReturnHighlightedFieldsForGivenQueryAndFields() { + + //given + String documentId = randomNumeric(5); + String actualMessage = "some test message"; + String highlightedMessage = "some test message"; + + SampleEntity sampleEntity = SampleEntity.builder().id(documentId) + .message(actualMessage) + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + + final List message = new HighlightBuilder().field("message").fields(); + SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(termQuery("message", "test")) + .withHighlightFields(message.toArray(new HighlightBuilder.Field[message.size()])) + .build(); + + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, new SearchResultMapper() { + @Override + public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { + List chunk = new ArrayList<>(); + for (SearchHit searchHit : response.getHits()) { + if (response.getHits().getHits().length <= 0) { + return null; + } + SampleEntity user = new SampleEntity(); + user.setId(searchHit.getId()); + user.setMessage((String) searchHit.getSource().get("message")); + user.setHighlightedMessage(searchHit.getHighlightFields().get("message").fragments()[0].toString()); + chunk.add(user); + } + if (chunk.size() > 0) { + return new AggregatedPageImpl<>((List) chunk); + } + return null; + } + }); + + assertThat(sampleEntities.getContent().get(0).getHighlightedMessage(), is(highlightedMessage)); + } + + @Test + public void shouldDeleteDocumentBySpecifiedTypeUsingDeleteQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId) + .message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + // when + DeleteQuery deleteQuery = new DeleteQuery(); + deleteQuery.setQuery(termQuery("id", documentId)); + deleteQuery.setIndex(INDEX_NAME); + deleteQuery.setType(TYPE_NAME); + elasticsearchTemplate.delete(deleteQuery); + elasticsearchTemplate.refresh(INDEX_NAME); + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + assertThat(sampleEntities.getTotalElements(), equalTo(0L)); + } + + @Test + public void shouldIndexDocumentForSpecifiedSource() { + + // given + String documentSource = "{\"id\":\"2333343434\",\"type\":null,\"message\":\"some message\",\"rate\":0,\"available\":false,\"highlightedMessage\":null,\"version\":1385208779482}"; + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId("2333343434"); + indexQuery.setSource(documentSource); + indexQuery.setIndexName(INDEX_NAME); + indexQuery.setType(TYPE_NAME); + // when + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", indexQuery.getId())) + .withIndices(INDEX_NAME) + .withTypes(TYPE_NAME) + .build(); + // then + Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, new SearchResultMapper() { + @Override + public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { + List values = new ArrayList<>(); + for (SearchHit searchHit : response.getHits()) { + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(searchHit.getId()); + sampleEntity.setMessage((String) searchHit.getSource().get("message")); + values.add(sampleEntity); + } + return new AggregatedPageImpl<>((List) values); + } + }); + assertThat(page, is(notNullValue())); + assertThat(page.getContent().size(), is(1)); + assertThat(page.getContent().get(0).getId(), is(indexQuery.getId())); + } + + @Test(expected = ElasticsearchException.class) + public void shouldThrowElasticsearchExceptionWhenNoDocumentSpecified() { + // given + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId("2333343434"); + indexQuery.setIndexName(INDEX_NAME); + indexQuery.setType(TYPE_NAME); + + //when + elasticsearchTemplate.index(indexQuery); + } + + @Test + public void shouldReturnIds() { + //given + List entities = createSampleEntitiesWithMessage("Test message", 30); + // when + elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.refresh(SampleEntity.class); + SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(termQuery("message", "message")) + .withIndices(INDEX_NAME) + .withTypes(TYPE_NAME) + .withPageable(new PageRequest(0, 100)) + .build(); + // then + List ids = elasticsearchTemplate.queryForIds(searchQuery); + assertThat(ids, is(notNullValue())); + assertThat(ids.size(), is(30)); + } + + @Test + public void shouldReturnDocumentAboveMinimalScoreGivenQuery() { + // given + List indexQueries = new ArrayList<>(); + + indexQueries.add(buildIndex(SampleEntity.builder().id("1").message("ab").build())); + indexQueries.add(buildIndex(SampleEntity.builder().id("2").message("bc").build())); + indexQueries.add(buildIndex(SampleEntity.builder().id("3").message("ac").build())); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + + // when + SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(boolQuery() + .must(wildcardQuery("message", "*a*")) + .should(wildcardQuery("message", "*b*")) + ) + .withIndices(INDEX_NAME) + .withTypes(TYPE_NAME) + .withMinScore(2.0F) + .build(); + + Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + // then + assertThat(page.getTotalElements(), is(1L)); + assertThat(page.getContent().get(0).getMessage(), is("ab")); + } + + + @Test + public void shouldDoIndexWithoutId() { + // given + // document + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setObject(sampleEntity); + // when + String documentId = elasticsearchTemplate.index(indexQuery); + // then + assertThat(sampleEntity.getId(), is(equalTo(documentId))); + + GetQuery getQuery = new GetQuery(); + getQuery.setId(documentId); + SampleEntity result = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); + assertThat(result.getId(), is(equalTo(documentId))); + } + + @Test + public void shouldDoBulkIndexWithoutId() { + // given + List indexQueries = new ArrayList<>(); + // first document + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setMessage("some message"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setMessage("some message"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setObject(sampleEntity2); + indexQueries.add(indexQuery2); + // when + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + assertThat(sampleEntities.getTotalElements(), is(equalTo(2L))); + + assertThat(sampleEntities.getContent().get(0).getId(), is(notNullValue())); + assertThat(sampleEntities.getContent().get(1).getId(), is(notNullValue())); + } + + @Test + public void shouldIndexMapWithIndexNameAndTypeAtRuntime() { + //given + Map person1 = new HashMap<>(); + person1.put("userId", "1"); + person1.put("email", "smhdiu@gmail.com"); + person1.put("title", "Mr"); + person1.put("firstName", "Mohsin"); + person1.put("lastName", "Husen"); + + Map person2 = new HashMap<>(); + person2.put("userId", "2"); + person2.put("email", "akonczak@gmail.com"); + person2.put("title", "Mr"); + person2.put("firstName", "Artur"); + person2.put("lastName", "Konczak"); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId("1"); + indexQuery1.setObject(person1); + indexQuery1.setIndexName(INDEX_NAME); + indexQuery1.setType(TYPE_NAME); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId("2"); + indexQuery2.setObject(person2); + indexQuery2.setIndexName(INDEX_NAME); + indexQuery2.setType(TYPE_NAME); + + List indexQueries = new ArrayList<>(); + indexQueries.add(indexQuery1); + indexQueries.add(indexQuery2); + + //when + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(INDEX_NAME); + + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices(INDEX_NAME) + .withTypes(TYPE_NAME).withQuery(matchAllQuery()).build(); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, Map.class, new SearchResultMapper() { + @Override + public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { + List chunk = new ArrayList<>(); + for (SearchHit searchHit : response.getHits()) { + if (response.getHits().getHits().length <= 0) { + return null; + } + Map person = new HashMap<>(); + person.put("userId", searchHit.getSource().get("userId")); + person.put("email", searchHit.getSource().get("email")); + person.put("title", searchHit.getSource().get("title")); + person.put("firstName", searchHit.getSource().get("firstName")); + person.put("lastName", searchHit.getSource().get("lastName")); + chunk.add(person); + } + if (chunk.size() > 0) { + return new AggregatedPageImpl<>((List) chunk); + } + return null; + } + }); + assertThat(sampleEntities.getTotalElements(), is(equalTo(2L))); + assertThat(sampleEntities.getContent().get(0).get("userId"), is(person1.get("userId"))); + assertThat(sampleEntities.getContent().get(1).get("userId"), is(person2.get("userId"))); + } + + @Test + public void shouldIndexSampleEntityWithIndexAndTypeAtRuntime() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId) + .message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = new IndexQueryBuilder().withId(documentId) + .withIndexName(INDEX_NAME).withType(TYPE_NAME) + .withObject(sampleEntity).build(); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(INDEX_NAME); + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices(INDEX_NAME) + .withTypes(TYPE_NAME).withQuery(matchAllQuery()).build(); + // when + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + // then + assertThat(sampleEntities, is(notNullValue())); + assertThat(sampleEntities.getTotalElements(), greaterThanOrEqualTo(1L)); + } + + /* + DATAES-106 + */ + @Test + public void shouldReturnCountForGivenCriteriaQueryWithGivenIndexUsingCriteriaQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); + criteriaQuery.addIndices(INDEX_NAME); + // when + long count = elasticsearchTemplate.count(criteriaQuery); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-67 + */ + @Test + public void shouldReturnCountForGivenSearchQueryWithGivenIndexUsingSearchQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchAllQuery()) + .withIndices(INDEX_NAME) + .build(); + // when + long count = elasticsearchTemplate.count(searchQuery); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldReturnCountForGivenCriteriaQueryWithGivenIndexAndTypeUsingCriteriaQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); + criteriaQuery.addIndices(INDEX_NAME); + criteriaQuery.addTypes("test-type"); + // when + long count = elasticsearchTemplate.count(criteriaQuery); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-67 + */ + @Test + public void shouldReturnCountForGivenSearchQueryWithGivenIndexAndTypeUsingSearchQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchAllQuery()) + .withIndices(INDEX_NAME) + .withTypes("test-type") + .build(); + // when + long count = elasticsearchTemplate.count(searchQuery); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldReturnCountForGivenCriteriaQueryWithGivenMultiIndices() { + // given + cleanUpIndices(); + String documentId1 = randomNumeric(5); + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) + .withIndexName("test-index-1") + .withObject(sampleEntity1) + .build(); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) + .withIndexName("test-index-2") + .withObject(sampleEntity2) + .build(); + + elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); + elasticsearchTemplate.refresh("test-index-1"); + elasticsearchTemplate.refresh("test-index-2"); + + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); + criteriaQuery.addIndices("test-index-1", "test-index-2"); + // when + long count = elasticsearchTemplate.count(criteriaQuery); + // then + assertThat(count, is(equalTo(2L))); + } + + /* + DATAES-67 + */ + @Test + public void shouldReturnCountForGivenSearchQueryWithGivenMultiIndices() { + // given + cleanUpIndices(); + String documentId1 = randomNumeric(5); + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) + .withIndexName("test-index-1") + .withObject(sampleEntity1) + .build(); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) + .withIndexName("test-index-2") + .withObject(sampleEntity2) + .build(); + + elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); + elasticsearchTemplate.refresh("test-index-1"); + elasticsearchTemplate.refresh("test-index-2"); + + SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchAllQuery()) + .withIndices("test-index-1", "test-index-2") + .build(); + // when + long count = elasticsearchTemplate.count(searchQuery); + // then + assertThat(count, is(equalTo(2L))); + } + + private void cleanUpIndices() { + elasticsearchTemplate.deleteIndex("test-index-1"); + elasticsearchTemplate.deleteIndex("test-index-2"); + elasticsearchTemplate.createIndex("test-index-1"); + elasticsearchTemplate.createIndex("test-index-2"); + elasticsearchTemplate.refresh("test-index-1"); + elasticsearchTemplate.refresh("test-index-2"); + } + + /* + DATAES-71 + */ + @Test + public void shouldCreatedIndexWithSpecifiedIndexName() { + // given + elasticsearchTemplate.deleteIndex("test-index"); + // when + elasticsearchTemplate.createIndex("test-index"); + // then + assertThat(elasticsearchTemplate.indexExists("test-index"), is(true)); + } + + /* + DATAES-72 + */ + @Test + public void shouldDeleteIndexForSpecifiedIndexName() { + // given + elasticsearchTemplate.createIndex(SampleEntity.class); + elasticsearchTemplate.refresh(SampleEntity.class); + + // when + elasticsearchTemplate.deleteIndex("test-index"); + // then + assertThat(elasticsearchTemplate.indexExists("test-index"), is(false)); + } + + /* + DATAES-106 + */ + @Test + public void shouldReturnCountForGivenCriteriaQueryWithGivenIndexNameForSpecificIndex() { + // given + cleanUpIndices(); + String documentId1 = randomNumeric(5); + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) + .withIndexName("test-index-1") + .withObject(sampleEntity1) + .build(); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) + .withIndexName("test-index-2") + .withObject(sampleEntity2) + .build(); + + elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); + elasticsearchTemplate.refresh("test-index-1"); + elasticsearchTemplate.refresh("test-index-2"); + + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); + criteriaQuery.addIndices("test-index-1"); + // when + long count = elasticsearchTemplate.count(criteriaQuery); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-67 + */ + @Test + public void shouldReturnCountForGivenSearchQueryWithGivenIndexNameForSpecificIndex() { + // given + cleanUpIndices(); + String documentId1 = randomNumeric(5); + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) + .withIndexName("test-index-1") + .withObject(sampleEntity1) + .build(); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) + .withIndexName("test-index-2") + .withObject(sampleEntity2) + .build(); + + elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); + elasticsearchTemplate.refresh("test-index-1"); + elasticsearchTemplate.refresh("test-index-2"); + + SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchAllQuery()) + .withIndices("test-index-1") + .build(); + // when + long count = elasticsearchTemplate.count(searchQuery); + // then + assertThat(count, is(equalTo(1L))); + } + + @Test(expected = IllegalArgumentException.class) + public void shouldThrowAnExceptionForGivenCriteriaQueryWhenNoIndexSpecifiedForCountQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); + // when + long count = elasticsearchTemplate.count(criteriaQuery); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-67 + */ + @Test(expected = IllegalArgumentException.class) + public void shouldThrowAnExceptionForGivenSearchQueryWhenNoIndexSpecifiedForCountQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchAllQuery()) + .build(); + // when + long count = elasticsearchTemplate.count(searchQuery); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-71 + */ + @Test + public void shouldCreateIndexWithGivenSettings() { + // given + String settings = "{\n" + + " \"index\": {\n" + + " \"number_of_shards\": \"1\",\n" + + " \"number_of_replicas\": \"0\",\n" + + " \"analysis\": {\n" + + " \"analyzer\": {\n" + + " \"emailAnalyzer\": {\n" + + " \"type\": \"custom\",\n" + + " \"tokenizer\": \"uax_url_email\"\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + "}"; + + elasticsearchTemplate.deleteIndex("test-index"); + // when + elasticsearchTemplate.createIndex("test-index", settings); + // then + Map map = elasticsearchTemplate.getSetting("test-index"); + boolean hasAnalyzer = map.containsKey("index.analysis.analyzer.emailAnalyzer.tokenizer"); + String emailAnalyzer = (String) map.get("index.analysis.analyzer.emailAnalyzer.tokenizer"); + assertThat(elasticsearchTemplate.indexExists("test-index"), is(true)); + assertThat(hasAnalyzer, is(true)); + assertThat(emailAnalyzer, is("uax_url_email")); + } + + /* + DATAES-71 + */ + @Test + public void shouldCreateGivenSettingsForGivenIndex() { + //given + //delete , create and apply mapping in before method + + // then + Map map = elasticsearchTemplate.getSetting(SampleEntity.class); + assertThat(elasticsearchTemplate.indexExists("test-index"), is(true)); + assertThat(map.containsKey("index.refresh_interval"), is(true)); + assertThat(map.containsKey("index.number_of_replicas"), is(true)); + assertThat(map.containsKey("index.number_of_shards"), is(true)); + assertThat(map.containsKey("index.store.type"), is(true)); + assertThat((String) map.get("index.refresh_interval"), is("-1")); + assertThat((String) map.get("index.number_of_replicas"), is("0")); + assertThat((String) map.get("index.number_of_shards"), is("1")); + assertThat((String) map.get("index.store.type"), is("fs")); + } + + /* + DATAES-88 + */ + @Test + public void shouldCreateIndexWithGivenClassAndSettings() { + //given + String settings = "{\n" + + " \"index\": {\n" + + " \"number_of_shards\": \"1\",\n" + + " \"number_of_replicas\": \"0\",\n" + + " \"analysis\": {\n" + + " \"analyzer\": {\n" + + " \"emailAnalyzer\": {\n" + + " \"type\": \"custom\",\n" + + " \"tokenizer\": \"uax_url_email\"\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + "}"; + + elasticsearchTemplate.deleteIndex(SampleEntity.class); + elasticsearchTemplate.createIndex(SampleEntity.class, settings); + elasticsearchTemplate.putMapping(SampleEntity.class); + elasticsearchTemplate.refresh(SampleEntity.class); + + // then + Map map = elasticsearchTemplate.getSetting(SampleEntity.class); + assertThat(elasticsearchTemplate.indexExists(INDEX_NAME), is(true)); + assertThat(map.containsKey("index.number_of_replicas"), is(true)); + assertThat(map.containsKey("index.number_of_shards"), is(true)); + assertThat((String) map.get("index.number_of_replicas"), is("0")); + assertThat((String) map.get("index.number_of_shards"), is("1")); + } + + @Test + public void shouldTestResultsAcrossMultipleIndices() { + // given + String documentId1 = randomNumeric(5); + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) + .withIndexName("test-index-1") + .withObject(sampleEntity1) + .build(); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) + .withIndexName("test-index-2") + .withObject(sampleEntity2) + .build(); + + elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); + elasticsearchTemplate.refresh("test-index-1"); + elasticsearchTemplate.refresh("test-index-2"); + + SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchAllQuery()) + .withIndices("test-index-1", "test-index-2") + .build(); + // when + List sampleEntities = elasticsearchTemplate.queryForList(searchQuery, SampleEntity.class); + + // then + assertThat(sampleEntities.size(), is(equalTo(2))); + } + + @Test + /** + * This is basically a demonstration to show composing entities out of heterogeneous indexes. + */ + public void shouldComposeObjectsReturnedFromHeterogeneousIndexes() { + + // Given + + HetroEntity1 entity1 = new HetroEntity1(randomNumeric(3), "aFirstName"); + HetroEntity2 entity2 = new HetroEntity2(randomNumeric(4), "aLastName"); + + IndexQuery idxQuery1 = new IndexQueryBuilder().withIndexName(INDEX_1_NAME).withId(entity1.getId()).withObject(entity1).build(); + IndexQuery idxQuery2 = new IndexQueryBuilder().withIndexName(INDEX_2_NAME).withId(entity2.getId()).withObject(entity2).build(); + + elasticsearchTemplate.bulkIndex(Arrays.asList(idxQuery1, idxQuery2)); + elasticsearchTemplate.refresh(INDEX_1_NAME); + elasticsearchTemplate.refresh(INDEX_2_NAME); + + // When + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withTypes("hetro").withIndices(INDEX_1_NAME, INDEX_2_NAME).build(); + Page page = elasticsearchTemplate.queryForPage(searchQuery, ResultAggregator.class, new SearchResultMapper() { + @Override + public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { + List values = new ArrayList<>(); + for (SearchHit searchHit : response.getHits()) { + String id = String.valueOf(searchHit.getSource().get("id")); + String firstName = StringUtils.isNotEmpty((String) searchHit.getSource().get("firstName")) ? (String) searchHit.getSource().get("firstName") : ""; + String lastName = StringUtils.isNotEmpty((String) searchHit.getSource().get("lastName")) ? (String) searchHit.getSource().get("lastName") : ""; + values.add(new ResultAggregator(id, firstName, lastName)); + } + return new AggregatedPageImpl<>((List) values); + } + }); + + assertThat(page.getTotalElements(), is(2l)); + } + + @Test + public void shouldCreateIndexUsingServerDefaultConfiguration() { + //given + + //when + boolean created = elasticsearchTemplate.createIndex(UseServerConfigurationEntity.class); + //then + assertThat(created, is(true)); + final Map setting = elasticsearchTemplate.getSetting(UseServerConfigurationEntity.class); + assertThat(setting.get("index.number_of_shards"), Matchers.is("5")); + assertThat(setting.get("index.number_of_replicas"), Matchers.is("1")); + } + + @Test + public void shouldReadFileFromClasspathRetainingNewlines() { + // given + String settingsFile = "/settings/test-settings.yml"; + + // when + String content = ElasticsearchTemplate.readFileFromClasspath(settingsFile); + + // then + assertThat(content, is("index:\n" + + " number_of_shards: 1\n" + + " number_of_replicas: 0\n" + + " analysis:\n" + + " analyzer:\n" + + " emailAnalyzer:\n" + + " type: custom\n" + + " tokenizer: uax_url_email\n")); + } + + private IndexQuery getIndexQuery(SampleEntity sampleEntity) { + return new IndexQueryBuilder().withId(sampleEntity.getId()).withObject(sampleEntity).build(); + } + + private List getIndexQueries(List sampleEntities) { + List indexQueries = new ArrayList<>(); + for (SampleEntity sampleEntity : sampleEntities) { + indexQueries.add(new IndexQueryBuilder().withId(sampleEntity.getId()).withObject(sampleEntity).build()); + } + return indexQueries; + } + + @Document(indexName = INDEX_2_NAME, replicas = 0, shards = 1) + class ResultAggregator { + + private String id; + private String firstName; + private String lastName; + + ResultAggregator(String id, String firstName, String lastName) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + } + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/convert/DateTimeConvertersTests.java b/src/test/java/org/springframework/data/elasticsearch/core/convert/DateTimeConvertersTests.java index fcf0df6ea..5c53b3e1e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/convert/DateTimeConvertersTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/convert/DateTimeConvertersTests.java @@ -1,73 +1,73 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.convert; - -import java.util.Calendar; -import java.util.TimeZone; - -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; -import org.joda.time.LocalDateTime; -import org.junit.Assert; -import org.junit.Test; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - */ -public class DateTimeConvertersTests { - - @Test - public void testJodaDateTimeConverterWithNullValue() { - Assert.assertNull(DateTimeConverters.JodaDateTimeConverter.INSTANCE.convert(null)); - } - - @Test - public void testJodaDateTimeConverter() { - DateTime dateTime = new DateTime(2013, 1, 24, 6, 35, 0, DateTimeZone.UTC); - Assert - .assertEquals("2013-01-24T06:35:00.000Z", DateTimeConverters.JodaDateTimeConverter.INSTANCE.convert(dateTime)); - } - - @Test - public void testJodaLocalDateTimeConverterWithNullValue() { - Assert.assertNull(DateTimeConverters.JodaLocalDateTimeConverter.INSTANCE.convert(null)); - } - - @Test - public void testJodaLocalDateTimeConverter() { - LocalDateTime dateTime = new LocalDateTime(new DateTime(2013, 1, 24, 6, 35, 0, DateTimeZone.UTC).getMillis(), - DateTimeZone.UTC); - Assert.assertEquals("2013-01-24T06:35:00.000Z", - DateTimeConverters.JodaLocalDateTimeConverter.INSTANCE.convert(dateTime)); - } - - @Test - public void testJavaDateConverterWithNullValue() { - Assert.assertNull(DateTimeConverters.JavaDateConverter.INSTANCE.convert(null)); - } - - @Test - public void testJavaDateConverter() { - DateTime dateTime = new DateTime(2013, 1, 24, 6, 35, 0, DateTimeZone.UTC); - Calendar calendar = Calendar.getInstance(); - calendar.setTimeZone(TimeZone.getTimeZone("UTC")); - calendar.setTimeInMillis(dateTime.getMillis()); - - Assert.assertEquals("2013-01-24T06:35:00.000Z", - DateTimeConverters.JavaDateConverter.INSTANCE.convert(calendar.getTime())); - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.convert; + +import java.util.Calendar; +import java.util.TimeZone; + +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.joda.time.LocalDateTime; +import org.junit.Assert; +import org.junit.Test; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public class DateTimeConvertersTests { + + @Test + public void testJodaDateTimeConverterWithNullValue() { + Assert.assertNull(DateTimeConverters.JodaDateTimeConverter.INSTANCE.convert(null)); + } + + @Test + public void testJodaDateTimeConverter() { + DateTime dateTime = new DateTime(2013, 1, 24, 6, 35, 0, DateTimeZone.UTC); + Assert + .assertEquals("2013-01-24T06:35:00.000Z", DateTimeConverters.JodaDateTimeConverter.INSTANCE.convert(dateTime)); + } + + @Test + public void testJodaLocalDateTimeConverterWithNullValue() { + Assert.assertNull(DateTimeConverters.JodaLocalDateTimeConverter.INSTANCE.convert(null)); + } + + @Test + public void testJodaLocalDateTimeConverter() { + LocalDateTime dateTime = new LocalDateTime(new DateTime(2013, 1, 24, 6, 35, 0, DateTimeZone.UTC).getMillis(), + DateTimeZone.UTC); + Assert.assertEquals("2013-01-24T06:35:00.000Z", + DateTimeConverters.JodaLocalDateTimeConverter.INSTANCE.convert(dateTime)); + } + + @Test + public void testJavaDateConverterWithNullValue() { + Assert.assertNull(DateTimeConverters.JavaDateConverter.INSTANCE.convert(null)); + } + + @Test + public void testJavaDateConverter() { + DateTime dateTime = new DateTime(2013, 1, 24, 6, 35, 0, DateTimeZone.UTC); + Calendar calendar = Calendar.getInstance(); + calendar.setTimeZone(TimeZone.getTimeZone("UTC")); + calendar.setTimeInMillis(dateTime.getMillis()); + + Assert.assertEquals("2013-01-24T06:35:00.000Z", + DateTimeConverters.JavaDateConverter.INSTANCE.convert(calendar.getTime())); + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverterTests.java b/src/test/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverterTests.java index 88dd15ccc..f0f76988e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverterTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverterTests.java @@ -1,57 +1,57 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.convert; - -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - -import org.junit.Test; -import org.springframework.core.convert.ConversionService; -import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext; -import org.springframework.data.mapping.context.MappingContext; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - */ -public class MappingElasticsearchConverterTests { - - @Test(expected = IllegalArgumentException.class) - public void shouldFailToInitializeGivenMappingContextIsNull() { - // given - new MappingElasticsearchConverter(null); - } - - @Test - public void shouldReturnMappingContextWithWhichItWasInitialized() { - // given - MappingContext mappingContext = new SimpleElasticsearchMappingContext(); - MappingElasticsearchConverter converter = new MappingElasticsearchConverter(mappingContext); - // then - assertThat(converter.getMappingContext(), is(notNullValue())); - assertThat(converter.getMappingContext(), is(sameInstance(mappingContext))); - } - - @Test - public void shouldReturnDefaultConversionService() { - // given - MappingElasticsearchConverter converter = new MappingElasticsearchConverter(new SimpleElasticsearchMappingContext()); - // when - ConversionService conversionService = converter.getConversionService(); - // then - assertThat(conversionService, is(notNullValue())); - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.convert; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +import org.junit.Test; +import org.springframework.core.convert.ConversionService; +import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext; +import org.springframework.data.mapping.context.MappingContext; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public class MappingElasticsearchConverterTests { + + @Test(expected = IllegalArgumentException.class) + public void shouldFailToInitializeGivenMappingContextIsNull() { + // given + new MappingElasticsearchConverter(null); + } + + @Test + public void shouldReturnMappingContextWithWhichItWasInitialized() { + // given + MappingContext mappingContext = new SimpleElasticsearchMappingContext(); + MappingElasticsearchConverter converter = new MappingElasticsearchConverter(mappingContext); + // then + assertThat(converter.getMappingContext(), is(notNullValue())); + assertThat(converter.getMappingContext(), is(sameInstance(mappingContext))); + } + + @Test + public void shouldReturnDefaultConversionService() { + // given + MappingElasticsearchConverter converter = new MappingElasticsearchConverter(new SimpleElasticsearchMappingContext()); + // when + ConversionService conversionService = converter.getConversionService(); + // then + assertThat(conversionService, is(notNullValue())); + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntity.java b/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntity.java index 3e1379c25..ce1e71633 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntity.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntity.java @@ -1,111 +1,111 @@ -/* - * Copyright 2014-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.facet; - -import static org.springframework.data.elasticsearch.annotations.FieldType.Integer; -import static org.springframework.data.elasticsearch.annotations.FieldType.text; - -import java.util.ArrayList; -import java.util.List; - -import org.springframework.data.annotation.Id; -import org.springframework.data.elasticsearch.annotations.*; - -/** - * Simple type to test facets - * - * @author Artur Konczak - * @author Mohsin Husen - */ -@Document(indexName = "test-index-articles", type = "article", shards = 1, replicas = 0, refreshInterval = "-1") -public class ArticleEntity { - - @Id - private String id; - private String title; - @Field(type = text, fielddata = true) - private String subject; - - @MultiField( - mainField = @Field(type = text), - otherFields = { - @InnerField(suffix = "untouched", type = text, store = true, fielddata = true, indexAnalyzer = "keyword"), - @InnerField(suffix = "sort", type = text, store = true, indexAnalyzer = "keyword") - } - ) - private List authors = new ArrayList<>(); - - @Field(type = Integer, store = true) - private List publishedYears = new ArrayList<>(); - - private int score; - - private ArticleEntity() { - - } - - public ArticleEntity(String id) { - this.id = id; - } - - public void setId(String id) { - this.id = id; - } - - public String getId() { - return id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getSubject() { - return subject; - } - - public void setSubject(String subject) { - this.subject = subject; - } - - public List getAuthors() { - return authors; - } - - public void setAuthors(List authors) { - this.authors = authors; - } - - public List getPublishedYears() { - return publishedYears; - } - - public void setPublishedYears(List publishedYears) { - this.publishedYears = publishedYears; - } - - public int getScore() { - return score; - } - - public void setScore(int score) { - this.score = score; - } -} +/* + * Copyright 2014-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.facet; + +import static org.springframework.data.elasticsearch.annotations.FieldType.Integer; +import static org.springframework.data.elasticsearch.annotations.FieldType.text; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.*; + +/** + * Simple type to test facets + * + * @author Artur Konczak + * @author Mohsin Husen + */ +@Document(indexName = "test-index-articles", type = "article", shards = 1, replicas = 0, refreshInterval = "-1") +public class ArticleEntity { + + @Id + private String id; + private String title; + @Field(type = text, fielddata = true) + private String subject; + + @MultiField( + mainField = @Field(type = text), + otherFields = { + @InnerField(suffix = "untouched", type = text, store = true, fielddata = true, indexAnalyzer = "keyword"), + @InnerField(suffix = "sort", type = text, store = true, indexAnalyzer = "keyword") + } + ) + private List authors = new ArrayList<>(); + + @Field(type = Integer, store = true) + private List publishedYears = new ArrayList<>(); + + private int score; + + private ArticleEntity() { + + } + + public ArticleEntity(String id) { + this.id = id; + } + + public void setId(String id) { + this.id = id; + } + + public String getId() { + return id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public List getAuthors() { + return authors; + } + + public void setAuthors(List authors) { + this.authors = authors; + } + + public List getPublishedYears() { + return publishedYears; + } + + public void setPublishedYears(List publishedYears) { + this.publishedYears = publishedYears; + } + + public int getScore() { + return score; + } + + public void setScore(int score) { + this.score = score; + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntityBuilder.java b/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntityBuilder.java index 9f0ddbde5..65d00f72a 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntityBuilder.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntityBuilder.java @@ -1,69 +1,69 @@ -/* - * Copyright 2014 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.facet; - -import org.springframework.data.elasticsearch.core.query.IndexQuery; - -/** - * Simple type to test facets - * - * @author Artur Konczak - * @author Mohsin Husen - */ -public class ArticleEntityBuilder { - - private ArticleEntity result; - - public ArticleEntityBuilder(String id) { - result = new ArticleEntity(id); - } - - public ArticleEntityBuilder title(String title) { - result.setTitle(title); - return this; - } - - public ArticleEntityBuilder subject(String subject) { - result.setSubject(subject); - return this; - } - - public ArticleEntityBuilder addAuthor(String author) { - result.getAuthors().add(author); - return this; - } - - public ArticleEntityBuilder addPublishedYear(Integer year) { - result.getPublishedYears().add(year); - return this; - } - - public ArticleEntityBuilder score(int score) { - result.setScore(score); - return this; - } - - public ArticleEntity build() { - return result; - } - - public IndexQuery buildIndex() { - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(result.getId()); - indexQuery.setObject(result); - return indexQuery; - } -} +/* + * Copyright 2014 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.facet; + +import org.springframework.data.elasticsearch.core.query.IndexQuery; + +/** + * Simple type to test facets + * + * @author Artur Konczak + * @author Mohsin Husen + */ +public class ArticleEntityBuilder { + + private ArticleEntity result; + + public ArticleEntityBuilder(String id) { + result = new ArticleEntity(id); + } + + public ArticleEntityBuilder title(String title) { + result.setTitle(title); + return this; + } + + public ArticleEntityBuilder subject(String subject) { + result.setSubject(subject); + return this; + } + + public ArticleEntityBuilder addAuthor(String author) { + result.getAuthors().add(author); + return this; + } + + public ArticleEntityBuilder addPublishedYear(Integer year) { + result.getPublishedYears().add(year); + return this; + } + + public ArticleEntityBuilder score(int score) { + result.setScore(score); + return this; + } + + public ArticleEntity build() { + return result; + } + + public IndexQuery buildIndex() { + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(result.getId()); + indexQuery.setObject(result); + return indexQuery; + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntityTests.java b/src/test/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntityTests.java index b1cdf4f9d..281a1db9c 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntityTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntityTests.java @@ -1,109 +1,109 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.mapping; - -import java.beans.IntrospectionException; - -import org.junit.Test; -import org.springframework.data.annotation.Version; -import org.springframework.data.mapping.MappingException; -import org.springframework.data.mapping.model.Property; -import org.springframework.data.mapping.model.SimpleTypeHolder; -import org.springframework.data.util.ClassTypeInformation; -import org.springframework.data.util.TypeInformation; -import org.springframework.util.ReflectionUtils; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Mark Paluch - */ -public class SimpleElasticsearchPersistentEntityTests { - - @Test(expected = IllegalArgumentException.class) - public void shouldThrowExceptionGivenVersionPropertyIsNotLong() throws NoSuchFieldException, IntrospectionException { - // given - TypeInformation typeInformation = ClassTypeInformation.from(EntityWithWrongVersionType.class); - SimpleElasticsearchPersistentEntity entity = new SimpleElasticsearchPersistentEntity<>( - typeInformation); - - SimpleElasticsearchPersistentProperty persistentProperty = createProperty(entity, "version"); - - // when - entity.addPersistentProperty(persistentProperty); - } - - @Test(expected = MappingException.class) - public void shouldThrowExceptionGivenMultipleVersionPropertiesArePresent() - throws NoSuchFieldException, IntrospectionException { - // given - TypeInformation typeInformation = ClassTypeInformation.from(EntityWithMultipleVersionField.class); - SimpleElasticsearchPersistentEntity entity = new SimpleElasticsearchPersistentEntity<>( - typeInformation); - - SimpleElasticsearchPersistentProperty persistentProperty1 = createProperty(entity, "version1"); - - SimpleElasticsearchPersistentProperty persistentProperty2 = createProperty(entity, "version2"); - - entity.addPersistentProperty(persistentProperty1); - // when - entity.addPersistentProperty(persistentProperty2); - } - - private static SimpleElasticsearchPersistentProperty createProperty(SimpleElasticsearchPersistentEntity entity, - String field) { - - TypeInformation type = entity.getTypeInformation(); - Property property = Property.of(type, ReflectionUtils.findField(entity.getType(), field)); - return new SimpleElasticsearchPersistentProperty(property, entity, SimpleTypeHolder.DEFAULT); - - } - - private class EntityWithWrongVersionType { - - @Version private String version; - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - } - - private class EntityWithMultipleVersionField { - - @Version private Long version1; - @Version private Long version2; - - public Long getVersion1() { - return version1; - } - - public void setVersion1(Long version1) { - this.version1 = version1; - } - - public Long getVersion2() { - return version2; - } - - public void setVersion2(Long version2) { - this.version2 = version2; - } - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.mapping; + +import java.beans.IntrospectionException; + +import org.junit.Test; +import org.springframework.data.annotation.Version; +import org.springframework.data.mapping.MappingException; +import org.springframework.data.mapping.model.Property; +import org.springframework.data.mapping.model.SimpleTypeHolder; +import org.springframework.data.util.ClassTypeInformation; +import org.springframework.data.util.TypeInformation; +import org.springframework.util.ReflectionUtils; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Mark Paluch + */ +public class SimpleElasticsearchPersistentEntityTests { + + @Test(expected = IllegalArgumentException.class) + public void shouldThrowExceptionGivenVersionPropertyIsNotLong() throws NoSuchFieldException, IntrospectionException { + // given + TypeInformation typeInformation = ClassTypeInformation.from(EntityWithWrongVersionType.class); + SimpleElasticsearchPersistentEntity entity = new SimpleElasticsearchPersistentEntity<>( + typeInformation); + + SimpleElasticsearchPersistentProperty persistentProperty = createProperty(entity, "version"); + + // when + entity.addPersistentProperty(persistentProperty); + } + + @Test(expected = MappingException.class) + public void shouldThrowExceptionGivenMultipleVersionPropertiesArePresent() + throws NoSuchFieldException, IntrospectionException { + // given + TypeInformation typeInformation = ClassTypeInformation.from(EntityWithMultipleVersionField.class); + SimpleElasticsearchPersistentEntity entity = new SimpleElasticsearchPersistentEntity<>( + typeInformation); + + SimpleElasticsearchPersistentProperty persistentProperty1 = createProperty(entity, "version1"); + + SimpleElasticsearchPersistentProperty persistentProperty2 = createProperty(entity, "version2"); + + entity.addPersistentProperty(persistentProperty1); + // when + entity.addPersistentProperty(persistentProperty2); + } + + private static SimpleElasticsearchPersistentProperty createProperty(SimpleElasticsearchPersistentEntity entity, + String field) { + + TypeInformation type = entity.getTypeInformation(); + Property property = Property.of(type, ReflectionUtils.findField(entity.getType(), field)); + return new SimpleElasticsearchPersistentProperty(property, entity, SimpleTypeHolder.DEFAULT); + + } + + private class EntityWithWrongVersionType { + + @Version private String version; + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } + + private class EntityWithMultipleVersionField { + + @Version private Long version1; + @Version private Long version2; + + public Long getVersion1() { + return version1; + } + + public void setVersion1(Long version1) { + this.version1 = version1; + } + + public Long getVersion2() { + return version2; + } + + public void setVersion2(Long version2) { + this.version2 = version2; + } + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/query/CriteriaQueryTests.java b/src/test/java/org/springframework/data/elasticsearch/core/query/CriteriaQueryTests.java index 3f457b782..319973d34 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/query/CriteriaQueryTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/query/CriteriaQueryTests.java @@ -1,725 +1,725 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.core.query; - -import static org.apache.commons.lang.RandomStringUtils.*; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; -import static org.springframework.data.elasticsearch.utils.IndexBuilder.*; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.entities.SampleEntity; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - */ -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("classpath:elasticsearch-template-test.xml") -public class CriteriaQueryTests { - - @Autowired - private ElasticsearchTemplate elasticsearchTemplate; - - @Before - public void before() { - elasticsearchTemplate.deleteIndex(SampleEntity.class); - elasticsearchTemplate.createIndex(SampleEntity.class); - elasticsearchTemplate.putMapping(SampleEntity.class); - elasticsearchTemplate.refresh(SampleEntity.class); - } - - @Test - public void shouldPerformAndOperation() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some test message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("test").and("message") - .contains("some")); - // when - SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); - // then - assertThat(sampleEntity1, is(notNullValue())); - } - - @Ignore("DATAES-30") - @Test - public void shouldPerformOrOperation() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setMessage("some message"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("test message"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - - indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("some").or("message") - .contains("test")); - // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Test - public void shouldPerformAndOperationWithinCriteria() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - indexQueries.add(indexQuery); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria().and(new Criteria("message").contains("some"))); - // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Ignore("DATAES-30") - @Test - public void shouldPerformOrOperationWithinCriteria() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - indexQueries.add(indexQuery); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria().or(new Criteria("message").contains("some"))); - // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Test - public void shouldPerformIsOperation() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - indexQueries.add(indexQuery); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("some message")); - // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); - // then - assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); - assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Test - public void shouldPerformMultipleIsOperations() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setMessage("some message"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("test message"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("some message")); - // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); - // then - assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldPerformEndsWithOperation() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setMessage("some message"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("test message end"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - Criteria criteria = new Criteria("message").endsWith("end"); - CriteriaQuery criteriaQuery = new CriteriaQuery(criteria); - // when - SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); - // then - assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); - assertThat(sampleEntity, is(notNullValue())); - } - - @Test - public void shouldPerformStartsWithOperation() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setMessage("start some message"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("test message"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - Criteria criteria = new Criteria("message").startsWith("start"); - CriteriaQuery criteriaQuery = new CriteriaQuery(criteria); - // when - SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); - // then - assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); - assertThat(sampleEntity, is(notNullValue())); - } - - @Test - public void shouldPerformContainsOperation() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setMessage("contains some message"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("test message"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("contains")); - // when - SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); - // then - assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); - assertThat(sampleEntity, is(notNullValue())); - } - - @Test - public void shouldExecuteExpression() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setMessage("elasticsearch search"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("test message"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").expression("+elasticsearch || test")); - // when - SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); - // then - assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); - assertThat(sampleEntity, is(notNullValue())); - } - - @Test - public void shouldExecuteCriteriaChain() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setMessage("some message search"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("test test message"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").startsWith("some").endsWith("search") - .contains("message").is("some message search")); - // when - SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); - // then - assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); - assertThat(sampleEntity, is(notNullValue())); - } - - @Test - public void shouldPerformIsNotOperation() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setMessage("bar"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("foo"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("foo").not()); - // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); - // then - assertTrue(criteriaQuery.getCriteria().isNegating()); - assertThat(page, is(notNullValue())); - assertFalse(page.iterator().next().getMessage().contains("foo")); - } - - @Test - public void shouldPerformBetweenOperation() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setRate(100); - sampleEntity1.setMessage("bar"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setRate(200); - sampleEntity2.setMessage("foo"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(100, 150)); - // when - SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); - // then - assertThat(sampleEntity, is(notNullValue())); - } - - @Test - public void shouldPerformBetweenOperationWithoutUpperBound() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setRate(300); - sampleEntity1.setMessage("bar"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setRate(400); - sampleEntity2.setMessage("foo"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(350, null)); - // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Test - public void shouldPerformBetweenOperationWithoutLowerBound() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setRate(500); - sampleEntity1.setMessage("bar"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setRate(600); - sampleEntity2.setMessage("foo"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(null, 550)); - // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Test - public void shouldPerformLessThanEqualOperation() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setRate(700); - sampleEntity1.setMessage("bar"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setRate(800); - sampleEntity2.setMessage("foo"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").lessThanEqual(750)); - // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Test - public void shouldPerformGreaterThanEquals() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setRate(900); - sampleEntity1.setMessage("bar"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setRate(1000); - sampleEntity2.setMessage("foo"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").greaterThanEqual(950)); - // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Test - public void shouldPerformBoostOperation() { - // given - List indexQueries = new ArrayList<>(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setRate(700); - sampleEntity1.setMessage("bar foo"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - indexQueries.add(indexQuery1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setRate(800); - sampleEntity2.setMessage("foo"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("foo").boost(1)); - // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); - // then - assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Test - public void shouldReturnDocumentAboveMinimalScoreGivenCriteria() { - // given - List indexQueries = new ArrayList<>(); - - indexQueries.add(buildIndex(SampleEntity.builder().id("1").message("ab").build())); - indexQueries.add(buildIndex(SampleEntity.builder().id("2").message("bc").build())); - indexQueries.add(buildIndex(SampleEntity.builder().id("3").message("ac").build())); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class); - - // when - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("a").or(new Criteria("message").contains("b"))); - criteriaQuery.setMinScore(2.0F); - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); - // then - assertThat(page.getTotalElements(), is(1L)); - assertThat(page.getContent().get(0).getMessage(), is("ab")); - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.core.query; + +import static org.apache.commons.lang.RandomStringUtils.*; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; +import static org.springframework.data.elasticsearch.utils.IndexBuilder.*; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.entities.SampleEntity; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:elasticsearch-template-test.xml") +public class CriteriaQueryTests { + + @Autowired + private ElasticsearchTemplate elasticsearchTemplate; + + @Before + public void before() { + elasticsearchTemplate.deleteIndex(SampleEntity.class); + elasticsearchTemplate.createIndex(SampleEntity.class); + elasticsearchTemplate.putMapping(SampleEntity.class); + elasticsearchTemplate.refresh(SampleEntity.class); + } + + @Test + public void shouldPerformAndOperation() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some test message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("test").and("message") + .contains("some")); + // when + SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + // then + assertThat(sampleEntity1, is(notNullValue())); + } + + @Ignore("DATAES-30") + @Test + public void shouldPerformOrOperation() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("some message"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("test message"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + + indexQueries.add(indexQuery2); + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("some").or("message") + .contains("test")); + // when + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Test + public void shouldPerformAndOperationWithinCriteria() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + indexQueries.add(indexQuery); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria().and(new Criteria("message").contains("some"))); + // when + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Ignore("DATAES-30") + @Test + public void shouldPerformOrOperationWithinCriteria() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + indexQueries.add(indexQuery); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria().or(new Criteria("message").contains("some"))); + // when + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Test + public void shouldPerformIsOperation() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + indexQueries.add(indexQuery); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("some message")); + // when + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + // then + assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); + assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Test + public void shouldPerformMultipleIsOperations() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("some message"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("test message"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("some message")); + // when + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + // then + assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldPerformEndsWithOperation() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("some message"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("test message end"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + Criteria criteria = new Criteria("message").endsWith("end"); + CriteriaQuery criteriaQuery = new CriteriaQuery(criteria); + // when + SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + // then + assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); + assertThat(sampleEntity, is(notNullValue())); + } + + @Test + public void shouldPerformStartsWithOperation() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("start some message"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("test message"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + Criteria criteria = new Criteria("message").startsWith("start"); + CriteriaQuery criteriaQuery = new CriteriaQuery(criteria); + // when + SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + // then + assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); + assertThat(sampleEntity, is(notNullValue())); + } + + @Test + public void shouldPerformContainsOperation() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("contains some message"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("test message"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("contains")); + // when + SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + // then + assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); + assertThat(sampleEntity, is(notNullValue())); + } + + @Test + public void shouldExecuteExpression() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("elasticsearch search"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("test message"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").expression("+elasticsearch || test")); + // when + SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + // then + assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); + assertThat(sampleEntity, is(notNullValue())); + } + + @Test + public void shouldExecuteCriteriaChain() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("some message search"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("test test message"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").startsWith("some").endsWith("search") + .contains("message").is("some message search")); + // when + SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + // then + assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); + assertThat(sampleEntity, is(notNullValue())); + } + + @Test + public void shouldPerformIsNotOperation() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("bar"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("foo"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("foo").not()); + // when + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + // then + assertTrue(criteriaQuery.getCriteria().isNegating()); + assertThat(page, is(notNullValue())); + assertFalse(page.iterator().next().getMessage().contains("foo")); + } + + @Test + public void shouldPerformBetweenOperation() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setRate(100); + sampleEntity1.setMessage("bar"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setRate(200); + sampleEntity2.setMessage("foo"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(100, 150)); + // when + SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + // then + assertThat(sampleEntity, is(notNullValue())); + } + + @Test + public void shouldPerformBetweenOperationWithoutUpperBound() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setRate(300); + sampleEntity1.setMessage("bar"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setRate(400); + sampleEntity2.setMessage("foo"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(350, null)); + // when + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Test + public void shouldPerformBetweenOperationWithoutLowerBound() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setRate(500); + sampleEntity1.setMessage("bar"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setRate(600); + sampleEntity2.setMessage("foo"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(null, 550)); + // when + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Test + public void shouldPerformLessThanEqualOperation() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setRate(700); + sampleEntity1.setMessage("bar"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setRate(800); + sampleEntity2.setMessage("foo"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").lessThanEqual(750)); + // when + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Test + public void shouldPerformGreaterThanEquals() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setRate(900); + sampleEntity1.setMessage("bar"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setRate(1000); + sampleEntity2.setMessage("foo"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").greaterThanEqual(950)); + // when + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Test + public void shouldPerformBoostOperation() { + // given + List indexQueries = new ArrayList<>(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setRate(700); + sampleEntity1.setMessage("bar foo"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setRate(800); + sampleEntity2.setMessage("foo"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + indexQueries.add(indexQuery2); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("foo").boost(1)); + // when + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + // then + assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Test + public void shouldReturnDocumentAboveMinimalScoreGivenCriteria() { + // given + List indexQueries = new ArrayList<>(); + + indexQueries.add(buildIndex(SampleEntity.builder().id("1").message("ab").build())); + indexQueries.add(buildIndex(SampleEntity.builder().id("2").message("bc").build())); + indexQueries.add(buildIndex(SampleEntity.builder().id("3").message("ac").build())); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class); + + // when + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("a").or(new Criteria("message").contains("b"))); + criteriaQuery.setMinScore(2.0F); + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + // then + assertThat(page.getTotalElements(), is(1L)); + assertThat(page.getContent().get(0).getMessage(), is("ab")); + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/entities/Author.java b/src/test/java/org/springframework/data/elasticsearch/entities/Author.java index 7f6276d6b..5507385e5 100644 --- a/src/test/java/org/springframework/data/elasticsearch/entities/Author.java +++ b/src/test/java/org/springframework/data/elasticsearch/entities/Author.java @@ -1,42 +1,42 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.entities; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - */ -public class Author { - - private String id; - private String name; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.entities; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public class Author { + + private String id; + private String name; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/entities/Book.java b/src/test/java/org/springframework/data/elasticsearch/entities/Book.java index 8a6d15840..15179a89b 100644 --- a/src/test/java/org/springframework/data/elasticsearch/entities/Book.java +++ b/src/test/java/org/springframework/data/elasticsearch/entities/Book.java @@ -1,52 +1,52 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.entities; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -import org.springframework.data.annotation.Id; -import org.springframework.data.elasticsearch.annotations.Document; -import org.springframework.data.elasticsearch.annotations.Field; -import org.springframework.data.elasticsearch.annotations.FieldType; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - */ -@Setter -@Getter -@NoArgsConstructor -@AllArgsConstructor -@Builder -@Document(indexName = "test-index-book", type = "book", shards = 1, replicas = 0, refreshInterval = "-1") -public class Book { - - @Id - private String id; - private String name; - @Field(type = FieldType.Object) - private Author author; - @Field(type = FieldType.Nested) - private Map> buckets = new HashMap<>(); -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.entities; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + */ +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Document(indexName = "test-index-book", type = "book", shards = 1, replicas = 0, refreshInterval = "-1") +public class Book { + + @Id + private String id; + private String name; + @Field(type = FieldType.Object) + private Author author; + @Field(type = FieldType.Nested) + private Map> buckets = new HashMap<>(); +} diff --git a/src/test/java/org/springframework/data/elasticsearch/entities/GirlFriend.java b/src/test/java/org/springframework/data/elasticsearch/entities/GirlFriend.java index 7977c3539..9613678ca 100644 --- a/src/test/java/org/springframework/data/elasticsearch/entities/GirlFriend.java +++ b/src/test/java/org/springframework/data/elasticsearch/entities/GirlFriend.java @@ -1,59 +1,59 @@ -/* - * Copyright 2014 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.entities; - -import java.util.List; - -import org.springframework.data.elasticsearch.annotations.Field; -import org.springframework.data.elasticsearch.annotations.FieldType; - -/** - * @author Mohsin Husen - */ - -public class GirlFriend { - - private String name; - - private String type; - - @Field(type = FieldType.Nested) - private List cars; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public List getCars() { - return cars; - } - - public void setCars(List cars) { - this.cars = cars; - } -} +/* + * Copyright 2014 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.entities; + +import java.util.List; + +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +/** + * @author Mohsin Husen + */ + +public class GirlFriend { + + private String name; + + private String type; + + @Field(type = FieldType.Nested) + private List cars; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getCars() { + return cars; + } + + public void setCars(List cars) { + this.cars = cars; + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/entities/NonDocumentEntity.java b/src/test/java/org/springframework/data/elasticsearch/entities/NonDocumentEntity.java index 4547ac7e0..7391fb8fb 100644 --- a/src/test/java/org/springframework/data/elasticsearch/entities/NonDocumentEntity.java +++ b/src/test/java/org/springframework/data/elasticsearch/entities/NonDocumentEntity.java @@ -1,46 +1,46 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.entities; - -import org.springframework.data.annotation.Id; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - */ -public class NonDocumentEntity { - - @Id - private String someId; - private String someField1; - private String someField2; - - public String getSomeField1() { - return someField1; - } - - public void setSomeField1(String someField1) { - this.someField1 = someField1; - } - - public String getSomeField2() { - return someField2; - } - - public void setSomeField2(String someField2) { - this.someField2 = someField2; - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.entities; + +import org.springframework.data.annotation.Id; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public class NonDocumentEntity { + + @Id + private String someId; + private String someField1; + private String someField2; + + public String getSomeField1() { + return someField1; + } + + public void setSomeField1(String someField1) { + this.someField1 = someField1; + } + + public String getSomeField2() { + return someField2; + } + + public void setSomeField2(String someField2) { + this.someField2 = someField2; + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/entities/PersonMultipleLevelNested.java b/src/test/java/org/springframework/data/elasticsearch/entities/PersonMultipleLevelNested.java index 5ae80043c..c37b88e6f 100644 --- a/src/test/java/org/springframework/data/elasticsearch/entities/PersonMultipleLevelNested.java +++ b/src/test/java/org/springframework/data/elasticsearch/entities/PersonMultipleLevelNested.java @@ -1,88 +1,88 @@ -/* - * Copyright 2014 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.entities; - - -import java.util.List; - -import org.springframework.data.annotation.Id; -import org.springframework.data.elasticsearch.annotations.Document; -import org.springframework.data.elasticsearch.annotations.Field; -import org.springframework.data.elasticsearch.annotations.FieldType; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - */ - -@Document(indexName = "test-index-person-multiple-level-nested", type = "user", shards = 1, replicas = 0, refreshInterval = "-1") -public class PersonMultipleLevelNested { - - @Id - private String id; - - private String name; - - @Field(type = FieldType.Nested) - private List girlFriends; - - @Field(type = FieldType.Nested) - private List cars; - - @Field(type = FieldType.Nested, includeInParent = true) - private List bestCars; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getGirlFriends() { - return girlFriends; - } - - public void setGirlFriends(List girlFriends) { - this.girlFriends = girlFriends; - } - - public List getCars() { - return cars; - } - - public void setCars(List cars) { - this.cars = cars; - } - - public List getBestCars() { - return bestCars; - } - - public void setBestCars(List bestCars) { - this.bestCars = bestCars; - } -} +/* + * Copyright 2014 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.entities; + + +import java.util.List; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Artur Konczak + */ + +@Document(indexName = "test-index-person-multiple-level-nested", type = "user", shards = 1, replicas = 0, refreshInterval = "-1") +public class PersonMultipleLevelNested { + + @Id + private String id; + + private String name; + + @Field(type = FieldType.Nested) + private List girlFriends; + + @Field(type = FieldType.Nested) + private List cars; + + @Field(type = FieldType.Nested, includeInParent = true) + private List bestCars; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getGirlFriends() { + return girlFriends; + } + + public void setGirlFriends(List girlFriends) { + this.girlFriends = girlFriends; + } + + public List getCars() { + return cars; + } + + public void setCars(List cars) { + this.cars = cars; + } + + public List getBestCars() { + return bestCars; + } + + public void setBestCars(List bestCars) { + this.bestCars = bestCars; + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/entities/Product.java b/src/test/java/org/springframework/data/elasticsearch/entities/Product.java index 26b567490..352a4038e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/entities/Product.java +++ b/src/test/java/org/springframework/data/elasticsearch/entities/Product.java @@ -1,97 +1,97 @@ -/* - * Copyright 2014 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.entities; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.Date; -import java.util.List; - -import org.springframework.data.annotation.Id; -import org.springframework.data.elasticsearch.annotations.Document; -import org.springframework.data.elasticsearch.annotations.Field; -import org.springframework.data.elasticsearch.annotations.FieldType; - -/** - * @author Mohsin Husen - * @author Artur Konczak - */ -@Setter -@Getter -@NoArgsConstructor -@AllArgsConstructor -@Builder -@Document(indexName = "test-index-product", type = "test-product-type", shards = 1, replicas = 0, refreshInterval = "-1") -public class Product { - - @Id - private String id; - - private List title; - - private String name; - - private String description; - - private String text; - - private List categories; - - private Float weight; - - @Field(type = FieldType.Float) - private Float price; - - private Integer popularity; - - private boolean available; - - private String location; - - private Date lastModified; - - - @Override - public int hashCode() { - return id.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - Product other = (Product) obj; - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } - return true; - } -} +/* + * Copyright 2014 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.entities; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.Date; +import java.util.List; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +/** + * @author Mohsin Husen + * @author Artur Konczak + */ +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Document(indexName = "test-index-product", type = "test-product-type", shards = 1, replicas = 0, refreshInterval = "-1") +public class Product { + + @Id + private String id; + + private List title; + + private String name; + + private String description; + + private String text; + + private List categories; + + private Float weight; + + @Field(type = FieldType.Float) + private Float price; + + private Integer popularity; + + private boolean available; + + private String location; + + private Date lastModified; + + + @Override + public int hashCode() { + return id.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Product other = (Product) obj; + if (id == null) { + if (other.id != null) { + return false; + } + } else if (!id.equals(other.id)) { + return false; + } + return true; + } +} 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 4fc2a1975..b0147b639 100644 --- a/src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java +++ b/src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java @@ -1,96 +1,96 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.entities; - -import java.lang.Double; -import java.lang.Long; -import java.lang.Object; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -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.Field; -import org.springframework.data.elasticsearch.annotations.ScriptedField; -import org.springframework.data.elasticsearch.core.geo.GeoPoint; -import static org.springframework.data.elasticsearch.annotations.FieldType.*; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - */ - -@Setter -@Getter -@NoArgsConstructor -@AllArgsConstructor -@Builder -@Document(indexName = "test-index-sample", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1") -public class SampleEntity { - - @Id - private String id; - @Field(type = text, store = true, fielddata = true) - private String type; - @Field(type = text, store = true, fielddata = true) - private String message; - private int rate; - @ScriptedField - private Double scriptedRate; - private boolean available; - private String highlightedMessage; - - private GeoPoint location; - - @Version - private Long version; - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - SampleEntity that = (SampleEntity) o; - - if (available != that.available) return false; - if (rate != that.rate) return false; - if (highlightedMessage != null ? !highlightedMessage.equals(that.highlightedMessage) : that.highlightedMessage != null) - return false; - if (id != null ? !id.equals(that.id) : that.id != null) return false; - if (location != null ? !location.equals(that.location) : that.location != null) return false; - if (message != null ? !message.equals(that.message) : that.message != null) return false; - if (type != null ? !type.equals(that.type) : that.type != null) return false; - if (version != null ? !version.equals(that.version) : that.version != null) return false; - - return true; - } - - @Override - public int hashCode() { - int result = id != null ? id.hashCode() : 0; - result = 31 * result + (type != null ? type.hashCode() : 0); - result = 31 * result + (message != null ? message.hashCode() : 0); - result = 31 * result + rate; - result = 31 * result + (available ? 1 : 0); - result = 31 * result + (highlightedMessage != null ? highlightedMessage.hashCode() : 0); - result = 31 * result + (location != null ? location.hashCode() : 0); - result = 31 * result + (version != null ? version.hashCode() : 0); - return result; - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.entities; + +import java.lang.Double; +import java.lang.Long; +import java.lang.Object; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +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.Field; +import org.springframework.data.elasticsearch.annotations.ScriptedField; +import org.springframework.data.elasticsearch.core.geo.GeoPoint; +import static org.springframework.data.elasticsearch.annotations.FieldType.*; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + */ + +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Document(indexName = "test-index-sample", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1") +public class SampleEntity { + + @Id + private String id; + @Field(type = text, store = true, fielddata = true) + private String type; + @Field(type = text, store = true, fielddata = true) + private String message; + private int rate; + @ScriptedField + private Double scriptedRate; + private boolean available; + private String highlightedMessage; + + private GeoPoint location; + + @Version + private Long version; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + SampleEntity that = (SampleEntity) o; + + if (available != that.available) return false; + if (rate != that.rate) return false; + if (highlightedMessage != null ? !highlightedMessage.equals(that.highlightedMessage) : that.highlightedMessage != null) + return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + if (location != null ? !location.equals(that.location) : that.location != null) return false; + if (message != null ? !message.equals(that.message) : that.message != null) return false; + if (type != null ? !type.equals(that.type) : that.type != null) return false; + if (version != null ? !version.equals(that.version) : that.version != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = id != null ? id.hashCode() : 0; + result = 31 * result + (type != null ? type.hashCode() : 0); + result = 31 * result + (message != null ? message.hashCode() : 0); + result = 31 * result + rate; + result = 31 * result + (available ? 1 : 0); + result = 31 * result + (highlightedMessage != null ? highlightedMessage.hashCode() : 0); + result = 31 * result + (location != null ? location.hashCode() : 0); + result = 31 * result + (version != null ? version.hashCode() : 0); + return result; + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/entities/SampleMappingEntity.java b/src/test/java/org/springframework/data/elasticsearch/entities/SampleMappingEntity.java index eea050476..ce0ced54e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/entities/SampleMappingEntity.java +++ b/src/test/java/org/springframework/data/elasticsearch/entities/SampleMappingEntity.java @@ -1,68 +1,68 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.entities; - -import static org.springframework.data.elasticsearch.annotations.FieldType.text; - -import org.springframework.data.annotation.Id; -import org.springframework.data.elasticsearch.annotations.Document; -import org.springframework.data.elasticsearch.annotations.Field; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - */ -@Document(indexName = "test-index-sample-mapping", type = "mapping", shards = 1, replicas = 0, refreshInterval = "-1") -public class SampleMappingEntity { - - @Id - private String id; - - @Field(type = text, index = false, store = true, analyzer = "standard") - private String message; - - private NestedEntity nested; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - static class NestedEntity { - - @Field(type = text) - private String someField; - - public String getSomeField() { - return someField; - } - - public void setSomeField(String someField) { - this.someField = someField; - } - } -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.entities; + +import static org.springframework.data.elasticsearch.annotations.FieldType.text; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + */ +@Document(indexName = "test-index-sample-mapping", type = "mapping", shards = 1, replicas = 0, refreshInterval = "-1") +public class SampleMappingEntity { + + @Id + private String id; + + @Field(type = text, index = false, store = true, analyzer = "standard") + private String message; + + private NestedEntity nested; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + static class NestedEntity { + + @Field(type = text) + private String someField; + + public String getSomeField() { + return someField; + } + + public void setSomeField(String someField) { + this.someField = someField; + } + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTests.java b/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTests.java index a48e1bc8a..d890b4a05 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTests.java @@ -1,1212 +1,1212 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repositories; - -import static org.apache.commons.lang.RandomStringUtils.*; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Stream; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.geo.GeoPoint; -import org.springframework.data.elasticsearch.entities.SampleEntity; -import org.springframework.data.elasticsearch.repositories.custom.SampleCustomMethodRepository; -import org.springframework.data.geo.Box; -import org.springframework.data.geo.Distance; -import org.springframework.data.geo.Metrics; -import org.springframework.data.geo.Point; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Franck Marchand - * @author Kevin Leturc - * @author Christoph Strobl - */ -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("classpath:custom-method-repository-test.xml") -public class CustomMethodRepositoryTests { - - @Autowired private SampleCustomMethodRepository repository; - - @Autowired private ElasticsearchTemplate elasticsearchTemplate; - - @Before - public void before() { - elasticsearchTemplate.deleteIndex(SampleEntity.class); - elasticsearchTemplate.createIndex(SampleEntity.class); - elasticsearchTemplate.putMapping(SampleEntity.class); - elasticsearchTemplate.refresh(SampleEntity.class); - } - - @Test - public void shouldExecuteCustomMethod() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setMessage("some message"); - repository.save(sampleEntity); - // when - Page page = repository.findByType("test", new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodForNot() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("some"); - sampleEntity.setMessage("some message"); - repository.save(sampleEntity); - // when - Page page = repository.findByTypeNot("test", new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodWithQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - String searchTerm = "customQuery"; - sampleEntity.setMessage(searchTerm); - repository.save(sampleEntity); - // when - Page page = repository.findByMessage(searchTerm.toLowerCase(), new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodWithLessThan() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(9); - sampleEntity.setMessage("some message"); - repository.save(sampleEntity); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setType("test"); - sampleEntity2.setRate(20); - sampleEntity2.setMessage("some message"); - repository.save(sampleEntity2); - - // when - Page page = repository.findByRateLessThan(10, new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodWithBefore() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("some message"); - repository.save(sampleEntity); - - // when - Page page = repository.findByRateBefore(10, new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodWithAfter() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("some message"); - repository.save(sampleEntity); - - // when - Page page = repository.findByRateAfter(10, new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodWithLike() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - repository.save(sampleEntity); - - // when - Page page = repository.findByMessageLike("fo", new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodForStartingWith() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - repository.save(sampleEntity); - - // when - Page page = repository.findByMessageStartingWith("fo", new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodForEndingWith() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - repository.save(sampleEntity); - - // when - Page page = repository.findByMessageEndingWith("o", new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodForContains() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - repository.save(sampleEntity); - - // when - Page page = repository.findByMessageContaining("fo", new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodForIn() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setMessage("foo"); - repository.save(sampleEntity); - - // given - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setType("test"); - sampleEntity2.setMessage("bar"); - repository.save(sampleEntity2); - - List ids = Arrays.asList(documentId, documentId2); - - // when - Page page = repository.findByIdIn(ids, new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(2L))); - } - - @Test - public void shouldExecuteCustomMethodForNotIn() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setMessage("foo"); - repository.save(sampleEntity); - - // given - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setType("test"); - sampleEntity2.setMessage("bar"); - repository.save(sampleEntity2); - - List ids = Arrays.asList(documentId); - - // when - Page page = repository.findByIdNotIn(ids, new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - assertThat(page.getContent().get(0).getId(), is(documentId2)); - } - - @Test - public void shouldExecuteCustomMethodForTrue() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setMessage("foo"); - sampleEntity.setAvailable(true); - repository.save(sampleEntity); - - // given - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setType("test"); - sampleEntity2.setMessage("bar"); - sampleEntity2.setAvailable(false); - repository.save(sampleEntity2); - // when - Page page = repository.findByAvailableTrue(new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodForFalse() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setMessage("foo"); - sampleEntity.setAvailable(true); - repository.save(sampleEntity); - - // given - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setType("test"); - sampleEntity2.setMessage("bar"); - sampleEntity2.setAvailable(false); - repository.save(sampleEntity2); - // when - Page page = repository.findByAvailableFalse(new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodForOrderBy() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("abc"); - sampleEntity.setMessage("test"); - sampleEntity.setAvailable(true); - repository.save(sampleEntity); - - // document 2 - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setType("xyz"); - sampleEntity2.setMessage("bar"); - sampleEntity2.setAvailable(false); - repository.save(sampleEntity2); - - // document 3 - String documentId3 = randomNumeric(5); - SampleEntity sampleEntity3 = new SampleEntity(); - sampleEntity3.setId(documentId3); - sampleEntity3.setType("def"); - sampleEntity3.setMessage("foo"); - sampleEntity3.setAvailable(false); - repository.save(sampleEntity3); - - // when - Page page = repository.findByMessageOrderByTypeAsc("foo", new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodWithBooleanParameter() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setMessage("foo"); - sampleEntity.setAvailable(true); - repository.save(sampleEntity); - - // given - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setType("test"); - sampleEntity2.setMessage("bar"); - sampleEntity2.setAvailable(false); - repository.save(sampleEntity2); - // when - Page page = repository.findByAvailable(false, new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldReturnPageableResultsWithQueryAnnotationExpectedPageSize() { - // given - for (int i = 0; i < 30; i++) { - String documentId = String.valueOf(i); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("message"); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity); - } - // when - Page pageResult = repository.findByMessage("message", new PageRequest(0, 23)); - // then - assertThat(pageResult.getTotalElements(), is(equalTo(30L))); - assertThat(pageResult.getContent().size(), is(equalTo(23))); - } - - @Test - public void shouldReturnPageableResultsWithGivenSortingOrder() { - // given - String documentId = random(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("abc"); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("abd"); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity2); - - String documentId3 = randomNumeric(5); - SampleEntity sampleEntity3 = new SampleEntity(); - sampleEntity3.setId(documentId3); - sampleEntity3.setMessage("abe"); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity3); - // when - Page pageResult = repository.findByMessageContaining("a", - new PageRequest(0, 23, new Sort(new Sort.Order(Sort.Direction.DESC, "message")))); - // then - assertThat(pageResult.getContent().isEmpty(), is(false)); - assertThat(pageResult.getContent().get(0).getMessage(), is(sampleEntity3.getMessage())); - } - - @Test - public void shouldReturnListForMessage() { - // given - String documentId = random(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("abc"); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("abd"); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity2); - - String documentId3 = randomNumeric(5); - SampleEntity sampleEntity3 = new SampleEntity(); - sampleEntity3.setId(documentId3); - sampleEntity3.setMessage("abe"); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity3); - // when - List sampleEntities = repository.findByMessage("abc"); - // then - assertThat(sampleEntities.isEmpty(), is(false)); - assertThat(sampleEntities.size(), is(1)); - } - - @Test - public void shouldExecuteCustomMethodWithGeoPoint() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); - - repository.save(sampleEntity); - - // when - Page page = repository.findByLocation(new GeoPoint(45.7806d, 3.0875d), new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodWithGeoPointAndString() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); - - repository.save(sampleEntity); - - documentId = randomNumeric(5); - sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - sampleEntity.setLocation(new GeoPoint(48.7806d, 3.0875d)); - - repository.save(sampleEntity); - - // when - Page page = repository.findByLocationAndMessage(new GeoPoint(45.7806d, 3.0875d), "foo", - new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodWithWithinGeoPoint() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); - - repository.save(sampleEntity); - - // when - Page page = repository.findByLocationWithin(new GeoPoint(45.7806d, 3.0875d), "2km", - new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodWithWithinPoint() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); - - repository.save(sampleEntity); - - // when - Page page = repository.findByLocationWithin(new Point(45.7806d, 3.0875d), - new Distance(2, Metrics.KILOMETERS), new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodWithNearBox() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); - - repository.save(sampleEntity); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setType("test2"); - sampleEntity2.setRate(10); - sampleEntity2.setMessage("foo"); - sampleEntity2.setLocation(new GeoPoint(30.7806d, 0.0875d)); - - repository.save(sampleEntity2); - - // when - Page pageAll = repository.findAll(new PageRequest(0, 10)); - // then - assertThat(pageAll, is(notNullValue())); - assertThat(pageAll.getTotalElements(), is(equalTo(2L))); - - // when - Page page = repository.findByLocationNear(new Box(new Point(46d, 3d), new Point(45d, 4d)), - new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - @Test - public void shouldExecuteCustomMethodWithNearPointAndDistance() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); - - repository.save(sampleEntity); - - // when - Page page = repository.findByLocationNear(new Point(45.7806d, 3.0875d), - new Distance(2, Metrics.KILOMETERS), new PageRequest(0, 10)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - } - - /* - DATAES-165 - */ - @Test - public void shouldAllowReturningJava8StreamInCustomQuery() { - // given - List entities = createSampleEntities("abc", 30); - repository.saveAll(entities); - - // when - Stream stream = repository.findByType("abc"); - // then - assertThat(stream, is(notNullValue())); - assertThat(stream.count(), is(equalTo(30L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethod() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setMessage("some message"); - - repository.save(sampleEntity); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setType("test2"); - sampleEntity2.setMessage("some message"); - - repository.save(sampleEntity2); - - // when - long count = repository.countByType("test"); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodForNot() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("some"); - sampleEntity.setMessage("some message"); - - repository.save(sampleEntity); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setType("test"); - sampleEntity2.setMessage("some message"); - - repository.save(sampleEntity2); - - // when - long count = repository.countByTypeNot("test"); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodWithBooleanParameter() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setMessage("foo"); - sampleEntity.setAvailable(true); - repository.save(sampleEntity); - - // given - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setType("test"); - sampleEntity2.setMessage("bar"); - sampleEntity2.setAvailable(false); - repository.save(sampleEntity2); - // when - long count = repository.countByAvailable(false); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodWithLessThan() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(9); - sampleEntity.setMessage("some message"); - repository.save(sampleEntity); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setType("test"); - sampleEntity2.setRate(20); - sampleEntity2.setMessage("some message"); - repository.save(sampleEntity2); - - // when - long count = repository.countByRateLessThan(10); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodWithBefore() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("some message"); - - repository.save(sampleEntity); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setType("test"); - sampleEntity2.setRate(20); - sampleEntity2.setMessage("some message"); - - repository.save(sampleEntity2); - - // when - long count = repository.countByRateBefore(10); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodWithAfter() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("some message"); - - repository.save(sampleEntity); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setType("test"); - sampleEntity2.setRate(0); - sampleEntity2.setMessage("some message"); - - repository.save(sampleEntity2); - - // when - long count = repository.countByRateAfter(10); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodWithLike() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - - repository.save(sampleEntity); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setType("test"); - sampleEntity2.setRate(10); - sampleEntity2.setMessage("some message"); - - repository.save(sampleEntity2); - - // when - long count = repository.countByMessageLike("fo"); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodForStartingWith() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - - repository.save(sampleEntity); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setType("test"); - sampleEntity2.setRate(10); - sampleEntity2.setMessage("some message"); - - repository.save(sampleEntity2); - - // when - long count = repository.countByMessageStartingWith("fo"); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodForEndingWith() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - - repository.save(sampleEntity); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setType("test"); - sampleEntity2.setRate(10); - sampleEntity2.setMessage("some message"); - - repository.save(sampleEntity2); - - // when - long count = repository.countByMessageEndingWith("o"); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodForContains() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - - repository.save(sampleEntity); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setType("test"); - sampleEntity2.setRate(10); - sampleEntity2.setMessage("some message"); - - repository.save(sampleEntity2); - - // when - long count = repository.countByMessageContaining("fo"); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodForIn() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setMessage("foo"); - repository.save(sampleEntity); - - // given - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setType("test"); - sampleEntity2.setMessage("bar"); - repository.save(sampleEntity2); - - List ids = Arrays.asList(documentId, documentId2); - - // when - long count = repository.countByIdIn(ids); - // then - assertThat(count, is(equalTo(2L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodForNotIn() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setMessage("foo"); - repository.save(sampleEntity); - - // given - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setType("test"); - sampleEntity2.setMessage("bar"); - repository.save(sampleEntity2); - - List ids = Arrays.asList(documentId); - - // when - long count = repository.countByIdNotIn(ids); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodForTrue() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setMessage("foo"); - sampleEntity.setAvailable(true); - repository.save(sampleEntity); - - // given - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setType("test"); - sampleEntity2.setMessage("bar"); - sampleEntity2.setAvailable(false); - repository.save(sampleEntity2); - // when - long count = repository.countByAvailableTrue(); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodForFalse() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setMessage("foo"); - sampleEntity.setAvailable(true); - repository.save(sampleEntity); - - // given - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setType("test"); - sampleEntity2.setMessage("bar"); - sampleEntity2.setAvailable(false); - repository.save(sampleEntity2); - // when - long count = repository.countByAvailableFalse(); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodWithWithinGeoPoint() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); - - repository.save(sampleEntity); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setType("test"); - sampleEntity2.setRate(10); - sampleEntity2.setMessage("foo"); - sampleEntity2.setLocation(new GeoPoint(30.7806d, 0.0875d)); - - repository.save(sampleEntity2); - - // when - long count = repository.countByLocationWithin(new GeoPoint(45.7806d, 3.0875d), "2km"); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodWithWithinPoint() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); - - repository.save(sampleEntity); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setType("test"); - sampleEntity2.setRate(10); - sampleEntity2.setMessage("foo"); - sampleEntity2.setLocation(new GeoPoint(30.7806d, 0.0875d)); - - repository.save(sampleEntity2); - - // when - long count = repository.countByLocationWithin(new Point(45.7806d, 3.0875d), new Distance(2, Metrics.KILOMETERS)); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodWithNearBox() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); - - repository.save(sampleEntity); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setType("test2"); - sampleEntity2.setRate(10); - sampleEntity2.setMessage("foo"); - sampleEntity2.setLocation(new GeoPoint(30.7806d, 0.0875d)); - - repository.save(sampleEntity2); - - // when - long count = repository.countByLocationNear(new Box(new Point(46d, 3d), new Point(45d, 4d))); - // then - assertThat(count, is(equalTo(1L))); - } - - /* - DATAES-106 - */ - @Test - public void shouldCountCustomMethodWithNearPointAndDistance() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setType("test"); - sampleEntity.setRate(10); - sampleEntity.setMessage("foo"); - sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); - - repository.save(sampleEntity); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setType("test"); - sampleEntity2.setRate(10); - sampleEntity2.setMessage("foo"); - sampleEntity2.setLocation(new GeoPoint(30.7806d, 0.0875d)); - - repository.save(sampleEntity2); - - // when - long count = repository.countByLocationNear(new Point(45.7806d, 3.0875d), new Distance(2, Metrics.KILOMETERS)); - // then - assertThat(count, is(equalTo(1L))); - } - - private List createSampleEntities(String type, int numberOfEntities) { - List entities = new ArrayList<>(); - for (int i = 0; i < numberOfEntities; i++) { - SampleEntity entity = new SampleEntity(); - entity.setId(randomNumeric(numberOfEntities)); - entity.setAvailable(true); - entity.setMessage("Message"); - entity.setType(type); - entities.add(entity); - } - return entities; - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repositories; + +import static org.apache.commons.lang.RandomStringUtils.*; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.geo.GeoPoint; +import org.springframework.data.elasticsearch.entities.SampleEntity; +import org.springframework.data.elasticsearch.repositories.custom.SampleCustomMethodRepository; +import org.springframework.data.geo.Box; +import org.springframework.data.geo.Distance; +import org.springframework.data.geo.Metrics; +import org.springframework.data.geo.Point; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Franck Marchand + * @author Kevin Leturc + * @author Christoph Strobl + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:custom-method-repository-test.xml") +public class CustomMethodRepositoryTests { + + @Autowired private SampleCustomMethodRepository repository; + + @Autowired private ElasticsearchTemplate elasticsearchTemplate; + + @Before + public void before() { + elasticsearchTemplate.deleteIndex(SampleEntity.class); + elasticsearchTemplate.createIndex(SampleEntity.class); + elasticsearchTemplate.putMapping(SampleEntity.class); + elasticsearchTemplate.refresh(SampleEntity.class); + } + + @Test + public void shouldExecuteCustomMethod() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("some message"); + repository.save(sampleEntity); + // when + Page page = repository.findByType("test", new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodForNot() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("some"); + sampleEntity.setMessage("some message"); + repository.save(sampleEntity); + // when + Page page = repository.findByTypeNot("test", new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodWithQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + String searchTerm = "customQuery"; + sampleEntity.setMessage(searchTerm); + repository.save(sampleEntity); + // when + Page page = repository.findByMessage(searchTerm.toLowerCase(), new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodWithLessThan() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(9); + sampleEntity.setMessage("some message"); + repository.save(sampleEntity); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setRate(20); + sampleEntity2.setMessage("some message"); + repository.save(sampleEntity2); + + // when + Page page = repository.findByRateLessThan(10, new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodWithBefore() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("some message"); + repository.save(sampleEntity); + + // when + Page page = repository.findByRateBefore(10, new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodWithAfter() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("some message"); + repository.save(sampleEntity); + + // when + Page page = repository.findByRateAfter(10, new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodWithLike() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + repository.save(sampleEntity); + + // when + Page page = repository.findByMessageLike("fo", new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodForStartingWith() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + repository.save(sampleEntity); + + // when + Page page = repository.findByMessageStartingWith("fo", new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodForEndingWith() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + repository.save(sampleEntity); + + // when + Page page = repository.findByMessageEndingWith("o", new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodForContains() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + repository.save(sampleEntity); + + // when + Page page = repository.findByMessageContaining("fo", new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodForIn() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + repository.save(sampleEntity); + + // given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + repository.save(sampleEntity2); + + List ids = Arrays.asList(documentId, documentId2); + + // when + Page page = repository.findByIdIn(ids, new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(2L))); + } + + @Test + public void shouldExecuteCustomMethodForNotIn() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + repository.save(sampleEntity); + + // given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + repository.save(sampleEntity2); + + List ids = Arrays.asList(documentId); + + // when + Page page = repository.findByIdNotIn(ids, new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + assertThat(page.getContent().get(0).getId(), is(documentId2)); + } + + @Test + public void shouldExecuteCustomMethodForTrue() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + sampleEntity.setAvailable(true); + repository.save(sampleEntity); + + // given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + sampleEntity2.setAvailable(false); + repository.save(sampleEntity2); + // when + Page page = repository.findByAvailableTrue(new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodForFalse() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + sampleEntity.setAvailable(true); + repository.save(sampleEntity); + + // given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + sampleEntity2.setAvailable(false); + repository.save(sampleEntity2); + // when + Page page = repository.findByAvailableFalse(new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodForOrderBy() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("abc"); + sampleEntity.setMessage("test"); + sampleEntity.setAvailable(true); + repository.save(sampleEntity); + + // document 2 + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("xyz"); + sampleEntity2.setMessage("bar"); + sampleEntity2.setAvailable(false); + repository.save(sampleEntity2); + + // document 3 + String documentId3 = randomNumeric(5); + SampleEntity sampleEntity3 = new SampleEntity(); + sampleEntity3.setId(documentId3); + sampleEntity3.setType("def"); + sampleEntity3.setMessage("foo"); + sampleEntity3.setAvailable(false); + repository.save(sampleEntity3); + + // when + Page page = repository.findByMessageOrderByTypeAsc("foo", new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodWithBooleanParameter() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + sampleEntity.setAvailable(true); + repository.save(sampleEntity); + + // given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + sampleEntity2.setAvailable(false); + repository.save(sampleEntity2); + // when + Page page = repository.findByAvailable(false, new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldReturnPageableResultsWithQueryAnnotationExpectedPageSize() { + // given + for (int i = 0; i < 30; i++) { + String documentId = String.valueOf(i); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("message"); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + } + // when + Page pageResult = repository.findByMessage("message", new PageRequest(0, 23)); + // then + assertThat(pageResult.getTotalElements(), is(equalTo(30L))); + assertThat(pageResult.getContent().size(), is(equalTo(23))); + } + + @Test + public void shouldReturnPageableResultsWithGivenSortingOrder() { + // given + String documentId = random(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("abc"); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("abd"); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity2); + + String documentId3 = randomNumeric(5); + SampleEntity sampleEntity3 = new SampleEntity(); + sampleEntity3.setId(documentId3); + sampleEntity3.setMessage("abe"); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity3); + // when + Page pageResult = repository.findByMessageContaining("a", + new PageRequest(0, 23, new Sort(new Sort.Order(Sort.Direction.DESC, "message")))); + // then + assertThat(pageResult.getContent().isEmpty(), is(false)); + assertThat(pageResult.getContent().get(0).getMessage(), is(sampleEntity3.getMessage())); + } + + @Test + public void shouldReturnListForMessage() { + // given + String documentId = random(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("abc"); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("abd"); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity2); + + String documentId3 = randomNumeric(5); + SampleEntity sampleEntity3 = new SampleEntity(); + sampleEntity3.setId(documentId3); + sampleEntity3.setMessage("abe"); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity3); + // when + List sampleEntities = repository.findByMessage("abc"); + // then + assertThat(sampleEntities.isEmpty(), is(false)); + assertThat(sampleEntities.size(), is(1)); + } + + @Test + public void shouldExecuteCustomMethodWithGeoPoint() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); + + repository.save(sampleEntity); + + // when + Page page = repository.findByLocation(new GeoPoint(45.7806d, 3.0875d), new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodWithGeoPointAndString() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); + + repository.save(sampleEntity); + + documentId = randomNumeric(5); + sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + sampleEntity.setLocation(new GeoPoint(48.7806d, 3.0875d)); + + repository.save(sampleEntity); + + // when + Page page = repository.findByLocationAndMessage(new GeoPoint(45.7806d, 3.0875d), "foo", + new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodWithWithinGeoPoint() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); + + repository.save(sampleEntity); + + // when + Page page = repository.findByLocationWithin(new GeoPoint(45.7806d, 3.0875d), "2km", + new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodWithWithinPoint() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); + + repository.save(sampleEntity); + + // when + Page page = repository.findByLocationWithin(new Point(45.7806d, 3.0875d), + new Distance(2, Metrics.KILOMETERS), new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodWithNearBox() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); + + repository.save(sampleEntity); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setType("test2"); + sampleEntity2.setRate(10); + sampleEntity2.setMessage("foo"); + sampleEntity2.setLocation(new GeoPoint(30.7806d, 0.0875d)); + + repository.save(sampleEntity2); + + // when + Page pageAll = repository.findAll(new PageRequest(0, 10)); + // then + assertThat(pageAll, is(notNullValue())); + assertThat(pageAll.getTotalElements(), is(equalTo(2L))); + + // when + Page page = repository.findByLocationNear(new Box(new Point(46d, 3d), new Point(45d, 4d)), + new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodWithNearPointAndDistance() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); + + repository.save(sampleEntity); + + // when + Page page = repository.findByLocationNear(new Point(45.7806d, 3.0875d), + new Distance(2, Metrics.KILOMETERS), new PageRequest(0, 10)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + /* + DATAES-165 + */ + @Test + public void shouldAllowReturningJava8StreamInCustomQuery() { + // given + List entities = createSampleEntities("abc", 30); + repository.saveAll(entities); + + // when + Stream stream = repository.findByType("abc"); + // then + assertThat(stream, is(notNullValue())); + assertThat(stream.count(), is(equalTo(30L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethod() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("some message"); + + repository.save(sampleEntity); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setType("test2"); + sampleEntity2.setMessage("some message"); + + repository.save(sampleEntity2); + + // when + long count = repository.countByType("test"); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodForNot() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("some"); + sampleEntity.setMessage("some message"); + + repository.save(sampleEntity); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("some message"); + + repository.save(sampleEntity2); + + // when + long count = repository.countByTypeNot("test"); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodWithBooleanParameter() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + sampleEntity.setAvailable(true); + repository.save(sampleEntity); + + // given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + sampleEntity2.setAvailable(false); + repository.save(sampleEntity2); + // when + long count = repository.countByAvailable(false); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodWithLessThan() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(9); + sampleEntity.setMessage("some message"); + repository.save(sampleEntity); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setRate(20); + sampleEntity2.setMessage("some message"); + repository.save(sampleEntity2); + + // when + long count = repository.countByRateLessThan(10); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodWithBefore() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("some message"); + + repository.save(sampleEntity); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setType("test"); + sampleEntity2.setRate(20); + sampleEntity2.setMessage("some message"); + + repository.save(sampleEntity2); + + // when + long count = repository.countByRateBefore(10); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodWithAfter() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("some message"); + + repository.save(sampleEntity); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setType("test"); + sampleEntity2.setRate(0); + sampleEntity2.setMessage("some message"); + + repository.save(sampleEntity2); + + // when + long count = repository.countByRateAfter(10); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodWithLike() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + + repository.save(sampleEntity); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setType("test"); + sampleEntity2.setRate(10); + sampleEntity2.setMessage("some message"); + + repository.save(sampleEntity2); + + // when + long count = repository.countByMessageLike("fo"); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodForStartingWith() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + + repository.save(sampleEntity); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setType("test"); + sampleEntity2.setRate(10); + sampleEntity2.setMessage("some message"); + + repository.save(sampleEntity2); + + // when + long count = repository.countByMessageStartingWith("fo"); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodForEndingWith() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + + repository.save(sampleEntity); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setType("test"); + sampleEntity2.setRate(10); + sampleEntity2.setMessage("some message"); + + repository.save(sampleEntity2); + + // when + long count = repository.countByMessageEndingWith("o"); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodForContains() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + + repository.save(sampleEntity); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setType("test"); + sampleEntity2.setRate(10); + sampleEntity2.setMessage("some message"); + + repository.save(sampleEntity2); + + // when + long count = repository.countByMessageContaining("fo"); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodForIn() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + repository.save(sampleEntity); + + // given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + repository.save(sampleEntity2); + + List ids = Arrays.asList(documentId, documentId2); + + // when + long count = repository.countByIdIn(ids); + // then + assertThat(count, is(equalTo(2L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodForNotIn() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + repository.save(sampleEntity); + + // given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + repository.save(sampleEntity2); + + List ids = Arrays.asList(documentId); + + // when + long count = repository.countByIdNotIn(ids); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodForTrue() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + sampleEntity.setAvailable(true); + repository.save(sampleEntity); + + // given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + sampleEntity2.setAvailable(false); + repository.save(sampleEntity2); + // when + long count = repository.countByAvailableTrue(); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodForFalse() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + sampleEntity.setAvailable(true); + repository.save(sampleEntity); + + // given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + sampleEntity2.setAvailable(false); + repository.save(sampleEntity2); + // when + long count = repository.countByAvailableFalse(); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodWithWithinGeoPoint() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); + + repository.save(sampleEntity); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setType("test"); + sampleEntity2.setRate(10); + sampleEntity2.setMessage("foo"); + sampleEntity2.setLocation(new GeoPoint(30.7806d, 0.0875d)); + + repository.save(sampleEntity2); + + // when + long count = repository.countByLocationWithin(new GeoPoint(45.7806d, 3.0875d), "2km"); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodWithWithinPoint() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); + + repository.save(sampleEntity); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setType("test"); + sampleEntity2.setRate(10); + sampleEntity2.setMessage("foo"); + sampleEntity2.setLocation(new GeoPoint(30.7806d, 0.0875d)); + + repository.save(sampleEntity2); + + // when + long count = repository.countByLocationWithin(new Point(45.7806d, 3.0875d), new Distance(2, Metrics.KILOMETERS)); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodWithNearBox() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); + + repository.save(sampleEntity); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setType("test2"); + sampleEntity2.setRate(10); + sampleEntity2.setMessage("foo"); + sampleEntity2.setLocation(new GeoPoint(30.7806d, 0.0875d)); + + repository.save(sampleEntity2); + + // when + long count = repository.countByLocationNear(new Box(new Point(46d, 3d), new Point(45d, 4d))); + // then + assertThat(count, is(equalTo(1L))); + } + + /* + DATAES-106 + */ + @Test + public void shouldCountCustomMethodWithNearPointAndDistance() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setRate(10); + sampleEntity.setMessage("foo"); + sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d)); + + repository.save(sampleEntity); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setType("test"); + sampleEntity2.setRate(10); + sampleEntity2.setMessage("foo"); + sampleEntity2.setLocation(new GeoPoint(30.7806d, 0.0875d)); + + repository.save(sampleEntity2); + + // when + long count = repository.countByLocationNear(new Point(45.7806d, 3.0875d), new Distance(2, Metrics.KILOMETERS)); + // then + assertThat(count, is(equalTo(1L))); + } + + private List createSampleEntities(String type, int numberOfEntities) { + List entities = new ArrayList<>(); + for (int i = 0; i < numberOfEntities; i++) { + SampleEntity entity = new SampleEntity(); + entity.setId(randomNumeric(numberOfEntities)); + entity.setAvailable(true); + entity.setMessage("Message"); + entity.setType(type); + entities.add(entity); + } + return entities; + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/book/SampleElasticSearchBookRepository.java b/src/test/java/org/springframework/data/elasticsearch/repositories/book/SampleElasticSearchBookRepository.java index ac6a70fa8..eb5b6f810 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/book/SampleElasticSearchBookRepository.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/book/SampleElasticSearchBookRepository.java @@ -1,27 +1,27 @@ -/* - * Copyright 2013-2014 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repositories.book; - -import org.springframework.data.elasticsearch.entities.Book; -import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - */ -public interface SampleElasticSearchBookRepository extends ElasticsearchRepository { - -} +/* + * Copyright 2013-2014 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repositories.book; + +import org.springframework.data.elasticsearch.entities.Book; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public interface SampleElasticSearchBookRepository extends ElasticsearchRepository { + +} diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/cdi/CdiProductRepository.java b/src/test/java/org/springframework/data/elasticsearch/repositories/cdi/CdiProductRepository.java index 92a375def..d7c6108c2 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/cdi/CdiProductRepository.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/cdi/CdiProductRepository.java @@ -1,32 +1,32 @@ -/* - * Copyright 2014-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repositories.cdi; - -import java.util.Optional; - -import org.springframework.data.elasticsearch.entities.Product; -import org.springframework.data.repository.CrudRepository; - -/** - * @author Mohsin Husen - * @author Oliver Gierke - * @author Mark Paluch - * @author Christoph Strobl - */ -public interface CdiProductRepository extends CrudRepository { - - Optional findById(String id); -} +/* + * Copyright 2014-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repositories.cdi; + +import java.util.Optional; + +import org.springframework.data.elasticsearch.entities.Product; +import org.springframework.data.repository.CrudRepository; + +/** + * @author Mohsin Husen + * @author Oliver Gierke + * @author Mark Paluch + * @author Christoph Strobl + */ +public interface CdiProductRepository extends CrudRepository { + + Optional findById(String id); +} diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/cdi/CdiRepositoryClient.java b/src/test/java/org/springframework/data/elasticsearch/repositories/cdi/CdiRepositoryClient.java index 7103f3134..72b997078 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/cdi/CdiRepositoryClient.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/cdi/CdiRepositoryClient.java @@ -1,58 +1,58 @@ -/* - * Copyright 2014-2016 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repositories.cdi; - -import javax.inject.Inject; - -/** - * @author Mohsin Husen - * @author Oliver Gierke - * @author Mark Paluch - */ -class CdiRepositoryClient { - - private CdiProductRepository repository; - private SamplePersonRepository samplePersonRepository; - private QualifiedProductRepository qualifiedProductRepository; - - public CdiProductRepository getRepository() { - return repository; - } - - @Inject - public void setRepository(CdiProductRepository repository) { - this.repository = repository; - } - - public SamplePersonRepository getSamplePersonRepository() { - return samplePersonRepository; - } - - @Inject - public void setSamplePersonRepository(SamplePersonRepository samplePersonRepository) { - this.samplePersonRepository = samplePersonRepository; - } - - public QualifiedProductRepository getQualifiedProductRepository() { - return qualifiedProductRepository; - } - - @Inject - public void setQualifiedProductRepository( - @PersonDB @OtherQualifier QualifiedProductRepository qualifiedProductRepository) { - this.qualifiedProductRepository = qualifiedProductRepository; - } -} +/* + * Copyright 2014-2016 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repositories.cdi; + +import javax.inject.Inject; + +/** + * @author Mohsin Husen + * @author Oliver Gierke + * @author Mark Paluch + */ +class CdiRepositoryClient { + + private CdiProductRepository repository; + private SamplePersonRepository samplePersonRepository; + private QualifiedProductRepository qualifiedProductRepository; + + public CdiProductRepository getRepository() { + return repository; + } + + @Inject + public void setRepository(CdiProductRepository repository) { + this.repository = repository; + } + + public SamplePersonRepository getSamplePersonRepository() { + return samplePersonRepository; + } + + @Inject + public void setSamplePersonRepository(SamplePersonRepository samplePersonRepository) { + this.samplePersonRepository = samplePersonRepository; + } + + public QualifiedProductRepository getQualifiedProductRepository() { + return qualifiedProductRepository; + } + + @Inject + public void setQualifiedProductRepository( + @PersonDB @OtherQualifier QualifiedProductRepository qualifiedProductRepository) { + this.qualifiedProductRepository = qualifiedProductRepository; + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/cdi/ElasticsearchTemplateProducer.java b/src/test/java/org/springframework/data/elasticsearch/repositories/cdi/ElasticsearchTemplateProducer.java index ce36a6465..a2dc536cc 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/cdi/ElasticsearchTemplateProducer.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/cdi/ElasticsearchTemplateProducer.java @@ -1,56 +1,56 @@ -/* - * Copyright 2014-2015 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repositories.cdi; - -import javax.annotation.PreDestroy; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.inject.Produces; - -import org.elasticsearch.client.Client; -import org.elasticsearch.node.NodeValidationException; -import org.springframework.data.elasticsearch.Utils; -import org.springframework.data.elasticsearch.core.ElasticsearchOperations; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; - -/** - * @author Mohsin Husen - */ -@ApplicationScoped -class ElasticsearchTemplateProducer { - - @Produces - public Client createNodeClient() throws NodeValidationException { - return Utils.getNodeClient(); - } - - @Produces - public ElasticsearchOperations createElasticsearchTemplate(Client client) { - return new ElasticsearchTemplate(client); - } - - @Produces - @OtherQualifier - @PersonDB - public ElasticsearchOperations createQualifiedElasticsearchTemplate(Client client) { - return new ElasticsearchTemplate(client); - } - - @PreDestroy - public void shutdown() { - // remove everything to avoid conflicts with other tests in case server not shut down properly - } - -} +/* + * Copyright 2014-2015 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repositories.cdi; + +import javax.annotation.PreDestroy; +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.inject.Produces; + +import org.elasticsearch.client.Client; +import org.elasticsearch.node.NodeValidationException; +import org.springframework.data.elasticsearch.Utils; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; + +/** + * @author Mohsin Husen + */ +@ApplicationScoped +class ElasticsearchTemplateProducer { + + @Produces + public Client createNodeClient() throws NodeValidationException { + return Utils.getNodeClient(); + } + + @Produces + public ElasticsearchOperations createElasticsearchTemplate(Client client) { + return new ElasticsearchTemplate(client); + } + + @Produces + @OtherQualifier + @PersonDB + public ElasticsearchOperations createQualifiedElasticsearchTemplate(Client client) { + return new ElasticsearchTemplate(client); + } + + @PreDestroy + public void shutdown() { + // remove everything to avoid conflicts with other tests in case server not shut down properly + } + +} diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/custom/SampleCustomMethodRepository.java b/src/test/java/org/springframework/data/elasticsearch/repositories/custom/SampleCustomMethodRepository.java index 84a5d2a63..47ebfe703 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/custom/SampleCustomMethodRepository.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/custom/SampleCustomMethodRepository.java @@ -1,132 +1,132 @@ -/* - * Copyright 2013 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repositories.custom; - -import java.util.List; -import java.util.stream.Stream; - -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.annotations.Query; -import org.springframework.data.elasticsearch.core.geo.GeoBox; -import org.springframework.data.elasticsearch.core.geo.GeoPoint; -import org.springframework.data.elasticsearch.entities.SampleEntity; -import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; -import org.springframework.data.geo.Box; -import org.springframework.data.geo.Distance; -import org.springframework.data.geo.Point; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Kevin Leturc - */ -public interface SampleCustomMethodRepository extends ElasticsearchRepository { - - Page findByType(String type, Pageable pageable); - - Page findByTypeNot(String type, Pageable pageable); - - @Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}") - Page findByMessage(String message, Pageable pageable); - - @Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}") - List findByMessage(String message); - - Page findByAvailable(boolean available, Pageable pageable); - - Page findByRateLessThan(int rate, Pageable pageable); - - Page findByRateBefore(int rate, Pageable pageable); - - Page findByRateAfter(int rate, Pageable pageable); - - Page findByMessageLike(String message, Pageable pageable); - - Page findByMessageStartingWith(String message, Pageable pageable); - - Page findByMessageEndingWith(String message, Pageable pageable); - - Page findByMessageContaining(String message, Pageable pageable); - - Page findByIdIn(List ids, Pageable pageable); - - Page findByIdNotIn(List ids, Pageable pageable); - - Page findByAvailableTrue(Pageable pageable); - - Page findByAvailableFalse(Pageable pageable); - - Page findByMessageOrderByTypeAsc(String message, Pageable pageable); - - Page findByLocation(GeoPoint point, Pageable pageable); - - Page findByLocationAndMessage(GeoPoint point, String msg, Pageable pageable); - - Page findByLocationWithin(GeoPoint point, String distance, Pageable pageable); - - Page findByLocationWithin(Point point, Distance distance, Pageable pageable); - - Page findByLocationNear(GeoBox box, Pageable pageable); - - Page findByLocationNear(Box box, Pageable pageable); - - Page findByLocationNear(Point point, Distance distance, Pageable pageable); - - Page findByLocationNear(GeoPoint point, String distance, Pageable pageable); - - Stream findByType(String type); - - long countByType(String type); - - long countByTypeNot(String type); - - long countByAvailable(boolean available); - - long countByRateLessThan(int rate); - - long countByRateBefore(int rate); - - long countByRateAfter(int rate); - - long countByMessageLike(String message); - - long countByMessageStartingWith(String message); - - long countByMessageEndingWith(String message); - - long countByMessageContaining(String message); - - long countByIdIn(List ids); - - long countByIdNotIn(List ids); - - long countByAvailableTrue(); - - long countByAvailableFalse(); - - long countByLocationWithin(GeoPoint point, String distance); - - long countByLocationWithin(Point point, Distance distance); - - long countByLocationNear(GeoBox box); - - long countByLocationNear(Box box); - - long countByLocationNear(Point point, Distance distance); - - long countByLocationNear(GeoPoint point, String distance); -} +/* + * Copyright 2013 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repositories.custom; + +import java.util.List; +import java.util.stream.Stream; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.annotations.Query; +import org.springframework.data.elasticsearch.core.geo.GeoBox; +import org.springframework.data.elasticsearch.core.geo.GeoPoint; +import org.springframework.data.elasticsearch.entities.SampleEntity; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import org.springframework.data.geo.Box; +import org.springframework.data.geo.Distance; +import org.springframework.data.geo.Point; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Kevin Leturc + */ +public interface SampleCustomMethodRepository extends ElasticsearchRepository { + + Page findByType(String type, Pageable pageable); + + Page findByTypeNot(String type, Pageable pageable); + + @Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}") + Page findByMessage(String message, Pageable pageable); + + @Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}") + List findByMessage(String message); + + Page findByAvailable(boolean available, Pageable pageable); + + Page findByRateLessThan(int rate, Pageable pageable); + + Page findByRateBefore(int rate, Pageable pageable); + + Page findByRateAfter(int rate, Pageable pageable); + + Page findByMessageLike(String message, Pageable pageable); + + Page findByMessageStartingWith(String message, Pageable pageable); + + Page findByMessageEndingWith(String message, Pageable pageable); + + Page findByMessageContaining(String message, Pageable pageable); + + Page findByIdIn(List ids, Pageable pageable); + + Page findByIdNotIn(List ids, Pageable pageable); + + Page findByAvailableTrue(Pageable pageable); + + Page findByAvailableFalse(Pageable pageable); + + Page findByMessageOrderByTypeAsc(String message, Pageable pageable); + + Page findByLocation(GeoPoint point, Pageable pageable); + + Page findByLocationAndMessage(GeoPoint point, String msg, Pageable pageable); + + Page findByLocationWithin(GeoPoint point, String distance, Pageable pageable); + + Page findByLocationWithin(Point point, Distance distance, Pageable pageable); + + Page findByLocationNear(GeoBox box, Pageable pageable); + + Page findByLocationNear(Box box, Pageable pageable); + + Page findByLocationNear(Point point, Distance distance, Pageable pageable); + + Page findByLocationNear(GeoPoint point, String distance, Pageable pageable); + + Stream findByType(String type); + + long countByType(String type); + + long countByTypeNot(String type); + + long countByAvailable(boolean available); + + long countByRateLessThan(int rate); + + long countByRateBefore(int rate); + + long countByRateAfter(int rate); + + long countByMessageLike(String message); + + long countByMessageStartingWith(String message); + + long countByMessageEndingWith(String message); + + long countByMessageContaining(String message); + + long countByIdIn(List ids); + + long countByIdNotIn(List ids); + + long countByAvailableTrue(); + + long countByAvailableFalse(); + + long countByLocationWithin(GeoPoint point, String distance); + + long countByLocationWithin(Point point, Distance distance); + + long countByLocationNear(GeoBox box); + + long countByLocationNear(Box box); + + long countByLocationNear(Point point, Distance distance); + + long countByLocationNear(GeoPoint point, String distance); +} diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/nondocument/NonDocumentEntityRepository.java b/src/test/java/org/springframework/data/elasticsearch/repositories/nondocument/NonDocumentEntityRepository.java index b51c3a26c..998e3786c 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/nondocument/NonDocumentEntityRepository.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/nondocument/NonDocumentEntityRepository.java @@ -1,30 +1,30 @@ -/* - * Copyright 2013-2014 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repositories.nondocument; - -import org.springframework.context.annotation.Lazy; -import org.springframework.data.elasticsearch.entities.NonDocumentEntity; -import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Oliver Gierke - */ -@Lazy -public interface NonDocumentEntityRepository extends ElasticsearchRepository { - -} +/* + * Copyright 2013-2014 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repositories.nondocument; + +import org.springframework.context.annotation.Lazy; +import org.springframework.data.elasticsearch.entities.NonDocumentEntity; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Oliver Gierke + */ +@Lazy +public interface NonDocumentEntityRepository extends ElasticsearchRepository { + +} diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/sample/SampleElasticsearchRepository.java b/src/test/java/org/springframework/data/elasticsearch/repositories/sample/SampleElasticsearchRepository.java index d59653431..420a7b581 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/sample/SampleElasticsearchRepository.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/sample/SampleElasticsearchRepository.java @@ -1,38 +1,38 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repositories.sample; - -import java.util.List; - -import org.springframework.data.elasticsearch.entities.SampleEntity; -import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Christoph Strobl - */ -public interface SampleElasticsearchRepository extends ElasticsearchRepository { - - long deleteSampleEntityById(String id); - - List deleteByAvailable(boolean available); - - List deleteByMessage(String message); - - void deleteByType(String type); - -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repositories.sample; + +import java.util.List; + +import org.springframework.data.elasticsearch.entities.SampleEntity; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Christoph Strobl + */ +public interface SampleElasticsearchRepository extends ElasticsearchRepository { + + long deleteSampleEntityById(String id); + + List deleteByAvailable(boolean available); + + List deleteByMessage(String message); + + void deleteByType(String type); + +} diff --git a/src/test/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchRepositoryFactoryTests.java b/src/test/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchRepositoryFactoryTests.java index d403cf3f3..c4f2fb0a6 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchRepositoryFactoryTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchRepositoryFactoryTests.java @@ -1,64 +1,64 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository.support; - -import static org.mockito.Mockito.*; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; -import org.springframework.data.elasticsearch.core.ElasticsearchOperations; -import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; -import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; -import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext; -import org.springframework.data.mapping.context.MappingContext; -import org.springframework.data.querydsl.QuerydslPredicateExecutor; -import org.springframework.data.repository.core.RepositoryMetadata; -import org.springframework.data.repository.core.support.DefaultRepositoryMetadata; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Mark Paluch - */ -@RunWith(MockitoJUnitRunner.class) -public class ElasticsearchRepositoryFactoryTests { - - @Mock - private ElasticsearchOperations operations; - private ElasticsearchConverter converter; - private ElasticsearchRepositoryFactory factory; - MappingContext, ElasticsearchPersistentProperty> mappingContext = new SimpleElasticsearchMappingContext(); - - @Before - public void before() { - converter = new MappingElasticsearchConverter(mappingContext); - when(operations.getElasticsearchConverter()).thenReturn(converter); - factory = new ElasticsearchRepositoryFactory(operations); - } - - @Test(expected = IllegalArgumentException.class) - public void shouldThrowExceptionGivenQueryDslRepository() { - // given - RepositoryMetadata metadata = new DefaultRepositoryMetadata(QuerydslPredicateExecutor.class); - // when - factory.getRepositoryBaseClass(metadata); - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository.support; + +import static org.mockito.Mockito.*; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; +import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter; +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; +import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext; +import org.springframework.data.mapping.context.MappingContext; +import org.springframework.data.querydsl.QuerydslPredicateExecutor; +import org.springframework.data.repository.core.RepositoryMetadata; +import org.springframework.data.repository.core.support.DefaultRepositoryMetadata; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Mark Paluch + */ +@RunWith(MockitoJUnitRunner.class) +public class ElasticsearchRepositoryFactoryTests { + + @Mock + private ElasticsearchOperations operations; + private ElasticsearchConverter converter; + private ElasticsearchRepositoryFactory factory; + MappingContext, ElasticsearchPersistentProperty> mappingContext = new SimpleElasticsearchMappingContext(); + + @Before + public void before() { + converter = new MappingElasticsearchConverter(mappingContext); + when(operations.getElasticsearchConverter()).thenReturn(converter); + factory = new ElasticsearchRepositoryFactory(operations); + } + + @Test(expected = IllegalArgumentException.class) + public void shouldThrowExceptionGivenQueryDslRepository() { + // given + RepositoryMetadata metadata = new DefaultRepositoryMetadata(QuerydslPredicateExecutor.class); + // when + factory.getRepositoryBaseClass(metadata); + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepositoryTests.java b/src/test/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepositoryTests.java index 08a19c500..4d131518f 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepositoryTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepositoryTests.java @@ -1,550 +1,550 @@ -/* - * Copyright 2013-2017 the original author or authors. - * - * 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 org.springframework.data.elasticsearch.repository.support; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import org.elasticsearch.action.ActionRequestValidationException; -import org.elasticsearch.common.util.CollectionUtils; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort; -import org.springframework.data.domain.Sort.Order; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; -import org.springframework.data.elasticsearch.core.query.SearchQuery; -import org.springframework.data.elasticsearch.entities.SampleEntity; -import org.springframework.data.elasticsearch.repositories.sample.SampleElasticsearchRepository; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import static org.apache.commons.lang.RandomStringUtils.*; -import static org.elasticsearch.index.query.QueryBuilders.*; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; -import static org.springframework.data.domain.Sort.Direction.*; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Mark Paluch - * @author Christoph Strobl - */ -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("classpath:/simple-repository-test.xml") -public class SimpleElasticsearchRepositoryTests { - - @Autowired private SampleElasticsearchRepository repository; - - @Autowired private ElasticsearchTemplate elasticsearchTemplate; - - @Before - public void before() { - elasticsearchTemplate.deleteIndex(SampleEntity.class); - elasticsearchTemplate.createIndex(SampleEntity.class); - elasticsearchTemplate.putMapping(SampleEntity.class); - elasticsearchTemplate.refresh(SampleEntity.class); - } - - @Test - public void shouldDoBulkIndexDocument() { - // given - String documentId1 = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId1); - sampleEntity1.setMessage("some message"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("some message"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - // when - repository.saveAll(Arrays.asList(sampleEntity1, sampleEntity2)); - // then - Optional entity1FromElasticSearch = repository.findById(documentId1); - assertThat(entity1FromElasticSearch.isPresent(), is(true)); - - Optional entity2FromElasticSearch = repository.findById(documentId2); - assertThat(entity2FromElasticSearch.isPresent(), is(true)); - } - - @Test - public void shouldSaveDocument() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - // when - repository.save(sampleEntity); - // then - Optional entityFromElasticSearch = repository.findById(documentId); - assertThat(entityFromElasticSearch.isPresent(), is(true)); - } - - @Test(expected = ActionRequestValidationException.class) - public void throwExceptionWhenTryingToInsertWithVersionButWithoutId() { - // given - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - // when - repository.save(sampleEntity); - // then - assertThat(sampleEntity.getId(), is(notNullValue())); - } - - @Test - public void shouldFindDocumentById() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity); - // when - Optional entityFromElasticSearch = repository.findById(documentId); - // then - assertThat(entityFromElasticSearch.isPresent(), is(true)); - assertThat(sampleEntity, is((equalTo(sampleEntity)))); - } - - @Test - public void shouldReturnCountOfDocuments() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity); - // when - Long count = repository.count(); - // then - assertThat(count, is(greaterThanOrEqualTo(1L))); - } - - @Test - public void shouldFindAllDocuments() { - // when - Iterable results = repository.findAll(); - // then - assertThat(results, is(notNullValue())); - } - - @Test - public void shouldDeleteDocument() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity); - // when - repository.deleteById(documentId); - // then - Optional entityFromElasticSearch = repository.findById(documentId); - assertThat(entityFromElasticSearch.isPresent(), is(false)); - } - - @Test - public void shouldSearchDocumentsGivenSearchQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some test message"); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity); - - SearchQuery query = new NativeSearchQueryBuilder().withQuery(termQuery("message", "test")).build(); - // when - Page page = repository.search(query); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getNumberOfElements(), is(greaterThanOrEqualTo(1))); - } - - @Test - public void shouldSearchDocumentsGivenElasticsearchQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("hello world."); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity); - // when - Page page = repository.search(termQuery("message", "world"), new PageRequest(0, 50)); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getNumberOfElements(), is(greaterThanOrEqualTo(1))); - } - - /* - DATAES-82 - */ - @Test - public void shouldFindAllByIdQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("hello world."); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("hello world."); - sampleEntity2.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity2); - - // when - Iterable sampleEntities = repository.findAllById(Arrays.asList(documentId, documentId2)); - - // then - assertNotNull("sample entities cant be null..", sampleEntities); - List entities = CollectionUtils.iterableAsArrayList(sampleEntities); - assertThat(entities.size(), is(2)); - } - - @Test - public void shouldSaveIterableEntities() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setMessage("hello world."); - sampleEntity1.setVersion(System.currentTimeMillis()); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("hello world."); - sampleEntity2.setVersion(System.currentTimeMillis()); - - Iterable sampleEntities = Arrays.asList(sampleEntity1, sampleEntity2); - // when - repository.saveAll(sampleEntities); - // then - Page entities = repository.search(termQuery("id", documentId), new PageRequest(0, 50)); - assertNotNull(entities); - } - - @Test - public void shouldReturnTrueGivenDocumentWithIdExists() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("hello world."); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity); - - // when - boolean exist = repository.existsById(documentId); - - // then - assertEquals(exist, true); - } - - @Test - public void shouldReturnResultsForGivenSearchQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("hello world."); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity); - // when - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); - Page sampleEntities = repository.search(searchQuery); - // then - assertThat(sampleEntities.getTotalElements(), equalTo(1L)); - } - - @Test - public void shouldDeleteAll() { - // when - repository.deleteAll(); - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - Page sampleEntities = repository.search(searchQuery); - assertThat(sampleEntities.getTotalElements(), equalTo(0L)); - } - - @Test - public void shouldDeleteById() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("hello world."); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity); - // when - long result = repository.deleteSampleEntityById(documentId); - repository.refresh(); - - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); - Page sampleEntities = repository.search(searchQuery); - assertThat(sampleEntities.getTotalElements(), equalTo(0L)); - assertThat(result, equalTo(1L)); - } - - @Test - public void shouldDeleteByMessageAndReturnList() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setMessage("hello world 1"); - sampleEntity1.setAvailable(true); - sampleEntity1.setVersion(System.currentTimeMillis()); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setMessage("hello world 2"); - sampleEntity2.setAvailable(true); - sampleEntity2.setVersion(System.currentTimeMillis()); - - documentId = randomNumeric(5); - SampleEntity sampleEntity3 = new SampleEntity(); - sampleEntity3.setId(documentId); - sampleEntity3.setMessage("hello world 3"); - sampleEntity3.setAvailable(false); - sampleEntity3.setVersion(System.currentTimeMillis()); - repository.saveAll(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); - // when - List result = repository.deleteByAvailable(true); - repository.refresh(); - // then - assertThat(result.size(), equalTo(2)); - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - Page sampleEntities = repository.search(searchQuery); - assertThat(sampleEntities.getTotalElements(), equalTo(1L)); - } - - @Test - public void shouldDeleteByListForMessage() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setMessage("hello world 1"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setMessage("hello world 2"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - documentId = randomNumeric(5); - SampleEntity sampleEntity3 = new SampleEntity(); - sampleEntity3.setId(documentId); - sampleEntity3.setMessage("hello world 3"); - sampleEntity3.setVersion(System.currentTimeMillis()); - repository.saveAll(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); - // when - List result = repository.deleteByMessage("hello world 3"); - repository.refresh(); - // then - assertThat(result.size(), equalTo(1)); - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - Page sampleEntities = repository.search(searchQuery); - assertThat(sampleEntities.getTotalElements(), equalTo(2L)); - } - - @Test - public void shouldDeleteByType() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setType("book"); - sampleEntity1.setVersion(System.currentTimeMillis()); - - documentId = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId); - sampleEntity2.setType("article"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - documentId = randomNumeric(5); - SampleEntity sampleEntity3 = new SampleEntity(); - sampleEntity3.setId(documentId); - sampleEntity3.setType("image"); - sampleEntity3.setVersion(System.currentTimeMillis()); - repository.saveAll(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); - // when - repository.deleteByType("article"); - repository.refresh(); - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - Page sampleEntities = repository.search(searchQuery); - assertThat(sampleEntities.getTotalElements(), equalTo(2L)); - } - - @Test - public void shouldDeleteEntity() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("hello world."); - sampleEntity.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity); - // when - repository.delete(sampleEntity); - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); - Page sampleEntities = repository.search(searchQuery); - assertThat(sampleEntities.getTotalElements(), equalTo(0L)); - } - - @Test - public void shouldReturnIterableEntities() { - // given - String documentId1 = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId1); - sampleEntity1.setMessage("hello world."); - sampleEntity1.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity1); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("hello world."); - sampleEntity2.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity2); - - // when - Iterable sampleEntities = repository.search(termQuery("id", documentId1)); - // then - assertNotNull("sample entities cant be null..", sampleEntities); - } - - @Test - public void shouldDeleteIterableEntities() { - // given - String documentId1 = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId1); - sampleEntity1.setMessage("hello world."); - sampleEntity1.setVersion(System.currentTimeMillis()); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("hello world."); - sampleEntity2.setVersion(System.currentTimeMillis()); - repository.save(sampleEntity2); - - Iterable sampleEntities = Arrays.asList(sampleEntity2, sampleEntity2); - // when - repository.deleteAll(sampleEntities); - // then - assertThat(repository.findById(documentId1).isPresent(), is(false)); - assertThat(repository.findById(documentId2).isPresent(), is(false)); - } - - @Test - public void shouldIndexEntity() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setVersion(System.currentTimeMillis()); - sampleEntity.setMessage("some message"); - // when - repository.index(sampleEntity); - // then - Page entities = repository.search(termQuery("id", documentId), new PageRequest(0, 50)); - assertThat(entities.getTotalElements(), equalTo(1L)); - } - - @Test - public void shouldSortByGivenField() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("world"); - repository.save(sampleEntity); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("hello"); - repository.save(sampleEntity2); - // when - Iterable sampleEntities = repository.findAll(new Sort(new Order(ASC, "message"))); - // then - assertThat(sampleEntities, is(notNullValue())); - } - - @Test - public void shouldReturnSimilarEntities() { - // given - String sampleMessage = "So we build a web site or an application and want to add search to it, " - + "and then it hits us: getting search working is hard. We want our search solution to be fast," - + " we want a painless setup and a completely free search schema, we want to be able to index data simply using JSON over HTTP, " - + "we want our search server to be always available, we want to be able to start with one machine and scale to hundreds, " - + "we want real-time search, we want simple multi-tenancy, and we want a solution that is built for the cloud."; - - List sampleEntities = createSampleEntitiesWithMessage(sampleMessage, 30); - repository.saveAll(sampleEntities); - - // when - Page results = repository.searchSimilar(sampleEntities.get(0), new String[] { "message" }, - new PageRequest(0, 5)); - - // then - assertThat(results.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - private static List createSampleEntitiesWithMessage(String message, int numberOfEntities) { - List sampleEntities = new ArrayList<>(); - for (int i = 0; i < numberOfEntities; i++) { - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage(message); - sampleEntity.setRate(2); - sampleEntity.setVersion(System.currentTimeMillis()); - sampleEntities.add(sampleEntity); - } - return sampleEntities; - } -} +/* + * Copyright 2013-2017 the original author or authors. + * + * 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 org.springframework.data.elasticsearch.repository.support; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import org.elasticsearch.action.ActionRequestValidationException; +import org.elasticsearch.common.util.CollectionUtils; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.domain.Sort.Order; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; +import org.springframework.data.elasticsearch.core.query.SearchQuery; +import org.springframework.data.elasticsearch.entities.SampleEntity; +import org.springframework.data.elasticsearch.repositories.sample.SampleElasticsearchRepository; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import static org.apache.commons.lang.RandomStringUtils.*; +import static org.elasticsearch.index.query.QueryBuilders.*; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; +import static org.springframework.data.domain.Sort.Direction.*; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + * @author Mark Paluch + * @author Christoph Strobl + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:/simple-repository-test.xml") +public class SimpleElasticsearchRepositoryTests { + + @Autowired private SampleElasticsearchRepository repository; + + @Autowired private ElasticsearchTemplate elasticsearchTemplate; + + @Before + public void before() { + elasticsearchTemplate.deleteIndex(SampleEntity.class); + elasticsearchTemplate.createIndex(SampleEntity.class); + elasticsearchTemplate.putMapping(SampleEntity.class); + elasticsearchTemplate.refresh(SampleEntity.class); + } + + @Test + public void shouldDoBulkIndexDocument() { + // given + String documentId1 = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId1); + sampleEntity1.setMessage("some message"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("some message"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + // when + repository.saveAll(Arrays.asList(sampleEntity1, sampleEntity2)); + // then + Optional entity1FromElasticSearch = repository.findById(documentId1); + assertThat(entity1FromElasticSearch.isPresent(), is(true)); + + Optional entity2FromElasticSearch = repository.findById(documentId2); + assertThat(entity2FromElasticSearch.isPresent(), is(true)); + } + + @Test + public void shouldSaveDocument() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + // when + repository.save(sampleEntity); + // then + Optional entityFromElasticSearch = repository.findById(documentId); + assertThat(entityFromElasticSearch.isPresent(), is(true)); + } + + @Test(expected = ActionRequestValidationException.class) + public void throwExceptionWhenTryingToInsertWithVersionButWithoutId() { + // given + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + // when + repository.save(sampleEntity); + // then + assertThat(sampleEntity.getId(), is(notNullValue())); + } + + @Test + public void shouldFindDocumentById() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + // when + Optional entityFromElasticSearch = repository.findById(documentId); + // then + assertThat(entityFromElasticSearch.isPresent(), is(true)); + assertThat(sampleEntity, is((equalTo(sampleEntity)))); + } + + @Test + public void shouldReturnCountOfDocuments() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + // when + Long count = repository.count(); + // then + assertThat(count, is(greaterThanOrEqualTo(1L))); + } + + @Test + public void shouldFindAllDocuments() { + // when + Iterable results = repository.findAll(); + // then + assertThat(results, is(notNullValue())); + } + + @Test + public void shouldDeleteDocument() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + // when + repository.deleteById(documentId); + // then + Optional entityFromElasticSearch = repository.findById(documentId); + assertThat(entityFromElasticSearch.isPresent(), is(false)); + } + + @Test + public void shouldSearchDocumentsGivenSearchQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some test message"); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + + SearchQuery query = new NativeSearchQueryBuilder().withQuery(termQuery("message", "test")).build(); + // when + Page page = repository.search(query); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getNumberOfElements(), is(greaterThanOrEqualTo(1))); + } + + @Test + public void shouldSearchDocumentsGivenElasticsearchQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("hello world."); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + // when + Page page = repository.search(termQuery("message", "world"), new PageRequest(0, 50)); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getNumberOfElements(), is(greaterThanOrEqualTo(1))); + } + + /* + DATAES-82 + */ + @Test + public void shouldFindAllByIdQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("hello world."); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("hello world."); + sampleEntity2.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity2); + + // when + Iterable sampleEntities = repository.findAllById(Arrays.asList(documentId, documentId2)); + + // then + assertNotNull("sample entities cant be null..", sampleEntities); + List entities = CollectionUtils.iterableAsArrayList(sampleEntities); + assertThat(entities.size(), is(2)); + } + + @Test + public void shouldSaveIterableEntities() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("hello world."); + sampleEntity1.setVersion(System.currentTimeMillis()); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("hello world."); + sampleEntity2.setVersion(System.currentTimeMillis()); + + Iterable sampleEntities = Arrays.asList(sampleEntity1, sampleEntity2); + // when + repository.saveAll(sampleEntities); + // then + Page entities = repository.search(termQuery("id", documentId), new PageRequest(0, 50)); + assertNotNull(entities); + } + + @Test + public void shouldReturnTrueGivenDocumentWithIdExists() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("hello world."); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + + // when + boolean exist = repository.existsById(documentId); + + // then + assertEquals(exist, true); + } + + @Test + public void shouldReturnResultsForGivenSearchQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("hello world."); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + // when + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); + Page sampleEntities = repository.search(searchQuery); + // then + assertThat(sampleEntities.getTotalElements(), equalTo(1L)); + } + + @Test + public void shouldDeleteAll() { + // when + repository.deleteAll(); + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); + Page sampleEntities = repository.search(searchQuery); + assertThat(sampleEntities.getTotalElements(), equalTo(0L)); + } + + @Test + public void shouldDeleteById() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("hello world."); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + // when + long result = repository.deleteSampleEntityById(documentId); + repository.refresh(); + + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); + Page sampleEntities = repository.search(searchQuery); + assertThat(sampleEntities.getTotalElements(), equalTo(0L)); + assertThat(result, equalTo(1L)); + } + + @Test + public void shouldDeleteByMessageAndReturnList() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("hello world 1"); + sampleEntity1.setAvailable(true); + sampleEntity1.setVersion(System.currentTimeMillis()); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setMessage("hello world 2"); + sampleEntity2.setAvailable(true); + sampleEntity2.setVersion(System.currentTimeMillis()); + + documentId = randomNumeric(5); + SampleEntity sampleEntity3 = new SampleEntity(); + sampleEntity3.setId(documentId); + sampleEntity3.setMessage("hello world 3"); + sampleEntity3.setAvailable(false); + sampleEntity3.setVersion(System.currentTimeMillis()); + repository.saveAll(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); + // when + List result = repository.deleteByAvailable(true); + repository.refresh(); + // then + assertThat(result.size(), equalTo(2)); + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); + Page sampleEntities = repository.search(searchQuery); + assertThat(sampleEntities.getTotalElements(), equalTo(1L)); + } + + @Test + public void shouldDeleteByListForMessage() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("hello world 1"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setMessage("hello world 2"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + documentId = randomNumeric(5); + SampleEntity sampleEntity3 = new SampleEntity(); + sampleEntity3.setId(documentId); + sampleEntity3.setMessage("hello world 3"); + sampleEntity3.setVersion(System.currentTimeMillis()); + repository.saveAll(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); + // when + List result = repository.deleteByMessage("hello world 3"); + repository.refresh(); + // then + assertThat(result.size(), equalTo(1)); + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); + Page sampleEntities = repository.search(searchQuery); + assertThat(sampleEntities.getTotalElements(), equalTo(2L)); + } + + @Test + public void shouldDeleteByType() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setType("book"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + documentId = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId); + sampleEntity2.setType("article"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + documentId = randomNumeric(5); + SampleEntity sampleEntity3 = new SampleEntity(); + sampleEntity3.setId(documentId); + sampleEntity3.setType("image"); + sampleEntity3.setVersion(System.currentTimeMillis()); + repository.saveAll(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); + // when + repository.deleteByType("article"); + repository.refresh(); + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); + Page sampleEntities = repository.search(searchQuery); + assertThat(sampleEntities.getTotalElements(), equalTo(2L)); + } + + @Test + public void shouldDeleteEntity() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("hello world."); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + // when + repository.delete(sampleEntity); + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); + Page sampleEntities = repository.search(searchQuery); + assertThat(sampleEntities.getTotalElements(), equalTo(0L)); + } + + @Test + public void shouldReturnIterableEntities() { + // given + String documentId1 = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId1); + sampleEntity1.setMessage("hello world."); + sampleEntity1.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity1); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("hello world."); + sampleEntity2.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity2); + + // when + Iterable sampleEntities = repository.search(termQuery("id", documentId1)); + // then + assertNotNull("sample entities cant be null..", sampleEntities); + } + + @Test + public void shouldDeleteIterableEntities() { + // given + String documentId1 = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId1); + sampleEntity1.setMessage("hello world."); + sampleEntity1.setVersion(System.currentTimeMillis()); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("hello world."); + sampleEntity2.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity2); + + Iterable sampleEntities = Arrays.asList(sampleEntity2, sampleEntity2); + // when + repository.deleteAll(sampleEntities); + // then + assertThat(repository.findById(documentId1).isPresent(), is(false)); + assertThat(repository.findById(documentId2).isPresent(), is(false)); + } + + @Test + public void shouldIndexEntity() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setVersion(System.currentTimeMillis()); + sampleEntity.setMessage("some message"); + // when + repository.index(sampleEntity); + // then + Page entities = repository.search(termQuery("id", documentId), new PageRequest(0, 50)); + assertThat(entities.getTotalElements(), equalTo(1L)); + } + + @Test + public void shouldSortByGivenField() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("world"); + repository.save(sampleEntity); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("hello"); + repository.save(sampleEntity2); + // when + Iterable sampleEntities = repository.findAll(new Sort(new Order(ASC, "message"))); + // then + assertThat(sampleEntities, is(notNullValue())); + } + + @Test + public void shouldReturnSimilarEntities() { + // given + String sampleMessage = "So we build a web site or an application and want to add search to it, " + + "and then it hits us: getting search working is hard. We want our search solution to be fast," + + " we want a painless setup and a completely free search schema, we want to be able to index data simply using JSON over HTTP, " + + "we want our search server to be always available, we want to be able to start with one machine and scale to hundreds, " + + "we want real-time search, we want simple multi-tenancy, and we want a solution that is built for the cloud."; + + List sampleEntities = createSampleEntitiesWithMessage(sampleMessage, 30); + repository.saveAll(sampleEntities); + + // when + Page results = repository.searchSimilar(sampleEntities.get(0), new String[] { "message" }, + new PageRequest(0, 5)); + + // then + assertThat(results.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + private static List createSampleEntitiesWithMessage(String message, int numberOfEntities) { + List sampleEntities = new ArrayList<>(); + for (int i = 0; i < numberOfEntities; i++) { + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage(message); + sampleEntity.setRate(2); + sampleEntity.setVersion(System.currentTimeMillis()); + sampleEntities.add(sampleEntity); + } + return sampleEntities; + } +} diff --git a/src/test/resources/custom-method-repository-test.xml b/src/test/resources/custom-method-repository-test.xml index 5b54cdb02..19c78df89 100644 --- a/src/test/resources/custom-method-repository-test.xml +++ b/src/test/resources/custom-method-repository-test.xml @@ -1,19 +1,19 @@ - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/elasticsearch-template-test.xml b/src/test/resources/elasticsearch-template-test.xml index afc5bbd2b..310b954fd 100644 --- a/src/test/resources/elasticsearch-template-test.xml +++ b/src/test/resources/elasticsearch-template-test.xml @@ -1,13 +1,13 @@ - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/infrastructure.xml b/src/test/resources/infrastructure.xml index 06bb606b4..f656d6892 100644 --- a/src/test/resources/infrastructure.xml +++ b/src/test/resources/infrastructure.xml @@ -1,18 +1,18 @@ - - - - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/repository-non-document-entity.xml b/src/test/resources/repository-non-document-entity.xml index 1c540f6e3..df7400eb3 100644 --- a/src/test/resources/repository-non-document-entity.xml +++ b/src/test/resources/repository-non-document-entity.xml @@ -1,17 +1,17 @@ - - - - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/repository-test-nested-object.xml b/src/test/resources/repository-test-nested-object.xml index af1135eff..2303931b9 100644 --- a/src/test/resources/repository-test-nested-object.xml +++ b/src/test/resources/repository-test-nested-object.xml @@ -1,17 +1,17 @@ - - - - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/simple-repository-test.xml b/src/test/resources/simple-repository-test.xml index 907e2cc45..09fe37218 100644 --- a/src/test/resources/simple-repository-test.xml +++ b/src/test/resources/simple-repository-test.xml @@ -1,19 +1,19 @@ - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file