Compare commits
67 Commits
6.1.x
...
3.0.8.RELEASE
| Author | SHA1 | Date | |
|---|---|---|---|
| a1d508c656 | |||
| 04308394dd | |||
| be80d7eae4 | |||
| de1c28979d | |||
| bd668e6c2a | |||
| ba899a0017 | |||
| 8181c713c7 | |||
| c6419a1f05 | |||
| 09ee8f9026 | |||
| 13cfb039b5 | |||
| 4c9c03ac0b | |||
| cd597f059e | |||
| 7cf251a24e | |||
| fe5426b870 | |||
| 01a37c4fc3 | |||
| 021495580f | |||
| 4970783ca4 | |||
| 5ac31b3d2b | |||
| 71b2ffc128 | |||
| 2642836e4d | |||
| 849d7da652 | |||
| 5e29b958e5 | |||
| 1b1ef4b5f4 | |||
| 79636c2a29 | |||
| 787fc897d3 | |||
| 4bdaf039c2 | |||
| 35003bf942 | |||
| be230f4003 | |||
| 8c1821e7a6 | |||
| 72a2f9f758 | |||
| d9d3521518 | |||
| d50ae96c5e | |||
| 734a28fb03 | |||
| ac403b9198 | |||
| 477c4d1dc3 | |||
| 2b543ff026 | |||
| 02a3e120c2 | |||
| 92286a725d | |||
| 462288be0e | |||
| b844f47795 | |||
| fe488eac32 | |||
| a77b81ecb3 | |||
| 81795f67cd | |||
| 485859ca3d | |||
| 8973d2d7eb | |||
| a525a38825 | |||
| b392090e61 | |||
| ca4a864f9e | |||
| 3a31030f89 | |||
| 34a7900e34 | |||
| 361bc2a333 | |||
| c2c21581d8 | |||
| ecf2efa6e5 | |||
| 418d259fbf | |||
| 737a023b5a | |||
| cc3f578312 | |||
| 81b21f4e6f | |||
| 552cbff6a4 | |||
| 000eb152dc | |||
| ad55402973 | |||
| ef68623d5b | |||
| c075f170c3 | |||
| 02b7dde196 | |||
| 51b7fa2a26 | |||
| 4e5051c57b | |||
| 31d499e6e0 | |||
| 311a06aa67 |
+18
-18
@@ -1,18 +1,18 @@
|
|||||||
atlassian-ide-plugin.xml
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
## Ignore svn files
|
## Ignore svn files
|
||||||
.svn
|
.svn
|
||||||
|
|
||||||
## ignore any target dir
|
## ignore any target dir
|
||||||
target
|
target
|
||||||
|
|
||||||
## Ignore project files created by Eclipse
|
## Ignore project files created by Eclipse
|
||||||
.settings
|
.settings
|
||||||
.project
|
.project
|
||||||
.classpath
|
.classpath
|
||||||
|
|
||||||
## Ignore project files created by IntelliJ IDEA
|
## Ignore project files created by IntelliJ IDEA
|
||||||
*.iml
|
*.iml
|
||||||
*.ipr
|
*.ipr
|
||||||
*.iws
|
*.iws
|
||||||
.idea
|
.idea
|
||||||
|
|||||||
@@ -52,17 +52,12 @@ the appropriate dependency version.
|
|||||||
</repository>
|
</repository>
|
||||||
```
|
```
|
||||||
|
|
||||||
| spring data elasticsearch | elasticsearch |
|
| spring data elasticsearch | elasticsearch |
|
||||||
|:-----------------------------------:|:-------------:|
|
|:-------------------------:|:-------------:|
|
||||||
| 3.0.0.RC2 | 5.5.0 |
|
| 3.0.x | 5.5.0 |
|
||||||
| 3.0.0.M4 | 5.4.0 |
|
| 2.1.x | 2.4.0 |
|
||||||
| 2.0.4.RELEASE | 2.4.0 |
|
| 2.0.x | 2.2.0 |
|
||||||
| 2.0.0.RELEASE | 2.2.0 |
|
| 1.3.x | 1.5.2 |
|
||||||
| 1.4.0.M1 | 1.7.3 |
|
|
||||||
| 1.3.0.RELEASE | 1.5.2 |
|
|
||||||
| 1.2.0.RELEASE | 1.4.4 |
|
|
||||||
| 1.1.0.RELEASE | 1.3.2 |
|
|
||||||
| 1.0.0.RELEASE | 1.1.1 |
|
|
||||||
|
|
||||||
|
|
||||||
### ElasticsearchRepository
|
### ElasticsearchRepository
|
||||||
|
|||||||
@@ -4,12 +4,12 @@
|
|||||||
|
|
||||||
<groupId>org.springframework.data</groupId>
|
<groupId>org.springframework.data</groupId>
|
||||||
<artifactId>spring-data-elasticsearch</artifactId>
|
<artifactId>spring-data-elasticsearch</artifactId>
|
||||||
<version>3.0.0.RELEASE</version>
|
<version>3.0.8.RELEASE</version>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.data.build</groupId>
|
<groupId>org.springframework.data.build</groupId>
|
||||||
<artifactId>spring-data-parent</artifactId>
|
<artifactId>spring-data-parent</artifactId>
|
||||||
<version>2.0.0.RELEASE</version>
|
<version>2.0.8.RELEASE</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<name>Spring Data Elasticsearch</name>
|
<name>Spring Data Elasticsearch</name>
|
||||||
@@ -20,7 +20,8 @@
|
|||||||
<commonscollections>3.2.1</commonscollections>
|
<commonscollections>3.2.1</commonscollections>
|
||||||
<commonslang>2.6</commonslang>
|
<commonslang>2.6</commonslang>
|
||||||
<elasticsearch>5.5.0</elasticsearch>
|
<elasticsearch>5.5.0</elasticsearch>
|
||||||
<springdata.commons>2.0.0.RELEASE</springdata.commons>
|
<log4j>2.8.2</log4j>
|
||||||
|
<springdata.commons>2.0.8.RELEASE</springdata.commons>
|
||||||
<java-module-name>spring.data.elasticsearch</java-module-name>
|
<java-module-name>spring.data.elasticsearch</java-module-name>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
@@ -80,31 +81,41 @@
|
|||||||
<groupId>commons-logging</groupId>
|
<groupId>commons-logging</groupId>
|
||||||
<artifactId>commons-logging</artifactId>
|
<artifactId>commons-logging</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.elasticsearch.plugin</groupId>
|
||||||
|
<artifactId>transport-netty3-client</artifactId>
|
||||||
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.elasticsearch.plugin</groupId>
|
||||||
|
<artifactId>transport-netty4-client</artifactId>
|
||||||
|
<version>${elasticsearch}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.slf4j</groupId>
|
<groupId>org.slf4j</groupId>
|
||||||
<artifactId>log4j-over-slf4j</artifactId>
|
<artifactId>log4j-over-slf4j</artifactId>
|
||||||
<version>1.7.22</version>
|
<version>${slf4j}</version>
|
||||||
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.logging.log4j</groupId>
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
<artifactId>log4j-core</artifactId>
|
<artifactId>log4j-core</artifactId>
|
||||||
<version>2.8.2</version>
|
<version>${log4j}</version>
|
||||||
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Jackson JSON Mapper -->
|
<!-- Jackson JSON Mapper -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-core</artifactId>
|
<artifactId>jackson-core</artifactId>
|
||||||
<version>${jackson}</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-databind</artifactId>
|
<artifactId>jackson-databind</artifactId>
|
||||||
<version>${jackson}</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- CDI -->
|
<!-- CDI -->
|
||||||
@@ -145,7 +156,7 @@
|
|||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Upgrade xbean to 4.5 to prevent incompatibilities due to ASM versions -->
|
<!-- Upgrade xbean to 4.5 to prevent incompatibilities due to ASM versions -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.xbean</groupId>
|
<groupId>org.apache.xbean</groupId>
|
||||||
@@ -161,14 +172,6 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<!-- required by elasticsearch -->
|
|
||||||
<groupId>org.elasticsearch.plugin</groupId>
|
|
||||||
<artifactId>transport-netty4-client</artifactId>
|
|
||||||
<version>${elasticsearch}</version>
|
|
||||||
<!--<scope>test</scope>-->
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.projectlombok</groupId>
|
<groupId>org.projectlombok</groupId>
|
||||||
<artifactId>lombok</artifactId>
|
<artifactId>lombok</artifactId>
|
||||||
@@ -176,8 +179,6 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@@ -1,51 +1,51 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch;
|
package org.springframework.data.elasticsearch;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ElasticsearchException
|
* ElasticsearchException
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public class ElasticsearchException extends RuntimeException {
|
public class ElasticsearchException extends RuntimeException {
|
||||||
|
|
||||||
private Map<String, String> failedDocuments;
|
private Map<String, String> failedDocuments;
|
||||||
|
|
||||||
public ElasticsearchException(String message) {
|
public ElasticsearchException(String message) {
|
||||||
super(message);
|
super(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ElasticsearchException(String message, Throwable cause) {
|
public ElasticsearchException(String message, Throwable cause) {
|
||||||
super(message, cause);
|
super(message, cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ElasticsearchException(String message, Throwable cause, Map<String, String> failedDocuments) {
|
public ElasticsearchException(String message, Throwable cause, Map<String, String> failedDocuments) {
|
||||||
super(message, cause);
|
super(message, cause);
|
||||||
this.failedDocuments = failedDocuments;
|
this.failedDocuments = failedDocuments;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ElasticsearchException(String message, Map<String, String> failedDocuments) {
|
public ElasticsearchException(String message, Map<String, String> failedDocuments) {
|
||||||
super(message);
|
super(message);
|
||||||
this.failedDocuments = failedDocuments;
|
this.failedDocuments = failedDocuments;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, String> getFailedDocuments() {
|
public Map<String, String> getFailedDocuments() {
|
||||||
return failedDocuments;
|
return failedDocuments;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,51 +1,51 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.annotations;
|
package org.springframework.data.elasticsearch.annotations;
|
||||||
|
|
||||||
import java.lang.annotation.*;
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
import org.springframework.data.annotation.Persistent;
|
import org.springframework.data.annotation.Persistent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Document
|
* Document
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Mason Chan
|
* @author Mason Chan
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Persistent
|
@Persistent
|
||||||
@Inherited
|
@Inherited
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Target({ElementType.TYPE})
|
@Target({ElementType.TYPE})
|
||||||
public @interface Document {
|
public @interface Document {
|
||||||
|
|
||||||
String indexName();
|
String indexName();
|
||||||
|
|
||||||
String type() default "";
|
String type() default "";
|
||||||
|
|
||||||
boolean useServerConfiguration() default false;
|
boolean useServerConfiguration() default false;
|
||||||
|
|
||||||
short shards() default 5;
|
short shards() default 5;
|
||||||
|
|
||||||
short replicas() default 1;
|
short replicas() default 1;
|
||||||
|
|
||||||
String refreshInterval() default "1s";
|
String refreshInterval() default "1s";
|
||||||
|
|
||||||
String indexStoreType() default "fs";
|
String indexStoreType() default "fs";
|
||||||
|
|
||||||
boolean createIndex() default true;
|
boolean createIndex() default true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,58 +1,58 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.annotations;
|
package org.springframework.data.elasticsearch.annotations;
|
||||||
|
|
||||||
import java.lang.annotation.Documented;
|
import java.lang.annotation.Documented;
|
||||||
import java.lang.annotation.ElementType;
|
import java.lang.annotation.ElementType;
|
||||||
import java.lang.annotation.Inherited;
|
import java.lang.annotation.Inherited;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.lang.annotation.Target;
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
* @author Jonathan Yan
|
* @author Jonathan Yan
|
||||||
* @author Jakub Vavrik
|
* @author Jakub Vavrik
|
||||||
* @author Kevin Leturc
|
* @author Kevin Leturc
|
||||||
*/
|
*/
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Target(ElementType.FIELD)
|
@Target(ElementType.FIELD)
|
||||||
@Documented
|
@Documented
|
||||||
@Inherited
|
@Inherited
|
||||||
public @interface Field {
|
public @interface Field {
|
||||||
|
|
||||||
FieldType type() default FieldType.Auto;
|
FieldType type() default FieldType.Auto;
|
||||||
|
|
||||||
boolean index() default true;
|
boolean index() default true;
|
||||||
|
|
||||||
DateFormat format() default DateFormat.none;
|
DateFormat format() default DateFormat.none;
|
||||||
|
|
||||||
String pattern() default "";
|
String pattern() default "";
|
||||||
|
|
||||||
boolean store() default false;
|
boolean store() default false;
|
||||||
|
|
||||||
boolean fielddata() default false;
|
boolean fielddata() default false;
|
||||||
|
|
||||||
String searchAnalyzer() default "";
|
String searchAnalyzer() default "";
|
||||||
|
|
||||||
String analyzer() default "";
|
String analyzer() default "";
|
||||||
|
|
||||||
String[] ignoreFields() default {};
|
String[] ignoreFields() default {};
|
||||||
|
|
||||||
boolean includeInParent() default false;
|
boolean includeInParent() default false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.annotations;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Artur Konczak
|
|
||||||
* @author Mohsin Husen
|
|
||||||
* @author Alexander Volz
|
|
||||||
* @author Dennis Maaß
|
|
||||||
*/
|
|
||||||
public enum FieldIndex {
|
|
||||||
not_analyzed, analyzed, no
|
|
||||||
}
|
|
||||||
@@ -21,5 +21,17 @@ package org.springframework.data.elasticsearch.annotations;
|
|||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
*/
|
*/
|
||||||
public enum FieldType {
|
public enum FieldType {
|
||||||
text, Integer, Long, Date, Float, Double, Boolean, Object, Auto, Nested, Ip, Attachment, keyword
|
Text,
|
||||||
|
Integer,
|
||||||
|
Long,
|
||||||
|
Date,
|
||||||
|
Float,
|
||||||
|
Double,
|
||||||
|
Boolean,
|
||||||
|
Object,
|
||||||
|
Auto,
|
||||||
|
Nested,
|
||||||
|
Ip,
|
||||||
|
Attachment,
|
||||||
|
Keyword
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,11 +33,15 @@ public @interface InnerField {
|
|||||||
|
|
||||||
boolean index() default true;
|
boolean index() default true;
|
||||||
|
|
||||||
|
DateFormat format() default DateFormat.none;
|
||||||
|
|
||||||
|
String pattern() default "";
|
||||||
|
|
||||||
boolean store() default false;
|
boolean store() default false;
|
||||||
|
|
||||||
boolean fielddata() default false;
|
boolean fielddata() default false;
|
||||||
|
|
||||||
String searchAnalyzer() default "";
|
String searchAnalyzer() default "";
|
||||||
|
|
||||||
String indexAnalyzer() default "";
|
String analyzer() default "";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,45 +1,45 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.annotations;
|
package org.springframework.data.elasticsearch.annotations;
|
||||||
|
|
||||||
import java.lang.annotation.*;
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query
|
* Query
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Target(ElementType.METHOD)
|
@Target(ElementType.METHOD)
|
||||||
@Documented
|
@Documented
|
||||||
public @interface Query {
|
public @interface Query {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Elasticsearch query to be used when executing query. May contain placeholders eg. ?0
|
* Elasticsearch query to be used when executing query. May contain placeholders eg. ?0
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
String value() default "";
|
String value() default "";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Named Query Named looked up by repository.
|
* Named Query Named looked up by repository.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
String name() default "";
|
String name() default "";
|
||||||
}
|
}
|
||||||
|
|||||||
+267
-156
@@ -1,156 +1,267 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.client;
|
package org.springframework.data.elasticsearch.client;
|
||||||
|
|
||||||
import static org.apache.commons.lang.StringUtils.*;
|
import static org.apache.commons.lang.StringUtils.*;
|
||||||
|
|
||||||
import java.net.InetAddress;
|
import io.netty.util.ThreadDeathWatcher;
|
||||||
import java.util.Properties;
|
import io.netty.util.concurrent.GlobalEventExecutor;
|
||||||
|
|
||||||
import org.elasticsearch.client.transport.TransportClient;
|
import java.net.InetAddress;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import java.util.ArrayList;
|
||||||
import org.elasticsearch.common.transport.InetSocketTransportAddress;
|
import java.util.Arrays;
|
||||||
import org.elasticsearch.transport.client.PreBuiltTransportClient;
|
import java.util.Collection;
|
||||||
import org.slf4j.Logger;
|
import java.util.Collections;
|
||||||
import org.slf4j.LoggerFactory;
|
import java.util.List;
|
||||||
import org.springframework.beans.factory.DisposableBean;
|
import java.util.Properties;
|
||||||
import org.springframework.beans.factory.FactoryBean;
|
import java.util.concurrent.TimeUnit;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
|
||||||
import org.springframework.util.Assert;
|
import org.elasticsearch.client.transport.TransportClient;
|
||||||
|
import org.elasticsearch.common.SuppressForbidden;
|
||||||
/**
|
import org.elasticsearch.common.network.NetworkModule;
|
||||||
* TransportClientFactoryBean
|
import org.elasticsearch.common.settings.Settings;
|
||||||
*
|
import org.elasticsearch.common.transport.InetSocketTransportAddress;
|
||||||
* @author Rizwan Idrees
|
import org.elasticsearch.index.reindex.ReindexPlugin;
|
||||||
* @author Mohsin Husen
|
import org.elasticsearch.join.ParentJoinPlugin;
|
||||||
* @author Jakub Vavrik
|
import org.elasticsearch.percolator.PercolatorPlugin;
|
||||||
* @author Piotr Betkier
|
import org.elasticsearch.plugins.Plugin;
|
||||||
*/
|
import org.elasticsearch.script.mustache.MustachePlugin;
|
||||||
|
import org.elasticsearch.transport.Netty4Plugin;
|
||||||
public class TransportClientFactoryBean implements FactoryBean<TransportClient>, InitializingBean, DisposableBean {
|
import org.elasticsearch.transport.client.PreBuiltTransportClient;
|
||||||
|
import org.slf4j.Logger;
|
||||||
private static final Logger logger = LoggerFactory.getLogger(TransportClientFactoryBean.class);
|
import org.slf4j.LoggerFactory;
|
||||||
private String clusterNodes = "127.0.0.1:9300";
|
import org.springframework.beans.factory.DisposableBean;
|
||||||
private String clusterName = "elasticsearch";
|
import org.springframework.beans.factory.FactoryBean;
|
||||||
private Boolean clientTransportSniff = true;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
private Boolean clientIgnoreClusterName = Boolean.FALSE;
|
import org.springframework.util.Assert;
|
||||||
private String clientPingTimeout = "5s";
|
import org.springframework.util.ClassUtils;
|
||||||
private String clientNodesSamplerInterval = "5s";
|
|
||||||
private TransportClient client;
|
/**
|
||||||
private Properties properties;
|
* TransportClientFactoryBean
|
||||||
static final String COLON = ":";
|
*
|
||||||
static final String COMMA = ",";
|
* @author Rizwan Idrees
|
||||||
|
* @author Mohsin Husen
|
||||||
@Override
|
* @author Jakub Vavrik
|
||||||
public void destroy() throws Exception {
|
* @author Piotr Betkier
|
||||||
try {
|
*/
|
||||||
logger.info("Closing elasticSearch client");
|
|
||||||
if (client != null) {
|
public class TransportClientFactoryBean implements FactoryBean<TransportClient>, InitializingBean, DisposableBean {
|
||||||
client.close();
|
|
||||||
}
|
private static final Logger logger = LoggerFactory.getLogger(TransportClientFactoryBean.class);
|
||||||
} catch (final Exception e) {
|
private String clusterNodes = "127.0.0.1:9300";
|
||||||
logger.error("Error closing ElasticSearch client: ", e);
|
private String clusterName = "elasticsearch";
|
||||||
}
|
private Boolean clientTransportSniff = true;
|
||||||
}
|
private Boolean clientIgnoreClusterName = Boolean.FALSE;
|
||||||
|
private String clientPingTimeout = "5s";
|
||||||
@Override
|
private String clientNodesSamplerInterval = "5s";
|
||||||
public TransportClient getObject() throws Exception {
|
private TransportClient client;
|
||||||
return client;
|
private Properties properties;
|
||||||
}
|
static final String COLON = ":";
|
||||||
|
static final String COMMA = ",";
|
||||||
@Override
|
|
||||||
public Class<TransportClient> getObjectType() {
|
@Override
|
||||||
return TransportClient.class;
|
public void destroy() throws Exception {
|
||||||
}
|
try {
|
||||||
|
logger.info("Closing elasticSearch client");
|
||||||
@Override
|
if (client != null) {
|
||||||
public boolean isSingleton() {
|
client.close();
|
||||||
return false;
|
}
|
||||||
}
|
} catch (final Exception e) {
|
||||||
|
logger.error("Error closing ElasticSearch client: ", e);
|
||||||
@Override
|
}
|
||||||
public void afterPropertiesSet() throws Exception {
|
}
|
||||||
buildClient();
|
|
||||||
}
|
@Override
|
||||||
|
public TransportClient getObject() throws Exception {
|
||||||
protected void buildClient() throws Exception {
|
return client;
|
||||||
|
}
|
||||||
client = new PreBuiltTransportClient(settings());
|
|
||||||
Assert.hasText(clusterNodes, "[Assertion failed] clusterNodes settings missing.");
|
@Override
|
||||||
for (String clusterNode : split(clusterNodes, COMMA)) {
|
public Class<TransportClient> getObjectType() {
|
||||||
String hostName = substringBeforeLast(clusterNode, COLON);
|
return TransportClient.class;
|
||||||
String port = substringAfterLast(clusterNode, COLON);
|
}
|
||||||
Assert.hasText(hostName, "[Assertion failed] missing host name in 'clusterNodes'");
|
|
||||||
Assert.hasText(port, "[Assertion failed] missing port in 'clusterNodes'");
|
@Override
|
||||||
logger.info("adding transport node : " + clusterNode);
|
public boolean isSingleton() {
|
||||||
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(hostName), Integer.valueOf(port)));
|
return false;
|
||||||
}
|
}
|
||||||
client.connectedNodes();
|
|
||||||
}
|
@Override
|
||||||
|
public void afterPropertiesSet() throws Exception {
|
||||||
private Settings settings() {
|
buildClient();
|
||||||
if (properties != null) {
|
}
|
||||||
return Settings.builder().put(properties).build();
|
|
||||||
}
|
protected void buildClient() throws Exception {
|
||||||
return Settings.builder()
|
|
||||||
.put("cluster.name", clusterName)
|
client = new SpringDataTransportClient(settings());
|
||||||
.put("client.transport.sniff", clientTransportSniff)
|
Assert.hasText(clusterNodes, "[Assertion failed] clusterNodes settings missing.");
|
||||||
.put("client.transport.ignore_cluster_name", clientIgnoreClusterName)
|
for (String clusterNode : split(clusterNodes, COMMA)) {
|
||||||
.put("client.transport.ping_timeout", clientPingTimeout)
|
String hostName = substringBeforeLast(clusterNode, COLON);
|
||||||
.put("client.transport.nodes_sampler_interval", clientNodesSamplerInterval)
|
String port = substringAfterLast(clusterNode, COLON);
|
||||||
.build();
|
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);
|
||||||
public void setClusterNodes(String clusterNodes) {
|
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(hostName), Integer.valueOf(port)));
|
||||||
this.clusterNodes = clusterNodes;
|
}
|
||||||
}
|
client.connectedNodes();
|
||||||
|
}
|
||||||
public void setClusterName(String clusterName) {
|
|
||||||
this.clusterName = clusterName;
|
private Settings settings() {
|
||||||
}
|
if (properties != null) {
|
||||||
|
return Settings.builder().put(properties).build();
|
||||||
public void setClientTransportSniff(Boolean clientTransportSniff) {
|
}
|
||||||
this.clientTransportSniff = clientTransportSniff;
|
return Settings.builder()
|
||||||
}
|
.put("cluster.name", clusterName)
|
||||||
|
.put("client.transport.sniff", clientTransportSniff)
|
||||||
public String getClientNodesSamplerInterval() {
|
.put("client.transport.ignore_cluster_name", clientIgnoreClusterName)
|
||||||
return clientNodesSamplerInterval;
|
.put("client.transport.ping_timeout", clientPingTimeout)
|
||||||
}
|
.put("client.transport.nodes_sampler_interval", clientNodesSamplerInterval)
|
||||||
|
.build();
|
||||||
public void setClientNodesSamplerInterval(String clientNodesSamplerInterval) {
|
}
|
||||||
this.clientNodesSamplerInterval = clientNodesSamplerInterval;
|
|
||||||
}
|
public void setClusterNodes(String clusterNodes) {
|
||||||
|
this.clusterNodes = clusterNodes;
|
||||||
public String getClientPingTimeout() {
|
}
|
||||||
return clientPingTimeout;
|
|
||||||
}
|
public void setClusterName(String clusterName) {
|
||||||
|
this.clusterName = clusterName;
|
||||||
public void setClientPingTimeout(String clientPingTimeout) {
|
}
|
||||||
this.clientPingTimeout = clientPingTimeout;
|
|
||||||
}
|
public void setClientTransportSniff(Boolean clientTransportSniff) {
|
||||||
|
this.clientTransportSniff = clientTransportSniff;
|
||||||
public Boolean getClientIgnoreClusterName() {
|
}
|
||||||
return clientIgnoreClusterName;
|
|
||||||
}
|
public String getClientNodesSamplerInterval() {
|
||||||
|
return clientNodesSamplerInterval;
|
||||||
public void setClientIgnoreClusterName(Boolean clientIgnoreClusterName) {
|
}
|
||||||
this.clientIgnoreClusterName = clientIgnoreClusterName;
|
|
||||||
}
|
public void setClientNodesSamplerInterval(String clientNodesSamplerInterval) {
|
||||||
|
this.clientNodesSamplerInterval = clientNodesSamplerInterval;
|
||||||
public void setProperties(Properties properties) {
|
}
|
||||||
this.properties = properties;
|
|
||||||
}
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pretty exact copy of {@link PreBuiltTransportClient} except that we're inspecting the classpath for Netty
|
||||||
|
* dependencies to only include the ones available. {@link PreBuiltTransportClient} expects both Netty 3 and Netty 4
|
||||||
|
* to be present.
|
||||||
|
*
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @see https://github.com/elastic/elasticsearch/issues/31240
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private static class SpringDataTransportClient extends TransportClient {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Netty wants to do some unwelcome things like use unsafe and replace a private field, or use a poorly considered
|
||||||
|
* buffer recycler. This method disables these things by default, but can be overridden by setting the corresponding
|
||||||
|
* system properties.
|
||||||
|
*/
|
||||||
|
private static void initializeNetty() {
|
||||||
|
/*
|
||||||
|
* We disable three pieces of Netty functionality here:
|
||||||
|
* - we disable Netty from being unsafe
|
||||||
|
* - we disable Netty from replacing the selector key set
|
||||||
|
* - we disable Netty from using the recycler
|
||||||
|
*
|
||||||
|
* While permissions are needed to read and set these, the permissions needed here are innocuous and thus should simply be granted
|
||||||
|
* rather than us handling a security exception here.
|
||||||
|
*/
|
||||||
|
setSystemPropertyIfUnset("io.netty.noUnsafe", Boolean.toString(true));
|
||||||
|
setSystemPropertyIfUnset("io.netty.noKeySetOptimization", Boolean.toString(true));
|
||||||
|
setSystemPropertyIfUnset("io.netty.recycler.maxCapacityPerThread", Integer.toString(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressForbidden(reason = "set system properties to configure Netty")
|
||||||
|
private static void setSystemPropertyIfUnset(final String key, final String value) {
|
||||||
|
final String currentValue = System.getProperty(key);
|
||||||
|
if (currentValue == null) {
|
||||||
|
System.setProperty(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final List<String> OPTIONAL_DEPENDENCIES = Arrays.asList( //
|
||||||
|
"org.elasticsearch.transport.Netty3Plugin", //
|
||||||
|
"org.elasticsearch.transport.Netty4Plugin");
|
||||||
|
|
||||||
|
private static final Collection<Class<? extends Plugin>> PRE_INSTALLED_PLUGINS;
|
||||||
|
|
||||||
|
static {
|
||||||
|
|
||||||
|
initializeNetty();
|
||||||
|
|
||||||
|
List<Class<? extends Plugin>> plugins = new ArrayList<>();
|
||||||
|
boolean found = false;
|
||||||
|
|
||||||
|
for (String dependency : OPTIONAL_DEPENDENCIES) {
|
||||||
|
try {
|
||||||
|
plugins.add((Class<? extends Plugin>) ClassUtils.forName(dependency,
|
||||||
|
SpringDataTransportClient.class.getClassLoader()));
|
||||||
|
found = true;
|
||||||
|
} catch (ClassNotFoundException | LinkageError e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.state(found, "Neither Netty 3 or Netty 4 plugin found on the classpath. One of them is required to run the transport client!");
|
||||||
|
|
||||||
|
plugins.add(ReindexPlugin.class);
|
||||||
|
plugins.add(PercolatorPlugin.class);
|
||||||
|
plugins.add(MustachePlugin.class);
|
||||||
|
plugins.add(ParentJoinPlugin.class);
|
||||||
|
|
||||||
|
PRE_INSTALLED_PLUGINS = Collections.unmodifiableList(plugins);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SpringDataTransportClient(Settings settings) {
|
||||||
|
super(settings, PRE_INSTALLED_PLUGINS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
super.close();
|
||||||
|
if (NetworkModule.TRANSPORT_TYPE_SETTING.exists(settings) == false
|
||||||
|
|| NetworkModule.TRANSPORT_TYPE_SETTING.get(settings).equals(Netty4Plugin.NETTY_TRANSPORT_NAME)) {
|
||||||
|
try {
|
||||||
|
GlobalEventExecutor.INSTANCE.awaitInactivity(5, TimeUnit.SECONDS);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ThreadDeathWatcher.awaitInactivity(5, TimeUnit.SECONDS);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+41
-41
@@ -1,41 +1,41 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.config;
|
package org.springframework.data.elasticsearch.config;
|
||||||
|
|
||||||
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
|
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
|
||||||
import org.springframework.data.elasticsearch.repository.config.ElasticsearchRepositoryConfigExtension;
|
import org.springframework.data.elasticsearch.repository.config.ElasticsearchRepositoryConfigExtension;
|
||||||
import org.springframework.data.repository.config.RepositoryBeanDefinitionParser;
|
import org.springframework.data.repository.config.RepositoryBeanDefinitionParser;
|
||||||
import org.springframework.data.repository.config.RepositoryConfigurationExtension;
|
import org.springframework.data.repository.config.RepositoryConfigurationExtension;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ElasticsearchNamespaceHandler
|
* ElasticsearchNamespaceHandler
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ElasticsearchNamespaceHandler extends NamespaceHandlerSupport {
|
public class ElasticsearchNamespaceHandler extends NamespaceHandlerSupport {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init() {
|
public void init() {
|
||||||
RepositoryConfigurationExtension extension = new ElasticsearchRepositoryConfigExtension();
|
RepositoryConfigurationExtension extension = new ElasticsearchRepositoryConfigExtension();
|
||||||
RepositoryBeanDefinitionParser parser = new RepositoryBeanDefinitionParser(extension);
|
RepositoryBeanDefinitionParser parser = new RepositoryBeanDefinitionParser(extension);
|
||||||
|
|
||||||
registerBeanDefinitionParser("repositories", parser);
|
registerBeanDefinitionParser("repositories", parser);
|
||||||
registerBeanDefinitionParser("node-client", new NodeClientBeanDefinitionParser());
|
registerBeanDefinitionParser("node-client", new NodeClientBeanDefinitionParser());
|
||||||
registerBeanDefinitionParser("transport-client", new TransportClientBeanDefinitionParser());
|
registerBeanDefinitionParser("transport-client", new TransportClientBeanDefinitionParser());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+56
-56
@@ -1,56 +1,56 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.config;
|
package org.springframework.data.elasticsearch.config;
|
||||||
|
|
||||||
import org.springframework.beans.factory.support.AbstractBeanDefinition;
|
import org.springframework.beans.factory.support.AbstractBeanDefinition;
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||||
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
|
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
|
||||||
import org.springframework.beans.factory.xml.ParserContext;
|
import org.springframework.beans.factory.xml.ParserContext;
|
||||||
import org.springframework.data.elasticsearch.client.TransportClientFactoryBean;
|
import org.springframework.data.elasticsearch.client.TransportClientFactoryBean;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TransportClientBeanDefinitionParser
|
* TransportClientBeanDefinitionParser
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class TransportClientBeanDefinitionParser extends AbstractBeanDefinitionParser {
|
public class TransportClientBeanDefinitionParser extends AbstractBeanDefinitionParser {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
|
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
|
||||||
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(TransportClientFactoryBean.class);
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(TransportClientFactoryBean.class);
|
||||||
setConfigurations(element, builder);
|
setConfigurations(element, builder);
|
||||||
return getSourcedBeanDefinition(builder, element, parserContext);
|
return getSourcedBeanDefinition(builder, element, parserContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setConfigurations(Element element, BeanDefinitionBuilder builder) {
|
private void setConfigurations(Element element, BeanDefinitionBuilder builder) {
|
||||||
builder.addPropertyValue("clusterNodes", element.getAttribute("cluster-nodes"));
|
builder.addPropertyValue("clusterNodes", element.getAttribute("cluster-nodes"));
|
||||||
builder.addPropertyValue("clusterName", element.getAttribute("cluster-name"));
|
builder.addPropertyValue("clusterName", element.getAttribute("cluster-name"));
|
||||||
builder.addPropertyValue("clientTransportSniff", Boolean.valueOf(element.getAttribute("client-transport-sniff")));
|
builder.addPropertyValue("clientTransportSniff", Boolean.valueOf(element.getAttribute("client-transport-sniff")));
|
||||||
builder.addPropertyValue("clientIgnoreClusterName", Boolean.valueOf(element.getAttribute("client-transport-ignore-cluster-name")));
|
builder.addPropertyValue("clientIgnoreClusterName", Boolean.valueOf(element.getAttribute("client-transport-ignore-cluster-name")));
|
||||||
builder.addPropertyValue("clientPingTimeout", element.getAttribute("client-transport-ping-timeout"));
|
builder.addPropertyValue("clientPingTimeout", element.getAttribute("client-transport-ping-timeout"));
|
||||||
builder.addPropertyValue("clientNodesSamplerInterval", element.getAttribute("client-transport-nodes-sampler-interval"));
|
builder.addPropertyValue("clientNodesSamplerInterval", element.getAttribute("client-transport-nodes-sampler-interval"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private AbstractBeanDefinition getSourcedBeanDefinition(BeanDefinitionBuilder builder, Element source,
|
private AbstractBeanDefinition getSourcedBeanDefinition(BeanDefinitionBuilder builder, Element source,
|
||||||
ParserContext context) {
|
ParserContext context) {
|
||||||
AbstractBeanDefinition definition = builder.getBeanDefinition();
|
AbstractBeanDefinition definition = builder.getBeanDefinition();
|
||||||
definition.setSource(context.extractSource(source));
|
definition.setSource(context.extractSource(source));
|
||||||
return definition;
|
return definition;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+206
-206
@@ -1,206 +1,206 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core;
|
package org.springframework.data.elasticsearch.core;
|
||||||
|
|
||||||
import static org.elasticsearch.index.query.Operator.AND;
|
import static org.elasticsearch.index.query.Operator.AND;
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.*;
|
import static org.elasticsearch.index.query.QueryBuilders.*;
|
||||||
import static org.springframework.data.elasticsearch.core.query.Criteria.*;
|
import static org.springframework.data.elasticsearch.core.query.Criteria.*;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ListIterator;
|
import java.util.ListIterator;
|
||||||
|
|
||||||
import org.apache.lucene.queryparser.flexible.core.util.StringUtils;
|
import org.apache.lucene.queryparser.flexible.core.util.StringUtils;
|
||||||
import org.elasticsearch.index.query.*;
|
import org.elasticsearch.index.query.*;
|
||||||
import org.springframework.data.elasticsearch.core.query.Criteria;
|
import org.springframework.data.elasticsearch.core.query.Criteria;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CriteriaQueryProcessor
|
* CriteriaQueryProcessor
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Franck Marchand
|
* @author Franck Marchand
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
*/
|
*/
|
||||||
class CriteriaQueryProcessor {
|
class CriteriaQueryProcessor {
|
||||||
|
|
||||||
|
|
||||||
QueryBuilder createQueryFromCriteria(Criteria criteria) {
|
QueryBuilder createQueryFromCriteria(Criteria criteria) {
|
||||||
if (criteria == null)
|
if (criteria == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
List<QueryBuilder> shouldQueryBuilderList = new LinkedList<>();
|
List<QueryBuilder> shouldQueryBuilderList = new LinkedList<>();
|
||||||
List<QueryBuilder> mustNotQueryBuilderList = new LinkedList<>();
|
List<QueryBuilder> mustNotQueryBuilderList = new LinkedList<>();
|
||||||
List<QueryBuilder> mustQueryBuilderList = new LinkedList<>();
|
List<QueryBuilder> mustQueryBuilderList = new LinkedList<>();
|
||||||
|
|
||||||
ListIterator<Criteria> chainIterator = criteria.getCriteriaChain().listIterator();
|
ListIterator<Criteria> chainIterator = criteria.getCriteriaChain().listIterator();
|
||||||
|
|
||||||
QueryBuilder firstQuery = null;
|
QueryBuilder firstQuery = null;
|
||||||
boolean negateFirstQuery = false;
|
boolean negateFirstQuery = false;
|
||||||
|
|
||||||
while (chainIterator.hasNext()) {
|
while (chainIterator.hasNext()) {
|
||||||
Criteria chainedCriteria = chainIterator.next();
|
Criteria chainedCriteria = chainIterator.next();
|
||||||
QueryBuilder queryFragmentForCriteria = createQueryFragmentForCriteria(chainedCriteria);
|
QueryBuilder queryFragmentForCriteria = createQueryFragmentForCriteria(chainedCriteria);
|
||||||
if (queryFragmentForCriteria != null) {
|
if (queryFragmentForCriteria != null) {
|
||||||
if (firstQuery == null) {
|
if (firstQuery == null) {
|
||||||
firstQuery = queryFragmentForCriteria;
|
firstQuery = queryFragmentForCriteria;
|
||||||
negateFirstQuery = chainedCriteria.isNegating();
|
negateFirstQuery = chainedCriteria.isNegating();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (chainedCriteria.isOr()) {
|
if (chainedCriteria.isOr()) {
|
||||||
shouldQueryBuilderList.add(queryFragmentForCriteria);
|
shouldQueryBuilderList.add(queryFragmentForCriteria);
|
||||||
} else if (chainedCriteria.isNegating()) {
|
} else if (chainedCriteria.isNegating()) {
|
||||||
mustNotQueryBuilderList.add(queryFragmentForCriteria);
|
mustNotQueryBuilderList.add(queryFragmentForCriteria);
|
||||||
} else {
|
} else {
|
||||||
mustQueryBuilderList.add(queryFragmentForCriteria);
|
mustQueryBuilderList.add(queryFragmentForCriteria);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (firstQuery != null) {
|
if (firstQuery != null) {
|
||||||
if (!shouldQueryBuilderList.isEmpty() && mustNotQueryBuilderList.isEmpty() && mustQueryBuilderList.isEmpty()) {
|
if (!shouldQueryBuilderList.isEmpty() && mustNotQueryBuilderList.isEmpty() && mustQueryBuilderList.isEmpty()) {
|
||||||
shouldQueryBuilderList.add(0, firstQuery);
|
shouldQueryBuilderList.add(0, firstQuery);
|
||||||
} else {
|
} else {
|
||||||
if (negateFirstQuery) {
|
if (negateFirstQuery) {
|
||||||
mustNotQueryBuilderList.add(0, firstQuery);
|
mustNotQueryBuilderList.add(0, firstQuery);
|
||||||
} else {
|
} else {
|
||||||
mustQueryBuilderList.add(0, firstQuery);
|
mustQueryBuilderList.add(0, firstQuery);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BoolQueryBuilder query = null;
|
BoolQueryBuilder query = null;
|
||||||
|
|
||||||
if (!shouldQueryBuilderList.isEmpty() || !mustNotQueryBuilderList.isEmpty() || !mustQueryBuilderList.isEmpty()) {
|
if (!shouldQueryBuilderList.isEmpty() || !mustNotQueryBuilderList.isEmpty() || !mustQueryBuilderList.isEmpty()) {
|
||||||
|
|
||||||
query = boolQuery();
|
query = boolQuery();
|
||||||
|
|
||||||
for (QueryBuilder qb : shouldQueryBuilderList) {
|
for (QueryBuilder qb : shouldQueryBuilderList) {
|
||||||
query.should(qb);
|
query.should(qb);
|
||||||
}
|
}
|
||||||
for (QueryBuilder qb : mustNotQueryBuilderList) {
|
for (QueryBuilder qb : mustNotQueryBuilderList) {
|
||||||
query.mustNot(qb);
|
query.mustNot(qb);
|
||||||
}
|
}
|
||||||
for (QueryBuilder qb : mustQueryBuilderList) {
|
for (QueryBuilder qb : mustQueryBuilderList) {
|
||||||
query.must(qb);
|
query.must(qb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private QueryBuilder createQueryFragmentForCriteria(Criteria chainedCriteria) {
|
private QueryBuilder createQueryFragmentForCriteria(Criteria chainedCriteria) {
|
||||||
if (chainedCriteria.getQueryCriteriaEntries().isEmpty())
|
if (chainedCriteria.getQueryCriteriaEntries().isEmpty())
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
Iterator<Criteria.CriteriaEntry> it = chainedCriteria.getQueryCriteriaEntries().iterator();
|
Iterator<Criteria.CriteriaEntry> it = chainedCriteria.getQueryCriteriaEntries().iterator();
|
||||||
boolean singeEntryCriteria = (chainedCriteria.getQueryCriteriaEntries().size() == 1);
|
boolean singeEntryCriteria = (chainedCriteria.getQueryCriteriaEntries().size() == 1);
|
||||||
|
|
||||||
String fieldName = chainedCriteria.getField().getName();
|
String fieldName = chainedCriteria.getField().getName();
|
||||||
Assert.notNull(fieldName, "Unknown field");
|
Assert.notNull(fieldName, "Unknown field");
|
||||||
QueryBuilder query = null;
|
QueryBuilder query = null;
|
||||||
|
|
||||||
if (singeEntryCriteria) {
|
if (singeEntryCriteria) {
|
||||||
Criteria.CriteriaEntry entry = it.next();
|
Criteria.CriteriaEntry entry = it.next();
|
||||||
query = processCriteriaEntry(entry, fieldName);
|
query = processCriteriaEntry(entry, fieldName);
|
||||||
} else {
|
} else {
|
||||||
query = boolQuery();
|
query = boolQuery();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
Criteria.CriteriaEntry entry = it.next();
|
Criteria.CriteriaEntry entry = it.next();
|
||||||
((BoolQueryBuilder) query).must(processCriteriaEntry(entry, fieldName));
|
((BoolQueryBuilder) query).must(processCriteriaEntry(entry, fieldName));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addBoost(query, chainedCriteria.getBoost());
|
addBoost(query, chainedCriteria.getBoost());
|
||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private QueryBuilder processCriteriaEntry(Criteria.CriteriaEntry entry,/* OperationKey key, Object value,*/ String fieldName) {
|
private QueryBuilder processCriteriaEntry(Criteria.CriteriaEntry entry,/* OperationKey key, Object value,*/ String fieldName) {
|
||||||
Object value = entry.getValue();
|
Object value = entry.getValue();
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
OperationKey key = entry.getKey();
|
OperationKey key = entry.getKey();
|
||||||
QueryBuilder query = null;
|
QueryBuilder query = null;
|
||||||
|
|
||||||
String searchText = StringUtils.toString(value);
|
String searchText = StringUtils.toString(value);
|
||||||
|
|
||||||
Iterable<Object> collection = null;
|
Iterable<Object> collection = null;
|
||||||
|
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case EQUALS:
|
case EQUALS:
|
||||||
query = queryStringQuery(searchText).field(fieldName).defaultOperator(AND);
|
query = queryStringQuery(searchText).field(fieldName).defaultOperator(AND);
|
||||||
break;
|
break;
|
||||||
case CONTAINS:
|
case CONTAINS:
|
||||||
query = queryStringQuery("*" + searchText + "*").field(fieldName).analyzeWildcard(true);
|
query = queryStringQuery("*" + searchText + "*").field(fieldName).analyzeWildcard(true);
|
||||||
break;
|
break;
|
||||||
case STARTS_WITH:
|
case STARTS_WITH:
|
||||||
query = queryStringQuery(searchText + "*").field(fieldName).analyzeWildcard(true);
|
query = queryStringQuery(searchText + "*").field(fieldName).analyzeWildcard(true);
|
||||||
break;
|
break;
|
||||||
case ENDS_WITH:
|
case ENDS_WITH:
|
||||||
query = queryStringQuery("*" + searchText).field(fieldName).analyzeWildcard(true);
|
query = queryStringQuery("*" + searchText).field(fieldName).analyzeWildcard(true);
|
||||||
break;
|
break;
|
||||||
case EXPRESSION:
|
case EXPRESSION:
|
||||||
query = queryStringQuery(searchText).field(fieldName);
|
query = queryStringQuery(searchText).field(fieldName);
|
||||||
break;
|
break;
|
||||||
case LESS_EQUAL:
|
case LESS_EQUAL:
|
||||||
query = rangeQuery(fieldName).lte(value);
|
query = rangeQuery(fieldName).lte(value);
|
||||||
break;
|
break;
|
||||||
case GREATER_EQUAL:
|
case GREATER_EQUAL:
|
||||||
query = rangeQuery(fieldName).gte(value);
|
query = rangeQuery(fieldName).gte(value);
|
||||||
break;
|
break;
|
||||||
case BETWEEN:
|
case BETWEEN:
|
||||||
Object[] ranges = (Object[]) value;
|
Object[] ranges = (Object[]) value;
|
||||||
query = rangeQuery(fieldName).from(ranges[0]).to(ranges[1]);
|
query = rangeQuery(fieldName).from(ranges[0]).to(ranges[1]);
|
||||||
break;
|
break;
|
||||||
case LESS:
|
case LESS:
|
||||||
query = rangeQuery(fieldName).lt(value);
|
query = rangeQuery(fieldName).lt(value);
|
||||||
break;
|
break;
|
||||||
case GREATER:
|
case GREATER:
|
||||||
query = rangeQuery(fieldName).gt(value);
|
query = rangeQuery(fieldName).gt(value);
|
||||||
break;
|
break;
|
||||||
case FUZZY:
|
case FUZZY:
|
||||||
query = fuzzyQuery(fieldName, searchText);
|
query = fuzzyQuery(fieldName, searchText);
|
||||||
break;
|
break;
|
||||||
case IN:
|
case IN:
|
||||||
query = boolQuery();
|
query = boolQuery();
|
||||||
collection = (Iterable<Object>) value;
|
collection = (Iterable<Object>) value;
|
||||||
for (Object item : collection) {
|
for (Object item : collection) {
|
||||||
((BoolQueryBuilder) query).should(queryStringQuery(item.toString()).field(fieldName));
|
((BoolQueryBuilder) query).should(queryStringQuery(item.toString()).field(fieldName));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NOT_IN:
|
case NOT_IN:
|
||||||
query = boolQuery();
|
query = boolQuery();
|
||||||
collection = (Iterable<Object>) value;
|
collection = (Iterable<Object>) value;
|
||||||
for (Object item : collection) {
|
for (Object item : collection) {
|
||||||
((BoolQueryBuilder) query).mustNot(queryStringQuery(item.toString()).field(fieldName));
|
((BoolQueryBuilder) query).mustNot(queryStringQuery(item.toString()).field(fieldName));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addBoost(QueryBuilder query, float boost) {
|
private void addBoost(QueryBuilder query, float boost) {
|
||||||
if (Float.isNaN(boost)) {
|
if (Float.isNaN(boost)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
query.boost(boost);
|
query.boost(boost);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPa
|
|||||||
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
|
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
|
||||||
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
||||||
import org.springframework.data.mapping.context.MappingContext;
|
import org.springframework.data.mapping.context.MappingContext;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonEncoding;
|
import com.fasterxml.jackson.core.JsonEncoding;
|
||||||
import com.fasterxml.jackson.core.JsonFactory;
|
import com.fasterxml.jackson.core.JsonFactory;
|
||||||
@@ -49,6 +50,7 @@ import com.fasterxml.jackson.core.JsonGenerator;
|
|||||||
* @author Petar Tahchiev
|
* @author Petar Tahchiev
|
||||||
* @author Young Gu
|
* @author Young Gu
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
|
* @author Chris White
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public class DefaultResultMapper extends AbstractResultMapper {
|
public class DefaultResultMapper extends AbstractResultMapper {
|
||||||
@@ -88,6 +90,7 @@ public class DefaultResultMapper extends AbstractResultMapper {
|
|||||||
result = mapEntity(hit.getFields().values(), clazz);
|
result = mapEntity(hit.getFields().values(), clazz);
|
||||||
}
|
}
|
||||||
setPersistentEntityId(result, hit.getId(), clazz);
|
setPersistentEntityId(result, hit.getId(), clazz);
|
||||||
|
setPersistentEntityVersion(result, hit.getVersion(), clazz);
|
||||||
populateScriptFields(result, hit);
|
populateScriptFields(result, hit);
|
||||||
results.add(result);
|
results.add(result);
|
||||||
}
|
}
|
||||||
@@ -153,6 +156,7 @@ public class DefaultResultMapper extends AbstractResultMapper {
|
|||||||
T result = mapEntity(response.getSourceAsString(), clazz);
|
T result = mapEntity(response.getSourceAsString(), clazz);
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
setPersistentEntityId(result, response.getId(), clazz);
|
setPersistentEntityId(result, response.getId(), clazz);
|
||||||
|
setPersistentEntityVersion(result, response.getVersion(), clazz);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -164,6 +168,7 @@ public class DefaultResultMapper extends AbstractResultMapper {
|
|||||||
if (!response.isFailed() && response.getResponse().isExists()) {
|
if (!response.isFailed() && response.getResponse().isExists()) {
|
||||||
T result = mapEntity(response.getResponse().getSourceAsString(), clazz);
|
T result = mapEntity(response.getResponse().getSourceAsString(), clazz);
|
||||||
setPersistentEntityId(result, response.getResponse().getId(), clazz);
|
setPersistentEntityId(result, response.getResponse().getId(), clazz);
|
||||||
|
setPersistentEntityVersion(result, response.getResponse().getVersion(), clazz);
|
||||||
list.add(result);
|
list.add(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -184,4 +189,20 @@ public class DefaultResultMapper extends AbstractResultMapper {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private <T> void setPersistentEntityVersion(T result, long version, Class<T> clazz) {
|
||||||
|
if (mappingContext != null && clazz.isAnnotationPresent(Document.class)) {
|
||||||
|
|
||||||
|
ElasticsearchPersistentEntity<?> persistentEntity = mappingContext.getPersistentEntity(clazz);
|
||||||
|
ElasticsearchPersistentProperty versionProperty = persistentEntity.getVersionProperty();
|
||||||
|
|
||||||
|
// Only deal with Long because ES versions are longs !
|
||||||
|
if (versionProperty != null && versionProperty.getType().isAssignableFrom(Long.class)) {
|
||||||
|
// check that a version was actually returned in the response, -1 would indicate that
|
||||||
|
// a search didn't request the version ids in the response, which would be an issue
|
||||||
|
Assert.isTrue(version != -1, "Version in response is -1");
|
||||||
|
persistentEntity.getPropertyAccessor(result).setProperty(versionProperty, version);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+577
-577
File diff suppressed because it is too large
Load Diff
+24
-5
@@ -59,7 +59,9 @@ import org.elasticsearch.index.query.QueryBuilders;
|
|||||||
import org.elasticsearch.search.SearchHit;
|
import org.elasticsearch.search.SearchHit;
|
||||||
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
|
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
|
||||||
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
|
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
|
||||||
|
import org.elasticsearch.search.sort.FieldSortBuilder;
|
||||||
import org.elasticsearch.search.sort.SortBuilder;
|
import org.elasticsearch.search.sort.SortBuilder;
|
||||||
|
import org.elasticsearch.search.sort.SortBuilders;
|
||||||
import org.elasticsearch.search.sort.SortOrder;
|
import org.elasticsearch.search.sort.SortOrder;
|
||||||
import org.elasticsearch.search.suggest.SuggestBuilder;
|
import org.elasticsearch.search.suggest.SuggestBuilder;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@@ -105,7 +107,10 @@ import static org.springframework.util.CollectionUtils.isEmpty;
|
|||||||
* @author Young Gu
|
* @author Young Gu
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Mark Janssen
|
* @author Mark Janssen
|
||||||
|
* @author Chris White
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
|
* @author Sascha Woo
|
||||||
|
* @author Ted Liang
|
||||||
*/
|
*/
|
||||||
public class ElasticsearchTemplate implements ElasticsearchOperations, ApplicationContextAware {
|
public class ElasticsearchTemplate implements ElasticsearchOperations, ApplicationContextAware {
|
||||||
|
|
||||||
@@ -730,7 +735,10 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
|
|||||||
|
|
||||||
private SearchRequestBuilder prepareScroll(Query query, long scrollTimeInMillis) {
|
private SearchRequestBuilder prepareScroll(Query query, long scrollTimeInMillis) {
|
||||||
SearchRequestBuilder requestBuilder = client.prepareSearch(toArray(query.getIndices()))
|
SearchRequestBuilder requestBuilder = client.prepareSearch(toArray(query.getIndices()))
|
||||||
.setTypes(toArray(query.getTypes())).setScroll(TimeValue.timeValueMillis(scrollTimeInMillis)).setFrom(0);
|
.setTypes(toArray(query.getTypes()))
|
||||||
|
.setScroll(TimeValue.timeValueMillis(scrollTimeInMillis))
|
||||||
|
.setFrom(0)
|
||||||
|
.setVersion(true);
|
||||||
|
|
||||||
if(query.getPageable().isPaged()){
|
if(query.getPageable().isPaged()){
|
||||||
requestBuilder.setSize(query.getPageable().getPageSize());
|
requestBuilder.setSize(query.getPageable().getPageSize());
|
||||||
@@ -875,9 +883,11 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (searchQuery.getHighlightFields() != null) {
|
if (searchQuery.getHighlightFields() != null) {
|
||||||
|
HighlightBuilder highlightBuilder = new HighlightBuilder();
|
||||||
for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) {
|
for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) {
|
||||||
searchRequest.highlighter(new HighlightBuilder().field(highlightField));
|
highlightBuilder.field(highlightField);
|
||||||
}
|
}
|
||||||
|
searchRequest.highlighter(highlightBuilder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isEmpty(searchQuery.getIndicesBoost())) {
|
if (!isEmpty(searchQuery.getIndicesBoost())) {
|
||||||
@@ -975,7 +985,9 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
|
|||||||
|
|
||||||
int startRecord = 0;
|
int startRecord = 0;
|
||||||
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(toArray(query.getIndices()))
|
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(toArray(query.getIndices()))
|
||||||
.setSearchType(query.getSearchType()).setTypes(toArray(query.getTypes()));
|
.setSearchType(query.getSearchType())
|
||||||
|
.setTypes(toArray(query.getTypes()))
|
||||||
|
.setVersion(true);
|
||||||
|
|
||||||
if (query.getSourceFilter() != null) {
|
if (query.getSourceFilter() != null) {
|
||||||
SourceFilter sourceFilter = query.getSourceFilter();
|
SourceFilter sourceFilter = query.getSourceFilter();
|
||||||
@@ -994,8 +1006,15 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
|
|||||||
|
|
||||||
if (query.getSort() != null) {
|
if (query.getSort() != null) {
|
||||||
for (Sort.Order order : query.getSort()) {
|
for (Sort.Order order : query.getSort()) {
|
||||||
searchRequestBuilder.addSort(order.getProperty(),
|
FieldSortBuilder sort = SortBuilders.fieldSort(order.getProperty())
|
||||||
order.getDirection() == Sort.Direction.DESC ? SortOrder.DESC : SortOrder.ASC);
|
.order(order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC);
|
||||||
|
if (order.getNullHandling() == Sort.NullHandling.NULLS_FIRST) {
|
||||||
|
sort.missing("_first");
|
||||||
|
}
|
||||||
|
else if (order.getNullHandling() == Sort.NullHandling.NULLS_LAST) {
|
||||||
|
sort.missing("_last");
|
||||||
|
}
|
||||||
|
searchRequestBuilder.addSort(sort);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ import org.springframework.data.elasticsearch.core.facet.result.StatisticalResul
|
|||||||
import org.springframework.data.elasticsearch.core.facet.result.Term;
|
import org.springframework.data.elasticsearch.core.facet.result.Term;
|
||||||
import org.springframework.data.elasticsearch.core.facet.result.TermResult;
|
import org.springframework.data.elasticsearch.core.facet.result.TermResult;
|
||||||
|
|
||||||
|
import static java.util.Optional.ofNullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Container for query result and facet results
|
* Container for query result and facet results
|
||||||
*
|
*
|
||||||
@@ -48,6 +50,7 @@ import org.springframework.data.elasticsearch.core.facet.result.TermResult;
|
|||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
* @author Jonathan Yan
|
* @author Jonathan Yan
|
||||||
* @author Philipp Kräutli
|
* @author Philipp Kräutli
|
||||||
|
* @author Remco Zigterman
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public abstract class FacetedPageImpl<T> extends PageImpl<T> implements FacetedPage<T>, AggregatedPage<T> {
|
public abstract class FacetedPageImpl<T> extends PageImpl<T> implements FacetedPage<T>, AggregatedPage<T> {
|
||||||
@@ -60,7 +63,7 @@ public abstract class FacetedPageImpl<T> extends PageImpl<T> implements FacetedP
|
|||||||
}
|
}
|
||||||
|
|
||||||
public FacetedPageImpl(List<T> content, Pageable pageable, long total) {
|
public FacetedPageImpl(List<T> content, Pageable pageable, long total) {
|
||||||
super(content, Pageable.unpaged(), total);
|
super(content, ofNullable(pageable).orElse(Pageable.unpaged()), total);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,362 +1,381 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014-2017 the original author or authors.
|
* Copyright 2014-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core;
|
package org.springframework.data.elasticsearch.core;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
import org.springframework.core.ResolvableType;
|
import org.springframework.core.ResolvableType;
|
||||||
import org.springframework.core.io.ClassPathResource;
|
import org.springframework.core.io.ClassPathResource;
|
||||||
import org.springframework.data.annotation.Transient;
|
import org.springframework.data.annotation.Transient;
|
||||||
import org.springframework.data.elasticsearch.annotations.CompletionField;
|
import org.springframework.data.elasticsearch.annotations.CompletionField;
|
||||||
import org.springframework.data.elasticsearch.annotations.DateFormat;
|
import org.springframework.data.elasticsearch.annotations.DateFormat;
|
||||||
import org.springframework.data.elasticsearch.annotations.Field;
|
import org.springframework.data.elasticsearch.annotations.Field;
|
||||||
import org.springframework.data.elasticsearch.annotations.FieldType;
|
import org.springframework.data.elasticsearch.annotations.FieldType;
|
||||||
import org.springframework.data.elasticsearch.annotations.GeoPointField;
|
import org.springframework.data.elasticsearch.annotations.GeoPointField;
|
||||||
import org.springframework.data.elasticsearch.annotations.InnerField;
|
import org.springframework.data.elasticsearch.annotations.InnerField;
|
||||||
import org.springframework.data.elasticsearch.annotations.Mapping;
|
import org.springframework.data.elasticsearch.annotations.Mapping;
|
||||||
import org.springframework.data.elasticsearch.annotations.MultiField;
|
import org.springframework.data.elasticsearch.annotations.MultiField;
|
||||||
import org.springframework.data.elasticsearch.core.completion.Completion;
|
import org.springframework.data.elasticsearch.core.completion.Completion;
|
||||||
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
|
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
|
||||||
import org.springframework.data.mapping.model.SimpleTypeHolder;
|
import org.springframework.data.mapping.model.SimpleTypeHolder;
|
||||||
import org.springframework.data.util.ClassTypeInformation;
|
import org.springframework.data.util.ClassTypeInformation;
|
||||||
import org.springframework.data.util.TypeInformation;
|
import org.springframework.data.util.TypeInformation;
|
||||||
import static org.apache.commons.lang.StringUtils.*;
|
import static org.apache.commons.lang.StringUtils.*;
|
||||||
import static org.elasticsearch.common.xcontent.XContentFactory.*;
|
import static org.elasticsearch.common.xcontent.XContentFactory.*;
|
||||||
import static org.springframework.util.StringUtils.*;
|
import static org.springframework.util.StringUtils.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
* @author Kevin Leturc
|
* @author Kevin Leturc
|
||||||
* @author Alexander Volz
|
* @author Alexander Volz
|
||||||
* @author Dennis Maaß
|
* @author Dennis Maaß
|
||||||
* @author Pavel Luhin
|
* @author Pavel Luhin
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
* @author Sascha Woo
|
||||||
class MappingBuilder {
|
* @author Nordine Bittich
|
||||||
|
*/
|
||||||
public static final String FIELD_DATA = "fielddata";
|
class MappingBuilder {
|
||||||
public static final String FIELD_STORE = "store";
|
|
||||||
public static final String FIELD_TYPE = "type";
|
public static final String FIELD_DATA = "fielddata";
|
||||||
public static final String FIELD_INDEX = "index";
|
public static final String FIELD_STORE = "store";
|
||||||
public static final String FIELD_FORMAT = "format";
|
public static final String FIELD_TYPE = "type";
|
||||||
public static final String FIELD_SEARCH_ANALYZER = "search_analyzer";
|
public static final String FIELD_INDEX = "index";
|
||||||
public static final String FIELD_INDEX_ANALYZER = "analyzer";
|
public static final String FIELD_FORMAT = "format";
|
||||||
public static final String FIELD_PROPERTIES = "properties";
|
public static final String FIELD_SEARCH_ANALYZER = "search_analyzer";
|
||||||
public static final String FIELD_PARENT = "_parent";
|
public static final String FIELD_INDEX_ANALYZER = "analyzer";
|
||||||
|
public static final String FIELD_PROPERTIES = "properties";
|
||||||
public static final String COMPLETION_PRESERVE_SEPARATORS = "preserve_separators";
|
public static final String FIELD_PARENT = "_parent";
|
||||||
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 COMPLETION_PRESERVE_SEPARATORS = "preserve_separators";
|
||||||
|
public static final String COMPLETION_PRESERVE_POSITION_INCREMENTS = "preserve_position_increments";
|
||||||
public static final String INDEX_VALUE_NOT_ANALYZED = "not_analyzed";
|
public static final String COMPLETION_MAX_INPUT_LENGTH = "max_input_length";
|
||||||
public static final String TYPE_VALUE_STRING = "text";
|
|
||||||
public static final String TYPE_VALUE_GEO_POINT = "geo_point";
|
public static final String TYPE_VALUE_KEYWORD = "keyword";
|
||||||
public static final String TYPE_VALUE_COMPLETION = "completion";
|
public static final String TYPE_VALUE_GEO_POINT = "geo_point";
|
||||||
public static final String TYPE_VALUE_GEO_HASH_PREFIX = "geohash_prefix";
|
public static final String TYPE_VALUE_COMPLETION = "completion";
|
||||||
public static final String TYPE_VALUE_GEO_HASH_PRECISION = "geohash_precision";
|
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;
|
|
||||||
|
private static SimpleTypeHolder SIMPLE_TYPE_HOLDER = SimpleTypeHolder.DEFAULT;
|
||||||
static XContentBuilder buildMapping(Class clazz, String indexType, String idFieldName, String parentType) throws IOException {
|
|
||||||
|
static XContentBuilder buildMapping(Class clazz, String indexType, String idFieldName, String parentType) throws IOException {
|
||||||
XContentBuilder mapping = jsonBuilder().startObject().startObject(indexType);
|
|
||||||
// Parent
|
XContentBuilder mapping = jsonBuilder().startObject().startObject(indexType);
|
||||||
if (hasText(parentType)) {
|
// Parent
|
||||||
mapping.startObject(FIELD_PARENT).field(FIELD_TYPE, parentType).endObject();
|
if (hasText(parentType)) {
|
||||||
}
|
mapping.startObject(FIELD_PARENT).field(FIELD_TYPE, parentType).endObject();
|
||||||
|
}
|
||||||
// Properties
|
|
||||||
XContentBuilder xContentBuilder = mapping.startObject(FIELD_PROPERTIES);
|
// Properties
|
||||||
|
XContentBuilder xContentBuilder = mapping.startObject(FIELD_PROPERTIES);
|
||||||
mapEntity(xContentBuilder, clazz, true, idFieldName, EMPTY, false, FieldType.Auto, null);
|
|
||||||
|
mapEntity(xContentBuilder, clazz, true, idFieldName, EMPTY, false, FieldType.Auto, null);
|
||||||
return xContentBuilder.endObject().endObject().endObject();
|
|
||||||
}
|
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 {
|
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);
|
|
||||||
|
java.lang.reflect.Field[] fields = retrieveFields(clazz);
|
||||||
if (!isRootObject && (isAnyPropertyAnnotatedAsField(fields) || nestedOrObjectField)) {
|
|
||||||
String type = FieldType.Object.toString().toLowerCase();
|
if (!isRootObject && (isAnyPropertyAnnotatedAsField(fields) || nestedOrObjectField)) {
|
||||||
if (nestedOrObjectField) {
|
String type = FieldType.Object.toString().toLowerCase();
|
||||||
type = fieldType.toString().toLowerCase();
|
if (nestedOrObjectField) {
|
||||||
}
|
type = fieldType.toString().toLowerCase();
|
||||||
XContentBuilder t = xContentBuilder.startObject(nestedObjectFieldName).field(FIELD_TYPE, type);
|
}
|
||||||
|
XContentBuilder t = xContentBuilder.startObject(nestedObjectFieldName).field(FIELD_TYPE, type);
|
||||||
if (nestedOrObjectField && FieldType.Nested == fieldType && fieldAnnotation.includeInParent()) {
|
|
||||||
t.field("include_in_parent", fieldAnnotation.includeInParent());
|
if (nestedOrObjectField && FieldType.Nested == fieldType && fieldAnnotation.includeInParent()) {
|
||||||
}
|
t.field("include_in_parent", fieldAnnotation.includeInParent());
|
||||||
t.startObject(FIELD_PROPERTIES);
|
}
|
||||||
}
|
t.startObject(FIELD_PROPERTIES);
|
||||||
|
}
|
||||||
for (java.lang.reflect.Field field : fields) {
|
|
||||||
|
for (java.lang.reflect.Field field : fields) {
|
||||||
if (field.isAnnotationPresent(Transient.class) || isInIgnoreFields(field, fieldAnnotation)) {
|
|
||||||
continue;
|
if (field.isAnnotationPresent(Transient.class) || isInIgnoreFields(field, fieldAnnotation)) {
|
||||||
}
|
continue;
|
||||||
|
}
|
||||||
if (field.isAnnotationPresent(Mapping.class)) {
|
|
||||||
String mappingPath = field.getAnnotation(Mapping.class).mappingPath();
|
if (field.isAnnotationPresent(Mapping.class)) {
|
||||||
if (isNotBlank(mappingPath)) {
|
String mappingPath = field.getAnnotation(Mapping.class).mappingPath();
|
||||||
ClassPathResource mappings = new ClassPathResource(mappingPath);
|
if (isNotBlank(mappingPath)) {
|
||||||
if (mappings.exists()) {
|
ClassPathResource mappings = new ClassPathResource(mappingPath);
|
||||||
xContentBuilder.rawField(field.getName(), mappings.getInputStream());
|
if (mappings.exists()) {
|
||||||
continue;
|
xContentBuilder.rawField(field.getName(), mappings.getInputStream());
|
||||||
}
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
boolean isGeoPointField = isGeoPointField(field);
|
|
||||||
boolean isCompletionField = isCompletionField(field);
|
boolean isGeoPointField = isGeoPointField(field);
|
||||||
|
boolean isCompletionField = isCompletionField(field);
|
||||||
Field singleField = field.getAnnotation(Field.class);
|
|
||||||
if (!isGeoPointField && !isCompletionField && isEntity(field) && isAnnotated(field)) {
|
Field singleField = field.getAnnotation(Field.class);
|
||||||
if (singleField == null) {
|
if (!isGeoPointField && !isCompletionField && isEntity(field) && isAnnotated(field)) {
|
||||||
continue;
|
if (singleField == null) {
|
||||||
}
|
continue;
|
||||||
boolean nestedOrObject = isNestedOrObjectField(field);
|
}
|
||||||
mapEntity(xContentBuilder, getFieldType(field), false, EMPTY, field.getName(), nestedOrObject, singleField.type(), field.getAnnotation(Field.class));
|
boolean nestedOrObject = isNestedOrObjectField(field);
|
||||||
if (nestedOrObject) {
|
mapEntity(xContentBuilder, getFieldType(field), false, EMPTY, field.getName(), nestedOrObject, singleField.type(), field.getAnnotation(Field.class));
|
||||||
continue;
|
if (nestedOrObject) {
|
||||||
}
|
continue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
MultiField multiField = field.getAnnotation(MultiField.class);
|
|
||||||
|
MultiField multiField = field.getAnnotation(MultiField.class);
|
||||||
if (isGeoPointField) {
|
|
||||||
applyGeoPointFieldMapping(xContentBuilder, field);
|
if (isGeoPointField) {
|
||||||
}
|
applyGeoPointFieldMapping(xContentBuilder, field);
|
||||||
|
}
|
||||||
if (isCompletionField) {
|
|
||||||
CompletionField completionField = field.getAnnotation(CompletionField.class);
|
if (isCompletionField) {
|
||||||
applyCompletionFieldMapping(xContentBuilder, field, completionField);
|
CompletionField completionField = field.getAnnotation(CompletionField.class);
|
||||||
}
|
applyCompletionFieldMapping(xContentBuilder, field, completionField);
|
||||||
|
}
|
||||||
if (isRootObject && singleField != null && isIdField(field, idFieldName)) {
|
|
||||||
applyDefaultIdFieldMapping(xContentBuilder, field);
|
if (isRootObject && singleField != null && isIdField(field, idFieldName)) {
|
||||||
} else if (multiField != null) {
|
applyDefaultIdFieldMapping(xContentBuilder, field);
|
||||||
addMultiFieldMapping(xContentBuilder, field, multiField, isNestedOrObjectField(field));
|
} else if (multiField != null) {
|
||||||
} else if (singleField != null) {
|
addMultiFieldMapping(xContentBuilder, field, multiField, isNestedOrObjectField(field));
|
||||||
addSingleFieldMapping(xContentBuilder, field, singleField, isNestedOrObjectField(field));
|
} else if (singleField != null) {
|
||||||
}
|
addSingleFieldMapping(xContentBuilder, field, singleField, isNestedOrObjectField(field));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (!isRootObject && isAnyPropertyAnnotatedAsField(fields) || nestedOrObjectField) {
|
|
||||||
xContentBuilder.endObject().endObject();
|
if (!isRootObject && isAnyPropertyAnnotatedAsField(fields) || nestedOrObjectField) {
|
||||||
}
|
xContentBuilder.endObject().endObject();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
private static java.lang.reflect.Field[] retrieveFields(Class clazz) {
|
|
||||||
// Create list of fields.
|
private static java.lang.reflect.Field[] retrieveFields(Class clazz) {
|
||||||
List<java.lang.reflect.Field> fields = new ArrayList<>();
|
// Create list of fields.
|
||||||
|
List<java.lang.reflect.Field> fields = new ArrayList<>();
|
||||||
// Keep backing up the inheritance hierarchy.
|
|
||||||
Class targetClass = clazz;
|
// Keep backing up the inheritance hierarchy.
|
||||||
do {
|
Class targetClass = clazz;
|
||||||
fields.addAll(Arrays.asList(targetClass.getDeclaredFields()));
|
do {
|
||||||
targetClass = targetClass.getSuperclass();
|
fields.addAll(Arrays.asList(targetClass.getDeclaredFields()));
|
||||||
}
|
targetClass = targetClass.getSuperclass();
|
||||||
while (targetClass != null && targetClass != Object.class);
|
}
|
||||||
|
while (targetClass != null && targetClass != Object.class);
|
||||||
return fields.toArray(new java.lang.reflect.Field[fields.size()]);
|
|
||||||
}
|
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 ||
|
private static boolean isAnnotated(java.lang.reflect.Field field) {
|
||||||
field.getAnnotation(MultiField.class) != null ||
|
return field.getAnnotation(Field.class) != null ||
|
||||||
field.getAnnotation(GeoPointField.class) != null ||
|
field.getAnnotation(MultiField.class) != null ||
|
||||||
field.getAnnotation(CompletionField.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());
|
private static void applyGeoPointFieldMapping(XContentBuilder xContentBuilder, java.lang.reflect.Field field) throws IOException {
|
||||||
xContentBuilder.field(FIELD_TYPE, TYPE_VALUE_GEO_POINT);
|
xContentBuilder.startObject(field.getName());
|
||||||
xContentBuilder.endObject();
|
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());
|
private static void applyCompletionFieldMapping(XContentBuilder xContentBuilder, java.lang.reflect.Field field, CompletionField annotation) throws IOException {
|
||||||
xContentBuilder.field(FIELD_TYPE, TYPE_VALUE_COMPLETION);
|
xContentBuilder.startObject(field.getName());
|
||||||
if (annotation != null) {
|
xContentBuilder.field(FIELD_TYPE, TYPE_VALUE_COMPLETION);
|
||||||
xContentBuilder.field(COMPLETION_MAX_INPUT_LENGTH, annotation.maxInputLength());
|
if (annotation != null) {
|
||||||
xContentBuilder.field(COMPLETION_PRESERVE_POSITION_INCREMENTS, annotation.preservePositionIncrements());
|
xContentBuilder.field(COMPLETION_MAX_INPUT_LENGTH, annotation.maxInputLength());
|
||||||
xContentBuilder.field(COMPLETION_PRESERVE_SEPARATORS, annotation.preserveSeparators());
|
xContentBuilder.field(COMPLETION_PRESERVE_POSITION_INCREMENTS, annotation.preservePositionIncrements());
|
||||||
if (isNotBlank(annotation.searchAnalyzer())) {
|
xContentBuilder.field(COMPLETION_PRESERVE_SEPARATORS, annotation.preserveSeparators());
|
||||||
xContentBuilder.field(FIELD_SEARCH_ANALYZER, annotation.searchAnalyzer());
|
if (isNotBlank(annotation.searchAnalyzer())) {
|
||||||
}
|
xContentBuilder.field(FIELD_SEARCH_ANALYZER, annotation.searchAnalyzer());
|
||||||
if (isNotBlank(annotation.analyzer())) {
|
}
|
||||||
xContentBuilder.field(FIELD_INDEX_ANALYZER, annotation.analyzer());
|
if (isNotBlank(annotation.analyzer())) {
|
||||||
}
|
xContentBuilder.field(FIELD_INDEX_ANALYZER, annotation.analyzer());
|
||||||
}
|
}
|
||||||
xContentBuilder.endObject();
|
}
|
||||||
}
|
xContentBuilder.endObject();
|
||||||
|
}
|
||||||
private static void applyDefaultIdFieldMapping(XContentBuilder xContentBuilder, java.lang.reflect.Field field)
|
|
||||||
throws IOException {
|
private static void applyDefaultIdFieldMapping(XContentBuilder xContentBuilder, java.lang.reflect.Field field)
|
||||||
xContentBuilder.startObject(field.getName())
|
throws IOException {
|
||||||
.field(FIELD_TYPE, TYPE_VALUE_STRING)
|
xContentBuilder.startObject(field.getName())
|
||||||
.field(FIELD_INDEX, INDEX_VALUE_NOT_ANALYZED);
|
.field(FIELD_TYPE, TYPE_VALUE_KEYWORD)
|
||||||
xContentBuilder.endObject();
|
.field(FIELD_INDEX, true);
|
||||||
}
|
xContentBuilder.endObject();
|
||||||
|
}
|
||||||
/**
|
|
||||||
* Apply mapping for a single @Field annotation
|
/**
|
||||||
*
|
* Add mapping for @Field annotation
|
||||||
* @throws IOException
|
*
|
||||||
*/
|
* @throws IOException
|
||||||
private static void addSingleFieldMapping(XContentBuilder xContentBuilder, java.lang.reflect.Field field,
|
*/
|
||||||
Field fieldAnnotation, boolean nestedOrObjectField) throws IOException {
|
private static void addSingleFieldMapping(XContentBuilder builder, java.lang.reflect.Field field, Field annotation, boolean nestedOrObjectField) throws IOException {
|
||||||
xContentBuilder.startObject(field.getName());
|
builder.startObject(field.getName());
|
||||||
if(!nestedOrObjectField) {
|
addFieldMappingParameters(builder, annotation, nestedOrObjectField);
|
||||||
xContentBuilder.field(FIELD_STORE, fieldAnnotation.store());
|
builder.endObject();
|
||||||
}
|
}
|
||||||
if(fieldAnnotation.fielddata()) {
|
|
||||||
xContentBuilder.field(FIELD_DATA, fieldAnnotation.fielddata());
|
/**
|
||||||
}
|
* Add mapping for @MultiField annotation
|
||||||
|
*
|
||||||
if (FieldType.Auto != fieldAnnotation.type()) {
|
* @throws IOException
|
||||||
xContentBuilder.field(FIELD_TYPE, fieldAnnotation.type().name().toLowerCase());
|
*/
|
||||||
if (FieldType.Date == fieldAnnotation.type() && DateFormat.none != fieldAnnotation.format()) {
|
private static void addMultiFieldMapping(
|
||||||
xContentBuilder.field(FIELD_FORMAT, DateFormat.custom == fieldAnnotation.format()
|
XContentBuilder builder,
|
||||||
? fieldAnnotation.pattern() : fieldAnnotation.format());
|
java.lang.reflect.Field field,
|
||||||
}
|
MultiField annotation,
|
||||||
}
|
boolean nestedOrObjectField) throws IOException {
|
||||||
if(!fieldAnnotation.index()) {
|
|
||||||
xContentBuilder.field(FIELD_INDEX, fieldAnnotation.index());
|
// main field
|
||||||
}
|
builder.startObject(field.getName());
|
||||||
if (isNotBlank(fieldAnnotation.searchAnalyzer())) {
|
addFieldMappingParameters(builder, annotation.mainField(), nestedOrObjectField);
|
||||||
xContentBuilder.field(FIELD_SEARCH_ANALYZER, fieldAnnotation.searchAnalyzer());
|
|
||||||
}
|
// inner fields
|
||||||
if (isNotBlank(fieldAnnotation.analyzer())) {
|
builder.startObject("fields");
|
||||||
xContentBuilder.field(FIELD_INDEX_ANALYZER, fieldAnnotation.analyzer());
|
for (InnerField innerField : annotation.otherFields()) {
|
||||||
}
|
builder.startObject(innerField.suffix());
|
||||||
xContentBuilder.endObject();
|
addFieldMappingParameters(builder, innerField, false);
|
||||||
}
|
builder.endObject();
|
||||||
|
}
|
||||||
/**
|
builder.endObject();
|
||||||
* Apply mapping for a single nested @Field annotation
|
|
||||||
*
|
builder.endObject();
|
||||||
* @throws IOException
|
}
|
||||||
*/
|
|
||||||
private static void addNestedFieldMapping(XContentBuilder builder, java.lang.reflect.Field field,
|
private static void addFieldMappingParameters(XContentBuilder builder, Object annotation, boolean nestedOrObjectField) throws IOException {
|
||||||
InnerField annotation) throws IOException {
|
boolean index = true;
|
||||||
builder.startObject(annotation.suffix());
|
boolean store = false;
|
||||||
//builder.field(FIELD_STORE, annotation.store());
|
boolean fielddata = false;
|
||||||
if (FieldType.Auto != annotation.type()) {
|
FieldType type = null;
|
||||||
builder.field(FIELD_TYPE, annotation.type().name().toLowerCase());
|
DateFormat dateFormat = null;
|
||||||
}
|
String datePattern = null;
|
||||||
if(!annotation.index()) {
|
String analyzer = null;
|
||||||
builder.field(FIELD_INDEX, annotation.index());
|
String searchAnalyzer = null;
|
||||||
}
|
|
||||||
if (isNotBlank(annotation.searchAnalyzer())) {
|
if (annotation instanceof Field) {
|
||||||
builder.field(FIELD_SEARCH_ANALYZER, annotation.searchAnalyzer());
|
// @Field
|
||||||
}
|
Field fieldAnnotation = (Field) annotation;
|
||||||
if (isNotBlank(annotation.indexAnalyzer())) {
|
index = fieldAnnotation.index();
|
||||||
builder.field(FIELD_INDEX_ANALYZER, annotation.indexAnalyzer());
|
store = fieldAnnotation.store();
|
||||||
}
|
fielddata = fieldAnnotation.fielddata();
|
||||||
if (annotation.fielddata()) {
|
type = fieldAnnotation.type();
|
||||||
builder.field(FIELD_DATA, annotation.fielddata());
|
dateFormat = fieldAnnotation.format();
|
||||||
}
|
datePattern = fieldAnnotation.pattern();
|
||||||
builder.endObject();
|
analyzer = fieldAnnotation.analyzer();
|
||||||
}
|
searchAnalyzer = fieldAnnotation.searchAnalyzer();
|
||||||
|
} else if (annotation instanceof InnerField) {
|
||||||
/**
|
// @InnerField
|
||||||
* Multi field mappings for string type fields, support for sorts and facets
|
InnerField fieldAnnotation = (InnerField) annotation;
|
||||||
*
|
index = fieldAnnotation.index();
|
||||||
* @throws IOException
|
store = fieldAnnotation.store();
|
||||||
*/
|
fielddata = fieldAnnotation.fielddata();
|
||||||
private static void addMultiFieldMapping(XContentBuilder builder, java.lang.reflect.Field field,
|
type = fieldAnnotation.type();
|
||||||
MultiField annotation, boolean nestedOrObjectField) throws IOException {
|
dateFormat = fieldAnnotation.format();
|
||||||
builder.startObject(field.getName());
|
datePattern = fieldAnnotation.pattern();
|
||||||
builder.field(FIELD_TYPE, annotation.mainField().type());
|
analyzer = fieldAnnotation.analyzer();
|
||||||
builder.startObject("fields");
|
searchAnalyzer = fieldAnnotation.searchAnalyzer();
|
||||||
//add standard field
|
} else {
|
||||||
//addSingleFieldMapping(builder, field, annotation.mainField(), nestedOrObjectField);
|
throw new IllegalArgumentException("annotation must be an instance of @Field or @InnerField");
|
||||||
for (InnerField innerField : annotation.otherFields()) {
|
}
|
||||||
addNestedFieldMapping(builder, field, innerField);
|
|
||||||
}
|
if (!nestedOrObjectField) {
|
||||||
builder.endObject();
|
builder.field(FIELD_STORE, store);
|
||||||
builder.endObject();
|
}
|
||||||
}
|
if (fielddata) {
|
||||||
|
builder.field(FIELD_DATA, fielddata);
|
||||||
protected static boolean isEntity(java.lang.reflect.Field field) {
|
}
|
||||||
TypeInformation typeInformation = ClassTypeInformation.from(field.getType());
|
if (type != FieldType.Auto) {
|
||||||
Class<?> clazz = getFieldType(field);
|
builder.field(FIELD_TYPE, type.name().toLowerCase());
|
||||||
boolean isComplexType = !SIMPLE_TYPE_HOLDER.isSimpleType(clazz);
|
|
||||||
return isComplexType && !Map.class.isAssignableFrom(typeInformation.getType());
|
if (type == FieldType.Date && dateFormat != DateFormat.none) {
|
||||||
}
|
builder.field(FIELD_FORMAT, dateFormat == DateFormat.custom ? datePattern : dateFormat.toString());
|
||||||
|
}
|
||||||
protected static Class<?> getFieldType(java.lang.reflect.Field field) {
|
}
|
||||||
|
if (!index) {
|
||||||
ResolvableType resolvableType = ResolvableType.forField(field);
|
builder.field(FIELD_INDEX, index);
|
||||||
|
}
|
||||||
if (resolvableType.isArray()) {
|
if (isNotBlank(analyzer)) {
|
||||||
return resolvableType.getComponentType().getRawClass();
|
builder.field(FIELD_INDEX_ANALYZER, analyzer);
|
||||||
}
|
}
|
||||||
|
if (isNotBlank(searchAnalyzer)) {
|
||||||
ResolvableType componentType = resolvableType.getGeneric(0);
|
builder.field(FIELD_SEARCH_ANALYZER, searchAnalyzer);
|
||||||
if (Iterable.class.isAssignableFrom(field.getType())
|
}
|
||||||
&& componentType != ResolvableType.NONE) {
|
}
|
||||||
return componentType.getRawClass();
|
|
||||||
}
|
protected static boolean isEntity(java.lang.reflect.Field field) {
|
||||||
|
TypeInformation typeInformation = ClassTypeInformation.from(field.getType());
|
||||||
return resolvableType.getRawClass();
|
Class<?> clazz = getFieldType(field);
|
||||||
}
|
boolean isComplexType = !SIMPLE_TYPE_HOLDER.isSimpleType(clazz);
|
||||||
|
return isComplexType && !Map.class.isAssignableFrom(typeInformation.getType());
|
||||||
private static boolean isAnyPropertyAnnotatedAsField(java.lang.reflect.Field[] fields) {
|
}
|
||||||
if (fields != null) {
|
|
||||||
for (java.lang.reflect.Field field : fields) {
|
protected static Class<?> getFieldType(java.lang.reflect.Field field) {
|
||||||
if (field.isAnnotationPresent(Field.class)) {
|
|
||||||
return true;
|
ResolvableType resolvableType = ResolvableType.forField(field);
|
||||||
}
|
|
||||||
}
|
if (resolvableType.isArray()) {
|
||||||
}
|
return resolvableType.getComponentType().getRawClass();
|
||||||
return false;
|
}
|
||||||
}
|
|
||||||
|
ResolvableType componentType = resolvableType.getGeneric(0);
|
||||||
private static boolean isIdField(java.lang.reflect.Field field, String idFieldName) {
|
if (Iterable.class.isAssignableFrom(field.getType())
|
||||||
return idFieldName.equals(field.getName());
|
&& componentType != ResolvableType.NONE) {
|
||||||
}
|
return componentType.getRawClass();
|
||||||
|
}
|
||||||
private static boolean isInIgnoreFields(java.lang.reflect.Field field, Field parentFieldAnnotation) {
|
|
||||||
if (null != parentFieldAnnotation) {
|
return resolvableType.getRawClass();
|
||||||
String[] ignoreFields = parentFieldAnnotation.ignoreFields();
|
}
|
||||||
return Arrays.asList(ignoreFields).contains(field.getName());
|
|
||||||
}
|
private static boolean isAnyPropertyAnnotatedAsField(java.lang.reflect.Field[] fields) {
|
||||||
return false;
|
if (fields != null) {
|
||||||
}
|
for (java.lang.reflect.Field field : fields) {
|
||||||
|
if (field.isAnnotationPresent(Field.class)) {
|
||||||
private static boolean isNestedOrObjectField(java.lang.reflect.Field field) {
|
return true;
|
||||||
Field fieldAnnotation = field.getAnnotation(Field.class);
|
}
|
||||||
return fieldAnnotation != null && (FieldType.Nested == fieldAnnotation.type() || FieldType.Object == fieldAnnotation.type());
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
private static boolean isGeoPointField(java.lang.reflect.Field field) {
|
}
|
||||||
return field.getType() == GeoPoint.class || field.getAnnotation(GeoPointField.class) != null;
|
|
||||||
}
|
private static boolean isIdField(java.lang.reflect.Field field, String idFieldName) {
|
||||||
|
return idFieldName.equals(field.getName());
|
||||||
private static boolean isCompletionField(java.lang.reflect.Field field) {
|
}
|
||||||
return field.getType() == Completion.class;
|
|
||||||
}
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,24 +1,24 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2014 the original author or authors.
|
* Copyright 2013-2014 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.data.elasticsearch.core;
|
package org.springframework.data.elasticsearch.core;
|
||||||
|
|
||||||
import org.elasticsearch.action.search.SearchResponse;
|
import org.elasticsearch.action.search.SearchResponse;
|
||||||
|
|
||||||
public interface ResultsExtractor<T> {
|
public interface ResultsExtractor<T> {
|
||||||
|
|
||||||
T extract(SearchResponse response);
|
T extract(SearchResponse response);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2014 the original author or authors.
|
* Copyright 2013-2014 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core;
|
package org.springframework.data.elasticsearch.core;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ResultsMapper
|
* ResultsMapper
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public interface ResultsMapper extends SearchResultMapper, GetResultMapper, MultiGetResultMapper {
|
public interface ResultsMapper extends SearchResultMapper, GetResultMapper, MultiGetResultMapper {
|
||||||
|
|
||||||
EntityMapper getEntityMapper();
|
EntityMapper getEntityMapper();
|
||||||
}
|
}
|
||||||
|
|||||||
+77
-77
@@ -1,77 +1,77 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.convert;
|
package org.springframework.data.elasticsearch.core.convert;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import org.joda.time.DateTimeZone;
|
import org.joda.time.DateTimeZone;
|
||||||
import org.joda.time.LocalDateTime;
|
import org.joda.time.LocalDateTime;
|
||||||
import org.joda.time.ReadableInstant;
|
import org.joda.time.ReadableInstant;
|
||||||
import org.joda.time.format.DateTimeFormatter;
|
import org.joda.time.format.DateTimeFormatter;
|
||||||
import org.joda.time.format.ISODateTimeFormat;
|
import org.joda.time.format.ISODateTimeFormat;
|
||||||
import org.springframework.core.convert.converter.Converter;
|
import org.springframework.core.convert.converter.Converter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DateTimeConverters
|
* DateTimeConverters
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public final class DateTimeConverters {
|
public final class DateTimeConverters {
|
||||||
|
|
||||||
private static DateTimeFormatter formatter = ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC);
|
private static DateTimeFormatter formatter = ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC);
|
||||||
|
|
||||||
public enum JodaDateTimeConverter implements Converter<ReadableInstant, String> {
|
public enum JodaDateTimeConverter implements Converter<ReadableInstant, String> {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String convert(ReadableInstant source) {
|
public String convert(ReadableInstant source) {
|
||||||
if (source == null) {
|
if (source == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return formatter.print(source);
|
return formatter.print(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum JodaLocalDateTimeConverter implements Converter<LocalDateTime, String> {
|
public enum JodaLocalDateTimeConverter implements Converter<LocalDateTime, String> {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String convert(LocalDateTime source) {
|
public String convert(LocalDateTime source) {
|
||||||
if (source == null) {
|
if (source == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return formatter.print(source.toDateTime(DateTimeZone.UTC));
|
return formatter.print(source.toDateTime(DateTimeZone.UTC));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum JavaDateConverter implements Converter<Date, String> {
|
public enum JavaDateConverter implements Converter<Date, String> {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String convert(Date source) {
|
public String convert(Date source) {
|
||||||
if (source == null) {
|
if (source == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return formatter.print(source.getTime());
|
return formatter.print(source.getTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+45
-45
@@ -1,45 +1,45 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.convert;
|
package org.springframework.data.elasticsearch.core.convert;
|
||||||
|
|
||||||
import org.springframework.core.convert.ConversionService;
|
import org.springframework.core.convert.ConversionService;
|
||||||
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
|
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
|
||||||
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
||||||
import org.springframework.data.mapping.context.MappingContext;
|
import org.springframework.data.mapping.context.MappingContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ElasticsearchConverter
|
* ElasticsearchConverter
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public interface ElasticsearchConverter {
|
public interface ElasticsearchConverter {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the underlying {@link org.springframework.data.mapping.context.MappingContext} used by the converter.
|
* Returns the underlying {@link org.springframework.data.mapping.context.MappingContext} used by the converter.
|
||||||
*
|
*
|
||||||
* @return never {@literal null}
|
* @return never {@literal null}
|
||||||
*/
|
*/
|
||||||
MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> getMappingContext();
|
MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> getMappingContext();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the underlying {@link org.springframework.core.convert.ConversionService} used by the converter.
|
* Returns the underlying {@link org.springframework.core.convert.ConversionService} used by the converter.
|
||||||
*
|
*
|
||||||
* @return never {@literal null}.
|
* @return never {@literal null}.
|
||||||
*/
|
*/
|
||||||
ConversionService getConversionService();
|
ConversionService getConversionService();
|
||||||
}
|
}
|
||||||
|
|||||||
+70
-70
@@ -1,70 +1,70 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.convert;
|
package org.springframework.data.elasticsearch.core.convert;
|
||||||
|
|
||||||
import org.springframework.beans.BeansException;
|
import org.springframework.beans.BeansException;
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.context.ApplicationContextAware;
|
import org.springframework.context.ApplicationContextAware;
|
||||||
import org.springframework.core.convert.ConversionService;
|
import org.springframework.core.convert.ConversionService;
|
||||||
import org.springframework.core.convert.support.DefaultConversionService;
|
import org.springframework.core.convert.support.DefaultConversionService;
|
||||||
import org.springframework.core.convert.support.GenericConversionService;
|
import org.springframework.core.convert.support.GenericConversionService;
|
||||||
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
|
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
|
||||||
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
||||||
import org.springframework.data.mapping.context.MappingContext;
|
import org.springframework.data.mapping.context.MappingContext;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MappingElasticsearchConverter
|
* MappingElasticsearchConverter
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public class MappingElasticsearchConverter implements ElasticsearchConverter, ApplicationContextAware {
|
public class MappingElasticsearchConverter implements ElasticsearchConverter, ApplicationContextAware {
|
||||||
|
|
||||||
private final MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext;
|
private final MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext;
|
||||||
private final GenericConversionService conversionService;
|
private final GenericConversionService conversionService;
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private ApplicationContext applicationContext;
|
private ApplicationContext applicationContext;
|
||||||
|
|
||||||
public MappingElasticsearchConverter(
|
public MappingElasticsearchConverter(
|
||||||
MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext) {
|
MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext) {
|
||||||
|
|
||||||
Assert.notNull(mappingContext, "MappingContext must not be null!");
|
Assert.notNull(mappingContext, "MappingContext must not be null!");
|
||||||
|
|
||||||
this.mappingContext = mappingContext;
|
this.mappingContext = mappingContext;
|
||||||
this.conversionService = new DefaultConversionService();
|
this.conversionService = new DefaultConversionService();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> getMappingContext() {
|
public MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> getMappingContext() {
|
||||||
return mappingContext;
|
return mappingContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ConversionService getConversionService() {
|
public ConversionService getConversionService() {
|
||||||
return this.conversionService;
|
return this.conversionService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
||||||
this.applicationContext = applicationContext;
|
this.applicationContext = applicationContext;
|
||||||
if (mappingContext instanceof ApplicationContextAware) {
|
if (mappingContext instanceof ApplicationContextAware) {
|
||||||
((ApplicationContextAware) mappingContext).setApplicationContext(applicationContext);
|
((ApplicationContextAware) mappingContext).setApplicationContext(applicationContext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+40
-40
@@ -1,40 +1,40 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.mapping;
|
package org.springframework.data.elasticsearch.core.mapping;
|
||||||
|
|
||||||
import org.springframework.core.convert.converter.Converter;
|
import org.springframework.core.convert.converter.Converter;
|
||||||
import org.springframework.data.mapping.PersistentProperty;
|
import org.springframework.data.mapping.PersistentProperty;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ElasticsearchPersistentProperty
|
* ElasticsearchPersistentProperty
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public interface ElasticsearchPersistentProperty extends PersistentProperty<ElasticsearchPersistentProperty> {
|
public interface ElasticsearchPersistentProperty extends PersistentProperty<ElasticsearchPersistentProperty> {
|
||||||
|
|
||||||
String getFieldName();
|
String getFieldName();
|
||||||
|
|
||||||
public enum PropertyToFieldNameConverter implements Converter<ElasticsearchPersistentProperty, String> {
|
public enum PropertyToFieldNameConverter implements Converter<ElasticsearchPersistentProperty, String> {
|
||||||
|
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
public String convert(ElasticsearchPersistentProperty source) {
|
public String convert(ElasticsearchPersistentProperty source) {
|
||||||
return source.getFieldName();
|
return source.getFieldName();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+58
-58
@@ -1,58 +1,58 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.mapping;
|
package org.springframework.data.elasticsearch.core.mapping;
|
||||||
|
|
||||||
import org.springframework.beans.BeansException;
|
import org.springframework.beans.BeansException;
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.context.ApplicationContextAware;
|
import org.springframework.context.ApplicationContextAware;
|
||||||
import org.springframework.data.mapping.context.AbstractMappingContext;
|
import org.springframework.data.mapping.context.AbstractMappingContext;
|
||||||
import org.springframework.data.mapping.model.Property;
|
import org.springframework.data.mapping.model.Property;
|
||||||
import org.springframework.data.mapping.model.SimpleTypeHolder;
|
import org.springframework.data.mapping.model.SimpleTypeHolder;
|
||||||
import org.springframework.data.util.TypeInformation;
|
import org.springframework.data.util.TypeInformation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SimpleElasticsearchMappingContext
|
* SimpleElasticsearchMappingContext
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public class SimpleElasticsearchMappingContext extends
|
public class SimpleElasticsearchMappingContext extends
|
||||||
AbstractMappingContext<SimpleElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> implements ApplicationContextAware {
|
AbstractMappingContext<SimpleElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> implements ApplicationContextAware {
|
||||||
|
|
||||||
private ApplicationContext context;
|
private ApplicationContext context;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected <T> SimpleElasticsearchPersistentEntity<?> createPersistentEntity(TypeInformation<T> typeInformation) {
|
protected <T> SimpleElasticsearchPersistentEntity<?> createPersistentEntity(TypeInformation<T> typeInformation) {
|
||||||
final SimpleElasticsearchPersistentEntity<T> persistentEntity = new SimpleElasticsearchPersistentEntity<>(
|
final SimpleElasticsearchPersistentEntity<T> persistentEntity = new SimpleElasticsearchPersistentEntity<>(
|
||||||
typeInformation);
|
typeInformation);
|
||||||
if (context != null) {
|
if (context != null) {
|
||||||
persistentEntity.setApplicationContext(context);
|
persistentEntity.setApplicationContext(context);
|
||||||
}
|
}
|
||||||
return persistentEntity;
|
return persistentEntity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ElasticsearchPersistentProperty createPersistentProperty(Property property,
|
protected ElasticsearchPersistentProperty createPersistentProperty(Property property,
|
||||||
SimpleElasticsearchPersistentEntity<?> owner, SimpleTypeHolder simpleTypeHolder) {
|
SimpleElasticsearchPersistentEntity<?> owner, SimpleTypeHolder simpleTypeHolder) {
|
||||||
return new SimpleElasticsearchPersistentProperty(property, owner, simpleTypeHolder);
|
return new SimpleElasticsearchPersistentProperty(property, owner, simpleTypeHolder);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setApplicationContext(ApplicationContext context) throws BeansException {
|
public void setApplicationContext(ApplicationContext context) throws BeansException {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+65
-65
@@ -1,65 +1,65 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.mapping;
|
package org.springframework.data.elasticsearch.core.mapping;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.springframework.data.mapping.Association;
|
import org.springframework.data.mapping.Association;
|
||||||
import org.springframework.data.mapping.PersistentEntity;
|
import org.springframework.data.mapping.PersistentEntity;
|
||||||
import org.springframework.data.mapping.model.AnnotationBasedPersistentProperty;
|
import org.springframework.data.mapping.model.AnnotationBasedPersistentProperty;
|
||||||
import org.springframework.data.mapping.model.Property;
|
import org.springframework.data.mapping.model.Property;
|
||||||
import org.springframework.data.mapping.model.SimpleTypeHolder;
|
import org.springframework.data.mapping.model.SimpleTypeHolder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Elasticsearch specific {@link org.springframework.data.mapping.PersistentProperty} implementation processing
|
* Elasticsearch specific {@link org.springframework.data.mapping.PersistentProperty} implementation processing
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public class SimpleElasticsearchPersistentProperty extends
|
public class SimpleElasticsearchPersistentProperty extends
|
||||||
AnnotationBasedPersistentProperty<ElasticsearchPersistentProperty> implements ElasticsearchPersistentProperty {
|
AnnotationBasedPersistentProperty<ElasticsearchPersistentProperty> implements ElasticsearchPersistentProperty {
|
||||||
|
|
||||||
private static final Set<Class<?>> SUPPORTED_ID_TYPES = new HashSet<>();
|
private static final Set<Class<?>> SUPPORTED_ID_TYPES = new HashSet<>();
|
||||||
private static final Set<String> SUPPORTED_ID_PROPERTY_NAMES = new HashSet<>();
|
private static final Set<String> SUPPORTED_ID_PROPERTY_NAMES = new HashSet<>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
SUPPORTED_ID_TYPES.add(String.class);
|
SUPPORTED_ID_TYPES.add(String.class);
|
||||||
SUPPORTED_ID_PROPERTY_NAMES.add("id");
|
SUPPORTED_ID_PROPERTY_NAMES.add("id");
|
||||||
SUPPORTED_ID_PROPERTY_NAMES.add("documentId");
|
SUPPORTED_ID_PROPERTY_NAMES.add("documentId");
|
||||||
}
|
}
|
||||||
|
|
||||||
public SimpleElasticsearchPersistentProperty(Property property,
|
public SimpleElasticsearchPersistentProperty(Property property,
|
||||||
PersistentEntity<?, ElasticsearchPersistentProperty> owner, SimpleTypeHolder simpleTypeHolder) {
|
PersistentEntity<?, ElasticsearchPersistentProperty> owner, SimpleTypeHolder simpleTypeHolder) {
|
||||||
super(property, owner, simpleTypeHolder);
|
super(property, owner, simpleTypeHolder);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getFieldName() {
|
public String getFieldName() {
|
||||||
return getProperty().getName();
|
return getProperty().getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isIdProperty() {
|
public boolean isIdProperty() {
|
||||||
return super.isIdProperty() || SUPPORTED_ID_PROPERTY_NAMES.contains(getFieldName());
|
return super.isIdProperty() || SUPPORTED_ID_PROPERTY_NAMES.contains(getFieldName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Association<ElasticsearchPersistentProperty> createAssociation() {
|
protected Association<ElasticsearchPersistentProperty> createAssociation() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,81 +1,81 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2014 the original author or authors.
|
* Copyright 2013-2014 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.query;
|
package org.springframework.data.elasticsearch.core.query;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.elasticsearch.index.query.QueryBuilder;
|
import org.elasticsearch.index.query.QueryBuilder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public class AliasBuilder {
|
public class AliasBuilder {
|
||||||
|
|
||||||
private String indexName;
|
private String indexName;
|
||||||
private String aliasName;
|
private String aliasName;
|
||||||
private QueryBuilder filterBuilder;
|
private QueryBuilder filterBuilder;
|
||||||
private Map<String, Object> filter;
|
private Map<String, Object> filter;
|
||||||
private String searchRouting;
|
private String searchRouting;
|
||||||
private String indexRouting;
|
private String indexRouting;
|
||||||
private String routing;
|
private String routing;
|
||||||
|
|
||||||
public AliasBuilder withIndexName(String indexName) {
|
public AliasBuilder withIndexName(String indexName) {
|
||||||
this.indexName = indexName;
|
this.indexName = indexName;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AliasBuilder withAliasName(String aliasName) {
|
public AliasBuilder withAliasName(String aliasName) {
|
||||||
this.aliasName = aliasName;
|
this.aliasName = aliasName;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AliasBuilder withFilterBuilder(QueryBuilder filterBuilder) {
|
public AliasBuilder withFilterBuilder(QueryBuilder filterBuilder) {
|
||||||
this.filterBuilder = filterBuilder;
|
this.filterBuilder = filterBuilder;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AliasBuilder withFilter(Map<String, Object> filter) {
|
public AliasBuilder withFilter(Map<String, Object> filter) {
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AliasBuilder withSearchRouting(String searchRouting) {
|
public AliasBuilder withSearchRouting(String searchRouting) {
|
||||||
this.searchRouting = searchRouting;
|
this.searchRouting = searchRouting;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AliasBuilder withIndexRouting(String indexRouting) {
|
public AliasBuilder withIndexRouting(String indexRouting) {
|
||||||
this.indexRouting = indexRouting;
|
this.indexRouting = indexRouting;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AliasBuilder withRouting(String routing) {
|
public AliasBuilder withRouting(String routing) {
|
||||||
this.routing = routing;
|
this.routing = routing;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AliasQuery build() {
|
public AliasQuery build() {
|
||||||
AliasQuery aliasQuery = new AliasQuery();
|
AliasQuery aliasQuery = new AliasQuery();
|
||||||
aliasQuery.setIndexName(indexName);
|
aliasQuery.setIndexName(indexName);
|
||||||
aliasQuery.setAliasName(aliasName);
|
aliasQuery.setAliasName(aliasName);
|
||||||
aliasQuery.setFilterBuilder(filterBuilder);
|
aliasQuery.setFilterBuilder(filterBuilder);
|
||||||
aliasQuery.setFilter(filter);
|
aliasQuery.setFilter(filter);
|
||||||
aliasQuery.setSearchRouting(searchRouting);
|
aliasQuery.setSearchRouting(searchRouting);
|
||||||
aliasQuery.setIndexRouting(indexRouting);
|
aliasQuery.setIndexRouting(indexRouting);
|
||||||
aliasQuery.setRouting(routing);
|
aliasQuery.setRouting(routing);
|
||||||
return aliasQuery;
|
return aliasQuery;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,92 +1,92 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2014 the original author or authors.
|
* Copyright 2013-2014 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.query;
|
package org.springframework.data.elasticsearch.core.query;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.elasticsearch.index.query.QueryBuilder;
|
import org.elasticsearch.index.query.QueryBuilder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AliasQuery is useful for creating new alias or deleting existing ones
|
* AliasQuery is useful for creating new alias or deleting existing ones
|
||||||
*
|
*
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public class AliasQuery {
|
public class AliasQuery {
|
||||||
|
|
||||||
private String indexName;
|
private String indexName;
|
||||||
private String aliasName;
|
private String aliasName;
|
||||||
private QueryBuilder filterBuilder;
|
private QueryBuilder filterBuilder;
|
||||||
private Map<String, Object> filter;
|
private Map<String, Object> filter;
|
||||||
private String searchRouting;
|
private String searchRouting;
|
||||||
private String indexRouting;
|
private String indexRouting;
|
||||||
private String routing;
|
private String routing;
|
||||||
|
|
||||||
public String getIndexName() {
|
public String getIndexName() {
|
||||||
return indexName;
|
return indexName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setIndexName(String indexName) {
|
public void setIndexName(String indexName) {
|
||||||
this.indexName = indexName;
|
this.indexName = indexName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAliasName() {
|
public String getAliasName() {
|
||||||
return aliasName;
|
return aliasName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAliasName(String aliasName) {
|
public void setAliasName(String aliasName) {
|
||||||
this.aliasName = aliasName;
|
this.aliasName = aliasName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QueryBuilder getFilterBuilder() {
|
public QueryBuilder getFilterBuilder() {
|
||||||
return filterBuilder;
|
return filterBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFilterBuilder(QueryBuilder filterBuilder) {
|
public void setFilterBuilder(QueryBuilder filterBuilder) {
|
||||||
this.filterBuilder = filterBuilder;
|
this.filterBuilder = filterBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, Object> getFilter() {
|
public Map<String, Object> getFilter() {
|
||||||
return filter;
|
return filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFilter(Map<String, Object> filter) {
|
public void setFilter(Map<String, Object> filter) {
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSearchRouting() {
|
public String getSearchRouting() {
|
||||||
return searchRouting;
|
return searchRouting;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSearchRouting(String searchRouting) {
|
public void setSearchRouting(String searchRouting) {
|
||||||
this.searchRouting = searchRouting;
|
this.searchRouting = searchRouting;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getIndexRouting() {
|
public String getIndexRouting() {
|
||||||
return indexRouting;
|
return indexRouting;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setIndexRouting(String indexRouting) {
|
public void setIndexRouting(String indexRouting) {
|
||||||
this.indexRouting = indexRouting;
|
this.indexRouting = indexRouting;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getRouting() {
|
public String getRouting() {
|
||||||
return routing;
|
return routing;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRouting(String routing) {
|
public void setRouting(String routing) {
|
||||||
this.routing = routing;
|
this.routing = routing;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
+82
-82
@@ -1,82 +1,82 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.query;
|
package org.springframework.data.elasticsearch.core.query;
|
||||||
|
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CriteriaQuery
|
* CriteriaQuery
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public class CriteriaQuery extends AbstractQuery {
|
public class CriteriaQuery extends AbstractQuery {
|
||||||
|
|
||||||
private Criteria criteria;
|
private Criteria criteria;
|
||||||
|
|
||||||
private CriteriaQuery() {}
|
private CriteriaQuery() {}
|
||||||
|
|
||||||
public CriteriaQuery(Criteria criteria) {
|
public CriteriaQuery(Criteria criteria) {
|
||||||
this(criteria, Pageable.unpaged());
|
this(criteria, Pageable.unpaged());
|
||||||
}
|
}
|
||||||
|
|
||||||
public CriteriaQuery(Criteria criteria, Pageable pageable) {
|
public CriteriaQuery(Criteria criteria, Pageable pageable) {
|
||||||
|
|
||||||
Assert.notNull(criteria, "Criteria must not be null!");
|
Assert.notNull(criteria, "Criteria must not be null!");
|
||||||
Assert.notNull(pageable, "Pageable must not be null!");
|
Assert.notNull(pageable, "Pageable must not be null!");
|
||||||
|
|
||||||
this.criteria = criteria;
|
this.criteria = criteria;
|
||||||
this.pageable = pageable;
|
this.pageable = pageable;
|
||||||
this.addSort(pageable.getSort());
|
this.addSort(pageable.getSort());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Query fromQuery(CriteriaQuery source) {
|
public static final Query fromQuery(CriteriaQuery source) {
|
||||||
return fromQuery(source, new CriteriaQuery());
|
return fromQuery(source, new CriteriaQuery());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T extends CriteriaQuery> T fromQuery(CriteriaQuery source, T destination) {
|
public static <T extends CriteriaQuery> T fromQuery(CriteriaQuery source, T destination) {
|
||||||
if (source == null || destination == null) {
|
if (source == null || destination == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (source.getCriteria() != null) {
|
if (source.getCriteria() != null) {
|
||||||
destination.addCriteria(source.getCriteria());
|
destination.addCriteria(source.getCriteria());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (source.getSort() != null) {
|
if (source.getSort() != null) {
|
||||||
destination.addSort(source.getSort());
|
destination.addSort(source.getSort());
|
||||||
}
|
}
|
||||||
|
|
||||||
return destination;
|
return destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public final <T extends CriteriaQuery> T addCriteria(Criteria criteria) {
|
public final <T extends CriteriaQuery> T addCriteria(Criteria criteria) {
|
||||||
Assert.notNull(criteria, "Cannot add null criteria.");
|
Assert.notNull(criteria, "Cannot add null criteria.");
|
||||||
if (this.criteria == null) {
|
if (this.criteria == null) {
|
||||||
this.criteria = criteria;
|
this.criteria = criteria;
|
||||||
} else {
|
} else {
|
||||||
this.criteria.and(criteria);
|
this.criteria.and(criteria);
|
||||||
}
|
}
|
||||||
return (T) this;
|
return (T) this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Criteria getCriteria() {
|
public Criteria getCriteria() {
|
||||||
return this.criteria;
|
return this.criteria;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,73 +1,73 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2016 the original author or authors.
|
* Copyright 2013-2016 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.query;
|
package org.springframework.data.elasticsearch.core.query;
|
||||||
|
|
||||||
import org.elasticsearch.index.query.QueryBuilder;
|
import org.elasticsearch.index.query.QueryBuilder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DeleteQuery
|
* DeleteQuery
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public class DeleteQuery {
|
public class DeleteQuery {
|
||||||
|
|
||||||
private QueryBuilder query;
|
private QueryBuilder query;
|
||||||
private String index;
|
private String index;
|
||||||
private String type;
|
private String type;
|
||||||
private Integer pageSize;
|
private Integer pageSize;
|
||||||
private Long scrollTimeInMillis;
|
private Long scrollTimeInMillis;
|
||||||
|
|
||||||
public QueryBuilder getQuery() {
|
public QueryBuilder getQuery() {
|
||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setQuery(QueryBuilder query) {
|
public void setQuery(QueryBuilder query) {
|
||||||
this.query = query;
|
this.query = query;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getIndex() {
|
public String getIndex() {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setIndex(String index) {
|
public void setIndex(String index) {
|
||||||
this.index = index;
|
this.index = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getType() {
|
public String getType() {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setType(String type) {
|
public void setType(String type) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getPageSize() {
|
public Integer getPageSize() {
|
||||||
return pageSize;
|
return pageSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPageSize(Integer pageSize) {
|
public void setPageSize(Integer pageSize) {
|
||||||
this.pageSize = pageSize;
|
this.pageSize = pageSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Long getScrollTimeInMillis() {
|
public Long getScrollTimeInMillis() {
|
||||||
return scrollTimeInMillis;
|
return scrollTimeInMillis;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setScrollTimeInMillis(Long scrollTimeInMillis) {
|
public void setScrollTimeInMillis(Long scrollTimeInMillis) {
|
||||||
this.scrollTimeInMillis = scrollTimeInMillis;
|
this.scrollTimeInMillis = scrollTimeInMillis;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,32 +1,32 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.query;
|
package org.springframework.data.elasticsearch.core.query;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a Field that can be used within a Criteria.
|
* Defines a Field that can be used within a Criteria.
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public interface Field {
|
public interface Field {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the name of the field used in schema.xml of elasticsearch server
|
* Get the name of the field used in schema.xml of elasticsearch server
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
String getName();
|
String getName();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,35 +1,35 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.query;
|
package org.springframework.data.elasticsearch.core.query;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GetQuery
|
* GetQuery
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public class GetQuery {
|
public class GetQuery {
|
||||||
|
|
||||||
private String id;
|
private String id;
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(String id) {
|
public void setId(String id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,90 +1,90 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.query;
|
package org.springframework.data.elasticsearch.core.query;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IndexQuery
|
* IndexQuery
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class IndexQuery {
|
public class IndexQuery {
|
||||||
|
|
||||||
private String id;
|
private String id;
|
||||||
private Object object;
|
private Object object;
|
||||||
private Long version;
|
private Long version;
|
||||||
private String indexName;
|
private String indexName;
|
||||||
private String type;
|
private String type;
|
||||||
private String source;
|
private String source;
|
||||||
private String parentId;
|
private String parentId;
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(String id) {
|
public void setId(String id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object getObject() {
|
public Object getObject() {
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setObject(Object object) {
|
public void setObject(Object object) {
|
||||||
this.object = object;
|
this.object = object;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Long getVersion() {
|
public Long getVersion() {
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setVersion(Long version) {
|
public void setVersion(Long version) {
|
||||||
this.version = version;
|
this.version = version;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getIndexName() {
|
public String getIndexName() {
|
||||||
return indexName;
|
return indexName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setIndexName(String indexName) {
|
public void setIndexName(String indexName) {
|
||||||
this.indexName = indexName;
|
this.indexName = indexName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getType() {
|
public String getType() {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setType(String type) {
|
public void setType(String type) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSource() {
|
public String getSource() {
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSource(String source) {
|
public void setSource(String source) {
|
||||||
this.source = source;
|
this.source = source;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getParentId() {
|
public String getParentId() {
|
||||||
return parentId;
|
return parentId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setParentId(String parentId) {
|
public void setParentId(String parentId) {
|
||||||
this.parentId = parentId;
|
this.parentId = parentId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+187
-187
@@ -1,187 +1,187 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.query;
|
package org.springframework.data.elasticsearch.core.query;
|
||||||
|
|
||||||
import static java.util.Collections.addAll;
|
import static java.util.Collections.addAll;
|
||||||
import static org.springframework.data.elasticsearch.core.query.AbstractQuery.*;
|
import static org.springframework.data.elasticsearch.core.query.AbstractQuery.*;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MoreLikeThisQuery
|
* MoreLikeThisQuery
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public class MoreLikeThisQuery {
|
public class MoreLikeThisQuery {
|
||||||
|
|
||||||
private String id;
|
private String id;
|
||||||
private String indexName;
|
private String indexName;
|
||||||
private String type;
|
private String type;
|
||||||
private List<String> searchIndices = new ArrayList<>();
|
private List<String> searchIndices = new ArrayList<>();
|
||||||
private List<String> searchTypes = new ArrayList<>();
|
private List<String> searchTypes = new ArrayList<>();
|
||||||
private List<String> fields = new ArrayList<>();
|
private List<String> fields = new ArrayList<>();
|
||||||
private String routing;
|
private String routing;
|
||||||
private Float percentTermsToMatch;
|
private Float percentTermsToMatch;
|
||||||
private Integer minTermFreq;
|
private Integer minTermFreq;
|
||||||
private Integer maxQueryTerms;
|
private Integer maxQueryTerms;
|
||||||
private List<String> stopWords = new ArrayList<>();
|
private List<String> stopWords = new ArrayList<>();
|
||||||
private Integer minDocFreq;
|
private Integer minDocFreq;
|
||||||
private Integer maxDocFreq;
|
private Integer maxDocFreq;
|
||||||
private Integer minWordLen;
|
private Integer minWordLen;
|
||||||
private Integer maxWordLen;
|
private Integer maxWordLen;
|
||||||
private Float boostTerms;
|
private Float boostTerms;
|
||||||
private Pageable pageable = DEFAULT_PAGE;
|
private Pageable pageable = DEFAULT_PAGE;
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(String id) {
|
public void setId(String id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getIndexName() {
|
public String getIndexName() {
|
||||||
return indexName;
|
return indexName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setIndexName(String indexName) {
|
public void setIndexName(String indexName) {
|
||||||
this.indexName = indexName;
|
this.indexName = indexName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getType() {
|
public String getType() {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setType(String type) {
|
public void setType(String type) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getSearchIndices() {
|
public List<String> getSearchIndices() {
|
||||||
return searchIndices;
|
return searchIndices;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSearchIndices(String... searchIndices) {
|
public void addSearchIndices(String... searchIndices) {
|
||||||
addAll(this.searchIndices, searchIndices);
|
addAll(this.searchIndices, searchIndices);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getSearchTypes() {
|
public List<String> getSearchTypes() {
|
||||||
return searchTypes;
|
return searchTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSearchTypes(String... searchTypes) {
|
public void addSearchTypes(String... searchTypes) {
|
||||||
addAll(this.searchTypes, searchTypes);
|
addAll(this.searchTypes, searchTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getFields() {
|
public List<String> getFields() {
|
||||||
return fields;
|
return fields;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addFields(String... fields) {
|
public void addFields(String... fields) {
|
||||||
addAll(this.fields, fields);
|
addAll(this.fields, fields);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getRouting() {
|
public String getRouting() {
|
||||||
return routing;
|
return routing;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRouting(String routing) {
|
public void setRouting(String routing) {
|
||||||
this.routing = routing;
|
this.routing = routing;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Float getPercentTermsToMatch() {
|
public Float getPercentTermsToMatch() {
|
||||||
return percentTermsToMatch;
|
return percentTermsToMatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPercentTermsToMatch(Float percentTermsToMatch) {
|
public void setPercentTermsToMatch(Float percentTermsToMatch) {
|
||||||
this.percentTermsToMatch = percentTermsToMatch;
|
this.percentTermsToMatch = percentTermsToMatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getMinTermFreq() {
|
public Integer getMinTermFreq() {
|
||||||
return minTermFreq;
|
return minTermFreq;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMinTermFreq(Integer minTermFreq) {
|
public void setMinTermFreq(Integer minTermFreq) {
|
||||||
this.minTermFreq = minTermFreq;
|
this.minTermFreq = minTermFreq;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getMaxQueryTerms() {
|
public Integer getMaxQueryTerms() {
|
||||||
return maxQueryTerms;
|
return maxQueryTerms;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMaxQueryTerms(Integer maxQueryTerms) {
|
public void setMaxQueryTerms(Integer maxQueryTerms) {
|
||||||
this.maxQueryTerms = maxQueryTerms;
|
this.maxQueryTerms = maxQueryTerms;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getStopWords() {
|
public List<String> getStopWords() {
|
||||||
return stopWords;
|
return stopWords;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addStopWords(String... stopWords) {
|
public void addStopWords(String... stopWords) {
|
||||||
addAll(this.stopWords, stopWords);
|
addAll(this.stopWords, stopWords);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getMinDocFreq() {
|
public Integer getMinDocFreq() {
|
||||||
return minDocFreq;
|
return minDocFreq;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMinDocFreq(Integer minDocFreq) {
|
public void setMinDocFreq(Integer minDocFreq) {
|
||||||
this.minDocFreq = minDocFreq;
|
this.minDocFreq = minDocFreq;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getMaxDocFreq() {
|
public Integer getMaxDocFreq() {
|
||||||
return maxDocFreq;
|
return maxDocFreq;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMaxDocFreq(Integer maxDocFreq) {
|
public void setMaxDocFreq(Integer maxDocFreq) {
|
||||||
this.maxDocFreq = maxDocFreq;
|
this.maxDocFreq = maxDocFreq;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getMinWordLen() {
|
public Integer getMinWordLen() {
|
||||||
return minWordLen;
|
return minWordLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMinWordLen(Integer minWordLen) {
|
public void setMinWordLen(Integer minWordLen) {
|
||||||
this.minWordLen = minWordLen;
|
this.minWordLen = minWordLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getMaxWordLen() {
|
public Integer getMaxWordLen() {
|
||||||
return maxWordLen;
|
return maxWordLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMaxWordLen(Integer maxWordLen) {
|
public void setMaxWordLen(Integer maxWordLen) {
|
||||||
this.maxWordLen = maxWordLen;
|
this.maxWordLen = maxWordLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Float getBoostTerms() {
|
public Float getBoostTerms() {
|
||||||
return boostTerms;
|
return boostTerms;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBoostTerms(Float boostTerms) {
|
public void setBoostTerms(Float boostTerms) {
|
||||||
this.boostTerms = boostTerms;
|
this.boostTerms = boostTerms;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Pageable getPageable() {
|
public Pageable getPageable() {
|
||||||
return pageable;
|
return pageable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPageable(Pageable pageable) {
|
public void setPageable(Pageable pageable) {
|
||||||
this.pageable = pageable;
|
this.pageable = pageable;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+140
-140
@@ -1,140 +1,140 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.query;
|
package org.springframework.data.elasticsearch.core.query;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.elasticsearch.index.query.QueryBuilder;
|
import org.elasticsearch.index.query.QueryBuilder;
|
||||||
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
|
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
|
||||||
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
|
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
|
||||||
import org.elasticsearch.search.sort.SortBuilder;
|
import org.elasticsearch.search.sort.SortBuilder;
|
||||||
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
|
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NativeSearchQuery
|
* NativeSearchQuery
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
*/
|
*/
|
||||||
public class NativeSearchQuery extends AbstractQuery implements SearchQuery {
|
public class NativeSearchQuery extends AbstractQuery implements SearchQuery {
|
||||||
|
|
||||||
private QueryBuilder query;
|
private QueryBuilder query;
|
||||||
private QueryBuilder filter;
|
private QueryBuilder filter;
|
||||||
private List<SortBuilder> sorts;
|
private List<SortBuilder> sorts;
|
||||||
private final List<ScriptField> scriptFields = new ArrayList<>();
|
private final List<ScriptField> scriptFields = new ArrayList<>();
|
||||||
private List<FacetRequest> facets;
|
private List<FacetRequest> facets;
|
||||||
private List<AbstractAggregationBuilder> aggregations;
|
private List<AbstractAggregationBuilder> aggregations;
|
||||||
private HighlightBuilder.Field[] highlightFields;
|
private HighlightBuilder.Field[] highlightFields;
|
||||||
private List<IndexBoost> indicesBoost;
|
private List<IndexBoost> indicesBoost;
|
||||||
|
|
||||||
|
|
||||||
public NativeSearchQuery(QueryBuilder query) {
|
public NativeSearchQuery(QueryBuilder query) {
|
||||||
this.query = query;
|
this.query = query;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQuery(QueryBuilder query, QueryBuilder filter) {
|
public NativeSearchQuery(QueryBuilder query, QueryBuilder filter) {
|
||||||
this.query = query;
|
this.query = query;
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List<SortBuilder> sorts) {
|
public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List<SortBuilder> sorts) {
|
||||||
this.query = query;
|
this.query = query;
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
this.sorts = sorts;
|
this.sorts = sorts;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List<SortBuilder> sorts, HighlightBuilder.Field[] highlightFields) {
|
public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List<SortBuilder> sorts, HighlightBuilder.Field[] highlightFields) {
|
||||||
this.query = query;
|
this.query = query;
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
this.sorts = sorts;
|
this.sorts = sorts;
|
||||||
this.highlightFields = highlightFields;
|
this.highlightFields = highlightFields;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QueryBuilder getQuery() {
|
public QueryBuilder getQuery() {
|
||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QueryBuilder getFilter() {
|
public QueryBuilder getFilter() {
|
||||||
return filter;
|
return filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<SortBuilder> getElasticsearchSorts() {
|
public List<SortBuilder> getElasticsearchSorts() {
|
||||||
return sorts;
|
return sorts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HighlightBuilder.Field[] getHighlightFields() {
|
public HighlightBuilder.Field[] getHighlightFields() {
|
||||||
return highlightFields;
|
return highlightFields;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ScriptField> getScriptFields() { return scriptFields; }
|
public List<ScriptField> getScriptFields() { return scriptFields; }
|
||||||
|
|
||||||
public void setScriptFields(List<ScriptField> scriptFields) {
|
public void setScriptFields(List<ScriptField> scriptFields) {
|
||||||
this.scriptFields.addAll(scriptFields);
|
this.scriptFields.addAll(scriptFields);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addScriptField(ScriptField... scriptField) {
|
public void addScriptField(ScriptField... scriptField) {
|
||||||
scriptFields.addAll(Arrays.asList(scriptField));
|
scriptFields.addAll(Arrays.asList(scriptField));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addFacet(FacetRequest facetRequest) {
|
public void addFacet(FacetRequest facetRequest) {
|
||||||
if (facets == null) {
|
if (facets == null) {
|
||||||
facets = new ArrayList<>();
|
facets = new ArrayList<>();
|
||||||
}
|
}
|
||||||
facets.add(facetRequest);
|
facets.add(facetRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFacets(List<FacetRequest> facets) {
|
public void setFacets(List<FacetRequest> facets) {
|
||||||
this.facets = facets;
|
this.facets = facets;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<FacetRequest> getFacets() {
|
public List<FacetRequest> getFacets() {
|
||||||
return facets;
|
return facets;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<AbstractAggregationBuilder> getAggregations() {
|
public List<AbstractAggregationBuilder> getAggregations() {
|
||||||
return aggregations;
|
return aggregations;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void addAggregation(AbstractAggregationBuilder aggregationBuilder) {
|
public void addAggregation(AbstractAggregationBuilder aggregationBuilder) {
|
||||||
if (aggregations == null) {
|
if (aggregations == null) {
|
||||||
aggregations = new ArrayList<>();
|
aggregations = new ArrayList<>();
|
||||||
}
|
}
|
||||||
aggregations.add(aggregationBuilder);
|
aggregations.add(aggregationBuilder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAggregations(List<AbstractAggregationBuilder> aggregations) {
|
public void setAggregations(List<AbstractAggregationBuilder> aggregations) {
|
||||||
this.aggregations = aggregations;
|
this.aggregations = aggregations;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<IndexBoost> getIndicesBoost() {
|
public List<IndexBoost> getIndicesBoost() {
|
||||||
return indicesBoost;
|
return indicesBoost;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setIndicesBoost(List<IndexBoost> indicesBoost) {
|
public void setIndicesBoost(List<IndexBoost> indicesBoost) {
|
||||||
this.indicesBoost = indicesBoost;
|
this.indicesBoost = indicesBoost;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+197
-197
@@ -1,197 +1,197 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.query;
|
package org.springframework.data.elasticsearch.core.query;
|
||||||
|
|
||||||
import static org.springframework.util.CollectionUtils.isEmpty;
|
import static org.springframework.util.CollectionUtils.isEmpty;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.elasticsearch.action.search.SearchType;
|
import org.elasticsearch.action.search.SearchType;
|
||||||
import org.elasticsearch.index.query.QueryBuilder;
|
import org.elasticsearch.index.query.QueryBuilder;
|
||||||
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
|
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
|
||||||
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
|
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
|
||||||
import org.elasticsearch.search.sort.SortBuilder;
|
import org.elasticsearch.search.sort.SortBuilder;
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
|
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NativeSearchQuery
|
* NativeSearchQuery
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public class NativeSearchQueryBuilder {
|
public class NativeSearchQueryBuilder {
|
||||||
|
|
||||||
private QueryBuilder queryBuilder;
|
private QueryBuilder queryBuilder;
|
||||||
private QueryBuilder filterBuilder;
|
private QueryBuilder filterBuilder;
|
||||||
private List<ScriptField> scriptFields = new ArrayList<>();
|
private List<ScriptField> scriptFields = new ArrayList<>();
|
||||||
private List<SortBuilder> sortBuilders = new ArrayList<>();
|
private List<SortBuilder> sortBuilders = new ArrayList<>();
|
||||||
private List<FacetRequest> facetRequests = new ArrayList<>();
|
private List<FacetRequest> facetRequests = new ArrayList<>();
|
||||||
private List<AbstractAggregationBuilder> aggregationBuilders = new ArrayList<>();
|
private List<AbstractAggregationBuilder> aggregationBuilders = new ArrayList<>();
|
||||||
private HighlightBuilder.Field[] highlightFields;
|
private HighlightBuilder.Field[] highlightFields;
|
||||||
private Pageable pageable = Pageable.unpaged();
|
private Pageable pageable = Pageable.unpaged();
|
||||||
private String[] indices;
|
private String[] indices;
|
||||||
private String[] types;
|
private String[] types;
|
||||||
private String[] fields;
|
private String[] fields;
|
||||||
private SourceFilter sourceFilter;
|
private SourceFilter sourceFilter;
|
||||||
private List<IndexBoost> indicesBoost;
|
private List<IndexBoost> indicesBoost;
|
||||||
private float minScore;
|
private float minScore;
|
||||||
private Collection<String> ids;
|
private Collection<String> ids;
|
||||||
private String route;
|
private String route;
|
||||||
private SearchType searchType;
|
private SearchType searchType;
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withQuery(QueryBuilder queryBuilder) {
|
public NativeSearchQueryBuilder withQuery(QueryBuilder queryBuilder) {
|
||||||
this.queryBuilder = queryBuilder;
|
this.queryBuilder = queryBuilder;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withFilter(QueryBuilder filterBuilder) {
|
public NativeSearchQueryBuilder withFilter(QueryBuilder filterBuilder) {
|
||||||
this.filterBuilder = filterBuilder;
|
this.filterBuilder = filterBuilder;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withSort(SortBuilder sortBuilder) {
|
public NativeSearchQueryBuilder withSort(SortBuilder sortBuilder) {
|
||||||
this.sortBuilders.add(sortBuilder);
|
this.sortBuilders.add(sortBuilder);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withScriptField(ScriptField scriptField) {
|
public NativeSearchQueryBuilder withScriptField(ScriptField scriptField) {
|
||||||
this.scriptFields.add(scriptField);
|
this.scriptFields.add(scriptField);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder addAggregation(AbstractAggregationBuilder aggregationBuilder) {
|
public NativeSearchQueryBuilder addAggregation(AbstractAggregationBuilder aggregationBuilder) {
|
||||||
this.aggregationBuilders.add(aggregationBuilder);
|
this.aggregationBuilders.add(aggregationBuilder);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withFacet(FacetRequest facetRequest) {
|
public NativeSearchQueryBuilder withFacet(FacetRequest facetRequest) {
|
||||||
facetRequests.add(facetRequest);
|
facetRequests.add(facetRequest);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withHighlightFields(HighlightBuilder.Field... highlightFields) {
|
public NativeSearchQueryBuilder withHighlightFields(HighlightBuilder.Field... highlightFields) {
|
||||||
this.highlightFields = highlightFields;
|
this.highlightFields = highlightFields;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withIndicesBoost(List<IndexBoost> indicesBoost) {
|
public NativeSearchQueryBuilder withIndicesBoost(List<IndexBoost> indicesBoost) {
|
||||||
this.indicesBoost = indicesBoost;
|
this.indicesBoost = indicesBoost;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withPageable(Pageable pageable) {
|
public NativeSearchQueryBuilder withPageable(Pageable pageable) {
|
||||||
this.pageable = pageable;
|
this.pageable = pageable;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withIndices(String... indices) {
|
public NativeSearchQueryBuilder withIndices(String... indices) {
|
||||||
this.indices = indices;
|
this.indices = indices;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withTypes(String... types) {
|
public NativeSearchQueryBuilder withTypes(String... types) {
|
||||||
this.types = types;
|
this.types = types;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withFields(String... fields) {
|
public NativeSearchQueryBuilder withFields(String... fields) {
|
||||||
this.fields = fields;
|
this.fields = fields;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withSourceFilter(SourceFilter sourceFilter) {
|
public NativeSearchQueryBuilder withSourceFilter(SourceFilter sourceFilter) {
|
||||||
this.sourceFilter = sourceFilter;
|
this.sourceFilter = sourceFilter;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withMinScore(float minScore) {
|
public NativeSearchQueryBuilder withMinScore(float minScore) {
|
||||||
this.minScore = minScore;
|
this.minScore = minScore;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withIds(Collection<String> ids) {
|
public NativeSearchQueryBuilder withIds(Collection<String> ids) {
|
||||||
this.ids = ids;
|
this.ids = ids;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withRoute(String route) {
|
public NativeSearchQueryBuilder withRoute(String route) {
|
||||||
this.route = route;
|
this.route = route;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQueryBuilder withSearchType(SearchType searchType) {
|
public NativeSearchQueryBuilder withSearchType(SearchType searchType) {
|
||||||
this.searchType = searchType;
|
this.searchType = searchType;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NativeSearchQuery build() {
|
public NativeSearchQuery build() {
|
||||||
NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(queryBuilder, filterBuilder, sortBuilders, highlightFields);
|
NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(queryBuilder, filterBuilder, sortBuilders, highlightFields);
|
||||||
nativeSearchQuery.setPageable(pageable);
|
nativeSearchQuery.setPageable(pageable);
|
||||||
|
|
||||||
if (indices != null) {
|
if (indices != null) {
|
||||||
nativeSearchQuery.addIndices(indices);
|
nativeSearchQuery.addIndices(indices);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (types != null) {
|
if (types != null) {
|
||||||
nativeSearchQuery.addTypes(types);
|
nativeSearchQuery.addTypes(types);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fields != null) {
|
if (fields != null) {
|
||||||
nativeSearchQuery.addFields(fields);
|
nativeSearchQuery.addFields(fields);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sourceFilter != null) {
|
if (sourceFilter != null) {
|
||||||
nativeSearchQuery.addSourceFilter(sourceFilter);
|
nativeSearchQuery.addSourceFilter(sourceFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(indicesBoost != null) {
|
if(indicesBoost != null) {
|
||||||
nativeSearchQuery.setIndicesBoost(indicesBoost);
|
nativeSearchQuery.setIndicesBoost(indicesBoost);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isEmpty(scriptFields)) {
|
if (!isEmpty(scriptFields)) {
|
||||||
nativeSearchQuery.setScriptFields(scriptFields);
|
nativeSearchQuery.setScriptFields(scriptFields);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isEmpty(facetRequests)) {
|
if (!isEmpty(facetRequests)) {
|
||||||
nativeSearchQuery.setFacets(facetRequests);
|
nativeSearchQuery.setFacets(facetRequests);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isEmpty(aggregationBuilders)) {
|
if (!isEmpty(aggregationBuilders)) {
|
||||||
nativeSearchQuery.setAggregations(aggregationBuilders);
|
nativeSearchQuery.setAggregations(aggregationBuilders);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (minScore > 0) {
|
if (minScore > 0) {
|
||||||
nativeSearchQuery.setMinScore(minScore);
|
nativeSearchQuery.setMinScore(minScore);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ids != null) {
|
if (ids != null) {
|
||||||
nativeSearchQuery.setIds(ids);
|
nativeSearchQuery.setIds(ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (route != null) {
|
if (route != null) {
|
||||||
nativeSearchQuery.setRoute(route);
|
nativeSearchQuery.setRoute(route);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (searchType != null) {
|
if (searchType != null) {
|
||||||
nativeSearchQuery.setSearchType(searchType);
|
nativeSearchQuery.setSearchType(searchType);
|
||||||
}
|
}
|
||||||
|
|
||||||
return nativeSearchQuery;
|
return nativeSearchQuery;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,150 +1,150 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.query;
|
package org.springframework.data.elasticsearch.core.query;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.elasticsearch.action.search.SearchType;
|
import org.elasticsearch.action.search.SearchType;
|
||||||
import org.springframework.data.domain.PageRequest;
|
import org.springframework.data.domain.PageRequest;
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.domain.Sort;
|
import org.springframework.data.domain.Sort;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query
|
* Query
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public interface Query {
|
public interface Query {
|
||||||
|
|
||||||
int DEFAULT_PAGE_SIZE = 10;
|
int DEFAULT_PAGE_SIZE = 10;
|
||||||
Pageable DEFAULT_PAGE = PageRequest.of(0, DEFAULT_PAGE_SIZE);
|
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
|
* restrict result to entries on given page. Corresponds to the 'start' and 'rows' parameter in elasticsearch
|
||||||
*
|
*
|
||||||
* @param pageable
|
* @param pageable
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
<T extends Query> T setPageable(Pageable pageable);
|
<T extends Query> T setPageable(Pageable pageable);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get page settings if defined
|
* Get page settings if defined
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
Pageable getPageable();
|
Pageable getPageable();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add {@link org.springframework.data.domain.Sort} to query
|
* Add {@link org.springframework.data.domain.Sort} to query
|
||||||
*
|
*
|
||||||
* @param sort
|
* @param sort
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
<T extends Query> T addSort(Sort sort);
|
<T extends Query> T addSort(Sort sort);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return null if not set
|
* @return null if not set
|
||||||
*/
|
*/
|
||||||
Sort getSort();
|
Sort getSort();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Indices to be searched
|
* Get Indices to be searched
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
List<String> getIndices();
|
List<String> getIndices();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add Indices to be added as part of search request
|
* Add Indices to be added as part of search request
|
||||||
*
|
*
|
||||||
* @param indices
|
* @param indices
|
||||||
*/
|
*/
|
||||||
void addIndices(String... indices);
|
void addIndices(String... indices);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add types to be searched
|
* Add types to be searched
|
||||||
*
|
*
|
||||||
* @param types
|
* @param types
|
||||||
*/
|
*/
|
||||||
void addTypes(String... types);
|
void addTypes(String... types);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get types to be searched
|
* Get types to be searched
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
List<String> getTypes();
|
List<String> getTypes();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add fields to be added as part of search request
|
* Add fields to be added as part of search request
|
||||||
*
|
*
|
||||||
* @param fields
|
* @param fields
|
||||||
*/
|
*/
|
||||||
void addFields(String... fields);
|
void addFields(String... fields);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get fields to be returned as part of search request
|
* Get fields to be returned as part of search request
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
List<String> getFields();
|
List<String> getFields();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add source filter to be added as part of search request
|
* Add source filter to be added as part of search request
|
||||||
*
|
*
|
||||||
* @param sourceFilter
|
* @param sourceFilter
|
||||||
*/
|
*/
|
||||||
void addSourceFilter(SourceFilter sourceFilter);
|
void addSourceFilter(SourceFilter sourceFilter);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get SourceFilter to be returned to get include and exclude source
|
* Get SourceFilter to be returned to get include and exclude source
|
||||||
* fields as part of search request.
|
* fields as part of search request.
|
||||||
*
|
*
|
||||||
* @return SourceFilter
|
* @return SourceFilter
|
||||||
*/
|
*/
|
||||||
SourceFilter getSourceFilter();
|
SourceFilter getSourceFilter();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get minimum score
|
* Get minimum score
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
float getMinScore();
|
float getMinScore();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Ids
|
* Get Ids
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
Collection<String> getIds();
|
Collection<String> getIds();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get route
|
* Get route
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
String getRoute();
|
String getRoute();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Type of search
|
* Type of search
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
SearchType getSearchType();
|
SearchType getSearchType();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,52 +1,52 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2016 the original author or authors.
|
* Copyright 2013-2016 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.query;
|
package org.springframework.data.elasticsearch.core.query;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.elasticsearch.index.query.QueryBuilder;
|
import org.elasticsearch.index.query.QueryBuilder;
|
||||||
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
|
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
|
||||||
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
|
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
|
||||||
import org.elasticsearch.search.sort.SortBuilder;
|
import org.elasticsearch.search.sort.SortBuilder;
|
||||||
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
|
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NativeSearchQuery
|
* NativeSearchQuery
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
*/
|
*/
|
||||||
public interface SearchQuery extends Query {
|
public interface SearchQuery extends Query {
|
||||||
|
|
||||||
QueryBuilder getQuery();
|
QueryBuilder getQuery();
|
||||||
|
|
||||||
QueryBuilder getFilter();
|
QueryBuilder getFilter();
|
||||||
|
|
||||||
List<SortBuilder> getElasticsearchSorts();
|
List<SortBuilder> getElasticsearchSorts();
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
List<FacetRequest> getFacets();
|
List<FacetRequest> getFacets();
|
||||||
|
|
||||||
List<AbstractAggregationBuilder> getAggregations();
|
List<AbstractAggregationBuilder> getAggregations();
|
||||||
|
|
||||||
HighlightBuilder.Field[] getHighlightFields();
|
HighlightBuilder.Field[] getHighlightFields();
|
||||||
|
|
||||||
List<IndexBoost> getIndicesBoost();
|
List<IndexBoost> getIndicesBoost();
|
||||||
|
|
||||||
List<ScriptField> getScriptFields();
|
List<ScriptField> getScriptFields();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,41 +1,41 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.query;
|
package org.springframework.data.elasticsearch.core.query;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The most trivial implementation of a Field
|
* The most trivial implementation of a Field
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public class SimpleField implements Field {
|
public class SimpleField implements Field {
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
public SimpleField(String name) {
|
public SimpleField(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return this.name;
|
return this.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return this.name;
|
return this.name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,49 +1,49 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.query;
|
package org.springframework.data.elasticsearch.core.query;
|
||||||
|
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.domain.Sort;
|
import org.springframework.data.domain.Sort;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* StringQuery
|
* StringQuery
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public class StringQuery extends AbstractQuery {
|
public class StringQuery extends AbstractQuery {
|
||||||
|
|
||||||
private String source;
|
private String source;
|
||||||
|
|
||||||
public StringQuery(String source) {
|
public StringQuery(String source) {
|
||||||
this.source = source;
|
this.source = source;
|
||||||
}
|
}
|
||||||
|
|
||||||
public StringQuery(String source, Pageable pageable) {
|
public StringQuery(String source, Pageable pageable) {
|
||||||
this.source = source;
|
this.source = source;
|
||||||
this.pageable = pageable;
|
this.pageable = pageable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public StringQuery(String source, Pageable pageable, Sort sort) {
|
public StringQuery(String source, Pageable pageable, Sort sort) {
|
||||||
this.pageable = pageable;
|
this.pageable = pageable;
|
||||||
this.sort = sort;
|
this.sort = sort;
|
||||||
this.source = source;
|
this.source = source;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSource() {
|
public String getSource() {
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+33
-33
@@ -1,33 +1,33 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2014 the original author or authors.
|
* Copyright 2013-2014 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository;
|
package org.springframework.data.elasticsearch.repository;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
import org.springframework.data.repository.NoRepositoryBean;
|
import org.springframework.data.repository.NoRepositoryBean;
|
||||||
import org.springframework.data.repository.PagingAndSortingRepository;
|
import org.springframework.data.repository.PagingAndSortingRepository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param <T>
|
* @param <T>
|
||||||
* @param <ID>
|
* @param <ID>
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
*/
|
*/
|
||||||
@NoRepositoryBean
|
@NoRepositoryBean
|
||||||
public interface ElasticsearchCrudRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {
|
public interface ElasticsearchCrudRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+48
-48
@@ -1,48 +1,48 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2016 the original author or authors.
|
* Copyright 2013-2016 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository;
|
package org.springframework.data.elasticsearch.repository;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
import org.elasticsearch.index.query.QueryBuilder;
|
import org.elasticsearch.index.query.QueryBuilder;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.elasticsearch.core.query.SearchQuery;
|
import org.springframework.data.elasticsearch.core.query.SearchQuery;
|
||||||
import org.springframework.data.repository.NoRepositoryBean;
|
import org.springframework.data.repository.NoRepositoryBean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param <T>
|
* @param <T>
|
||||||
* @param <ID>
|
* @param <ID>
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
@NoRepositoryBean
|
@NoRepositoryBean
|
||||||
public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {
|
public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {
|
||||||
|
|
||||||
<S extends T> S index(S entity);
|
<S extends T> S index(S entity);
|
||||||
|
|
||||||
Iterable<T> search(QueryBuilder query);
|
Iterable<T> search(QueryBuilder query);
|
||||||
|
|
||||||
Page<T> search(QueryBuilder query, Pageable pageable);
|
Page<T> search(QueryBuilder query, Pageable pageable);
|
||||||
|
|
||||||
Page<T> search(SearchQuery searchQuery);
|
Page<T> search(SearchQuery searchQuery);
|
||||||
|
|
||||||
Page<T> searchSimilar(T entity, String[] fields, Pageable pageable);
|
Page<T> searchSimilar(T entity, String[] fields, Pageable pageable);
|
||||||
|
|
||||||
void refresh();
|
void refresh();
|
||||||
|
|
||||||
Class<T> getEntityClass();
|
Class<T> getEntityClass();
|
||||||
}
|
}
|
||||||
|
|||||||
+87
-87
@@ -1,87 +1,87 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository.cdi;
|
package org.springframework.data.elasticsearch.repository.cdi;
|
||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.enterprise.context.spi.CreationalContext;
|
import javax.enterprise.context.spi.CreationalContext;
|
||||||
import javax.enterprise.inject.spi.Bean;
|
import javax.enterprise.inject.spi.Bean;
|
||||||
import javax.enterprise.inject.spi.BeanManager;
|
import javax.enterprise.inject.spi.BeanManager;
|
||||||
|
|
||||||
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
||||||
import org.springframework.data.elasticsearch.repository.support.ElasticsearchRepositoryFactory;
|
import org.springframework.data.elasticsearch.repository.support.ElasticsearchRepositoryFactory;
|
||||||
import org.springframework.data.repository.cdi.CdiRepositoryBean;
|
import org.springframework.data.repository.cdi.CdiRepositoryBean;
|
||||||
import org.springframework.data.repository.config.CustomRepositoryImplementationDetector;
|
import org.springframework.data.repository.config.CustomRepositoryImplementationDetector;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Uses {@link CdiRepositoryBean} to create
|
* Uses {@link CdiRepositoryBean} to create
|
||||||
* {@link org.springframework.data.elasticsearch.repository.ElasticsearchRepository} instances.
|
* {@link org.springframework.data.elasticsearch.repository.ElasticsearchRepository} instances.
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public class ElasticsearchRepositoryBean<T> extends CdiRepositoryBean<T> {
|
public class ElasticsearchRepositoryBean<T> extends CdiRepositoryBean<T> {
|
||||||
|
|
||||||
private final Bean<ElasticsearchOperations> elasticsearchOperationsBean;
|
private final Bean<ElasticsearchOperations> elasticsearchOperationsBean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link ElasticsearchRepositoryBean}.
|
* Creates a new {@link ElasticsearchRepositoryBean}.
|
||||||
*
|
*
|
||||||
* @param operations must not be {@literal null}.
|
* @param operations must not be {@literal null}.
|
||||||
* @param qualifiers must not be {@literal null}.
|
* @param qualifiers must not be {@literal null}.
|
||||||
* @param repositoryType must not be {@literal null}.
|
* @param repositoryType must not be {@literal null}.
|
||||||
* @param beanManager 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
|
* @param detector detector for the custom {@link org.springframework.data.repository.Repository} implementations
|
||||||
* {@link CustomRepositoryImplementationDetector}, can be {@literal null}.
|
* {@link CustomRepositoryImplementationDetector}, can be {@literal null}.
|
||||||
*/
|
*/
|
||||||
public ElasticsearchRepositoryBean(Bean<ElasticsearchOperations> operations, Set<Annotation> qualifiers,
|
public ElasticsearchRepositoryBean(Bean<ElasticsearchOperations> operations, Set<Annotation> qualifiers,
|
||||||
Class<T> repositoryType, BeanManager beanManager, CustomRepositoryImplementationDetector detector) {
|
Class<T> repositoryType, BeanManager beanManager, CustomRepositoryImplementationDetector detector) {
|
||||||
|
|
||||||
super(qualifiers, repositoryType, beanManager, Optional.of(detector));
|
super(qualifiers, repositoryType, beanManager, Optional.of(detector));
|
||||||
|
|
||||||
Assert.notNull(operations, "Cannot create repository with 'null' for ElasticsearchOperations.");
|
Assert.notNull(operations, "Cannot create repository with 'null' for ElasticsearchOperations.");
|
||||||
this.elasticsearchOperationsBean = operations;
|
this.elasticsearchOperationsBean = operations;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.springframework.data.repository.cdi.CdiRepositoryBean#create(javax.enterprise.context.spi.CreationalContext, java.lang.Class, java.util.Optional)
|
* @see org.springframework.data.repository.cdi.CdiRepositoryBean#create(javax.enterprise.context.spi.CreationalContext, java.lang.Class, java.util.Optional)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected T create(CreationalContext<T> creationalContext, Class<T> repositoryType,
|
protected T create(CreationalContext<T> creationalContext, Class<T> repositoryType,
|
||||||
Optional<Object> customImplementation) {
|
Optional<Object> customImplementation) {
|
||||||
|
|
||||||
ElasticsearchOperations elasticsearchOperations = getDependencyInstance(elasticsearchOperationsBean,
|
ElasticsearchOperations elasticsearchOperations = getDependencyInstance(elasticsearchOperationsBean,
|
||||||
ElasticsearchOperations.class);
|
ElasticsearchOperations.class);
|
||||||
|
|
||||||
ElasticsearchRepositoryFactory factory = new ElasticsearchRepositoryFactory(elasticsearchOperations);
|
ElasticsearchRepositoryFactory factory = new ElasticsearchRepositoryFactory(elasticsearchOperations);
|
||||||
|
|
||||||
return customImplementation //
|
return customImplementation //
|
||||||
.map(o -> factory.getRepository(repositoryType, o)) //
|
.map(o -> factory.getRepository(repositoryType, o)) //
|
||||||
.orElseGet(() -> factory.getRepository(repositoryType));
|
.orElseGet(() -> factory.getRepository(repositoryType));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.springframework.data.repository.cdi.CdiRepositoryBean#getScope()
|
* @see org.springframework.data.repository.cdi.CdiRepositoryBean#getScope()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Class<? extends Annotation> getScope() {
|
public Class<? extends Annotation> getScope() {
|
||||||
return elasticsearchOperationsBean.getScope();
|
return elasticsearchOperationsBean.getScope();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+83
-83
@@ -1,83 +1,83 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository.cdi;
|
package org.springframework.data.elasticsearch.repository.cdi;
|
||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.enterprise.event.Observes;
|
import javax.enterprise.event.Observes;
|
||||||
import javax.enterprise.inject.UnsatisfiedResolutionException;
|
import javax.enterprise.inject.UnsatisfiedResolutionException;
|
||||||
import javax.enterprise.inject.spi.AfterBeanDiscovery;
|
import javax.enterprise.inject.spi.AfterBeanDiscovery;
|
||||||
import javax.enterprise.inject.spi.Bean;
|
import javax.enterprise.inject.spi.Bean;
|
||||||
import javax.enterprise.inject.spi.BeanManager;
|
import javax.enterprise.inject.spi.BeanManager;
|
||||||
import javax.enterprise.inject.spi.ProcessBean;
|
import javax.enterprise.inject.spi.ProcessBean;
|
||||||
|
|
||||||
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
||||||
import org.springframework.data.repository.cdi.CdiRepositoryBean;
|
import org.springframework.data.repository.cdi.CdiRepositoryBean;
|
||||||
import org.springframework.data.repository.cdi.CdiRepositoryExtensionSupport;
|
import org.springframework.data.repository.cdi.CdiRepositoryExtensionSupport;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CDI extension to export Elasticsearch repositories.
|
* CDI extension to export Elasticsearch repositories.
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public class ElasticsearchRepositoryExtension extends CdiRepositoryExtensionSupport {
|
public class ElasticsearchRepositoryExtension extends CdiRepositoryExtensionSupport {
|
||||||
|
|
||||||
private final Map<Set<Annotation>, Bean<ElasticsearchOperations>> elasticsearchOperationsMap = new HashMap<>();
|
private final Map<Set<Annotation>, Bean<ElasticsearchOperations>> elasticsearchOperationsMap = new HashMap<>();
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
<T> void processBean(@Observes ProcessBean<T> processBean) {
|
<T> void processBean(@Observes ProcessBean<T> processBean) {
|
||||||
Bean<T> bean = processBean.getBean();
|
Bean<T> bean = processBean.getBean();
|
||||||
for (Type type : bean.getTypes()) {
|
for (Type type : bean.getTypes()) {
|
||||||
if (type instanceof Class<?> && ElasticsearchOperations.class.isAssignableFrom((Class<?>) type)) {
|
if (type instanceof Class<?> && ElasticsearchOperations.class.isAssignableFrom((Class<?>) type)) {
|
||||||
elasticsearchOperationsMap.put(bean.getQualifiers(), ((Bean<ElasticsearchOperations>) bean));
|
elasticsearchOperationsMap.put(bean.getQualifiers(), ((Bean<ElasticsearchOperations>) bean));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void afterBeanDiscovery(@Observes AfterBeanDiscovery afterBeanDiscovery, BeanManager beanManager) {
|
void afterBeanDiscovery(@Observes AfterBeanDiscovery afterBeanDiscovery, BeanManager beanManager) {
|
||||||
for (Entry<Class<?>, Set<Annotation>> entry : getRepositoryTypes()) {
|
for (Entry<Class<?>, Set<Annotation>> entry : getRepositoryTypes()) {
|
||||||
|
|
||||||
Class<?> repositoryType = entry.getKey();
|
Class<?> repositoryType = entry.getKey();
|
||||||
Set<Annotation> qualifiers = entry.getValue();
|
Set<Annotation> qualifiers = entry.getValue();
|
||||||
|
|
||||||
CdiRepositoryBean<?> repositoryBean = createRepositoryBean(repositoryType, qualifiers, beanManager);
|
CdiRepositoryBean<?> repositoryBean = createRepositoryBean(repositoryType, qualifiers, beanManager);
|
||||||
afterBeanDiscovery.addBean(repositoryBean);
|
afterBeanDiscovery.addBean(repositoryBean);
|
||||||
registerBean(repositoryBean);
|
registerBean(repositoryBean);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private <T> CdiRepositoryBean<T> createRepositoryBean(Class<T> repositoryType, Set<Annotation> qualifiers,
|
private <T> CdiRepositoryBean<T> createRepositoryBean(Class<T> repositoryType, Set<Annotation> qualifiers,
|
||||||
BeanManager beanManager) {
|
BeanManager beanManager) {
|
||||||
|
|
||||||
if (!this.elasticsearchOperationsMap.containsKey(qualifiers)) {
|
if (!this.elasticsearchOperationsMap.containsKey(qualifiers)) {
|
||||||
throw new UnsatisfiedResolutionException(String.format("Unable to resolve a bean for '%s' with qualifiers %s.",
|
throw new UnsatisfiedResolutionException(String.format("Unable to resolve a bean for '%s' with qualifiers %s.",
|
||||||
ElasticsearchOperations.class.getName(), qualifiers));
|
ElasticsearchOperations.class.getName(), qualifiers));
|
||||||
}
|
}
|
||||||
|
|
||||||
Bean<ElasticsearchOperations> elasticsearchOperationsBean = this.elasticsearchOperationsMap.get(qualifiers);
|
Bean<ElasticsearchOperations> elasticsearchOperationsBean = this.elasticsearchOperationsMap.get(qualifiers);
|
||||||
|
|
||||||
return new ElasticsearchRepositoryBean<>(elasticsearchOperationsBean, qualifiers, repositoryType, beanManager,
|
return new ElasticsearchRepositoryBean<>(elasticsearchOperationsBean, qualifiers, repositoryType, beanManager,
|
||||||
getCustomImplementationDetector());
|
getCustomImplementationDetector());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+44
-44
@@ -1,44 +1,44 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository.query;
|
package org.springframework.data.elasticsearch.repository.query;
|
||||||
|
|
||||||
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
||||||
import org.springframework.data.repository.query.QueryMethod;
|
import org.springframework.data.repository.query.QueryMethod;
|
||||||
import org.springframework.data.repository.query.RepositoryQuery;
|
import org.springframework.data.repository.query.RepositoryQuery;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AbstractElasticsearchRepositoryQuery
|
* AbstractElasticsearchRepositoryQuery
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public abstract class AbstractElasticsearchRepositoryQuery implements RepositoryQuery {
|
public abstract class AbstractElasticsearchRepositoryQuery implements RepositoryQuery {
|
||||||
|
|
||||||
protected ElasticsearchQueryMethod queryMethod;
|
protected ElasticsearchQueryMethod queryMethod;
|
||||||
protected ElasticsearchOperations elasticsearchOperations;
|
protected ElasticsearchOperations elasticsearchOperations;
|
||||||
|
|
||||||
public AbstractElasticsearchRepositoryQuery(ElasticsearchQueryMethod queryMethod,
|
public AbstractElasticsearchRepositoryQuery(ElasticsearchQueryMethod queryMethod,
|
||||||
ElasticsearchOperations elasticsearchOperations) {
|
ElasticsearchOperations elasticsearchOperations) {
|
||||||
this.queryMethod = queryMethod;
|
this.queryMethod = queryMethod;
|
||||||
this.elasticsearchOperations = elasticsearchOperations;
|
this.elasticsearchOperations = elasticsearchOperations;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public QueryMethod getQueryMethod() {
|
public QueryMethod getQueryMethod() {
|
||||||
return queryMethod;
|
return queryMethod;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+107
-107
@@ -1,107 +1,107 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository.query;
|
package org.springframework.data.elasticsearch.repository.query;
|
||||||
|
|
||||||
import org.springframework.data.domain.PageRequest;
|
import org.springframework.data.domain.PageRequest;
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
||||||
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
||||||
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
|
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
|
||||||
import org.springframework.data.elasticsearch.repository.query.parser.ElasticsearchQueryCreator;
|
import org.springframework.data.elasticsearch.repository.query.parser.ElasticsearchQueryCreator;
|
||||||
import org.springframework.data.mapping.context.MappingContext;
|
import org.springframework.data.mapping.context.MappingContext;
|
||||||
import org.springframework.data.repository.query.ParametersParameterAccessor;
|
import org.springframework.data.repository.query.ParametersParameterAccessor;
|
||||||
import org.springframework.data.repository.query.parser.PartTree;
|
import org.springframework.data.repository.query.parser.PartTree;
|
||||||
import org.springframework.util.ClassUtils;
|
import org.springframework.util.ClassUtils;
|
||||||
import org.springframework.data.util.CloseableIterator;
|
import org.springframework.data.util.CloseableIterator;
|
||||||
import org.springframework.data.util.StreamUtils;
|
import org.springframework.data.util.StreamUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ElasticsearchPartQuery
|
* ElasticsearchPartQuery
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Kevin Leturc
|
* @author Kevin Leturc
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public class ElasticsearchPartQuery extends AbstractElasticsearchRepositoryQuery {
|
public class ElasticsearchPartQuery extends AbstractElasticsearchRepositoryQuery {
|
||||||
|
|
||||||
private final PartTree tree;
|
private final PartTree tree;
|
||||||
private final MappingContext<?, ElasticsearchPersistentProperty> mappingContext;
|
private final MappingContext<?, ElasticsearchPersistentProperty> mappingContext;
|
||||||
|
|
||||||
public ElasticsearchPartQuery(ElasticsearchQueryMethod method, ElasticsearchOperations elasticsearchOperations) {
|
public ElasticsearchPartQuery(ElasticsearchQueryMethod method, ElasticsearchOperations elasticsearchOperations) {
|
||||||
super(method, elasticsearchOperations);
|
super(method, elasticsearchOperations);
|
||||||
this.tree = new PartTree(method.getName(), method.getEntityInformation().getJavaType());
|
this.tree = new PartTree(method.getName(), method.getEntityInformation().getJavaType());
|
||||||
this.mappingContext = elasticsearchOperations.getElasticsearchConverter().getMappingContext();
|
this.mappingContext = elasticsearchOperations.getElasticsearchConverter().getMappingContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object execute(Object[] parameters) {
|
public Object execute(Object[] parameters) {
|
||||||
ParametersParameterAccessor accessor = new ParametersParameterAccessor(queryMethod.getParameters(), parameters);
|
ParametersParameterAccessor accessor = new ParametersParameterAccessor(queryMethod.getParameters(), parameters);
|
||||||
CriteriaQuery query = createQuery(accessor);
|
CriteriaQuery query = createQuery(accessor);
|
||||||
if(tree.isDelete()) {
|
if(tree.isDelete()) {
|
||||||
Object result = countOrGetDocumentsForDelete(query, accessor);
|
Object result = countOrGetDocumentsForDelete(query, accessor);
|
||||||
elasticsearchOperations.delete(query, queryMethod.getEntityInformation().getJavaType());
|
elasticsearchOperations.delete(query, queryMethod.getEntityInformation().getJavaType());
|
||||||
return result;
|
return result;
|
||||||
} else if (queryMethod.isPageQuery()) {
|
} else if (queryMethod.isPageQuery()) {
|
||||||
query.setPageable(accessor.getPageable());
|
query.setPageable(accessor.getPageable());
|
||||||
return elasticsearchOperations.queryForPage(query, queryMethod.getEntityInformation().getJavaType());
|
return elasticsearchOperations.queryForPage(query, queryMethod.getEntityInformation().getJavaType());
|
||||||
} else if (queryMethod.isStreamQuery()) {
|
} else if (queryMethod.isStreamQuery()) {
|
||||||
Class<?> entityType = queryMethod.getEntityInformation().getJavaType();
|
Class<?> entityType = queryMethod.getEntityInformation().getJavaType();
|
||||||
if (query.getPageable().isUnpaged()) {
|
if (query.getPageable().isUnpaged()) {
|
||||||
int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType());
|
int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType());
|
||||||
query.setPageable(PageRequest.of(0, Math.max(1, itemCount)));
|
query.setPageable(PageRequest.of(0, Math.max(1, itemCount)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return StreamUtils.createStreamFromIterator((CloseableIterator<Object>) elasticsearchOperations.stream(query, entityType));
|
return StreamUtils.createStreamFromIterator((CloseableIterator<Object>) elasticsearchOperations.stream(query, entityType));
|
||||||
|
|
||||||
} else if (queryMethod.isCollectionQuery()) {
|
} else if (queryMethod.isCollectionQuery()) {
|
||||||
if (accessor.getPageable() == null) {
|
if (accessor.getPageable() == null) {
|
||||||
int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType());
|
int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType());
|
||||||
query.setPageable(PageRequest.of(0, Math.max(1, itemCount)));
|
query.setPageable(PageRequest.of(0, Math.max(1, itemCount)));
|
||||||
} else {
|
} else {
|
||||||
query.setPageable(accessor.getPageable());
|
query.setPageable(accessor.getPageable());
|
||||||
}
|
}
|
||||||
return elasticsearchOperations.queryForList(query, queryMethod.getEntityInformation().getJavaType());
|
return elasticsearchOperations.queryForList(query, queryMethod.getEntityInformation().getJavaType());
|
||||||
} else if (tree.isCountProjection()) {
|
} else if (tree.isCountProjection()) {
|
||||||
return elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType());
|
return elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType());
|
||||||
}
|
}
|
||||||
return elasticsearchOperations.queryForObject(query, queryMethod.getEntityInformation().getJavaType());
|
return elasticsearchOperations.queryForObject(query, queryMethod.getEntityInformation().getJavaType());
|
||||||
}
|
}
|
||||||
|
|
||||||
private Object countOrGetDocumentsForDelete(CriteriaQuery query, ParametersParameterAccessor accessor) {
|
private Object countOrGetDocumentsForDelete(CriteriaQuery query, ParametersParameterAccessor accessor) {
|
||||||
|
|
||||||
Object result = null;
|
Object result = null;
|
||||||
|
|
||||||
if (queryMethod.isCollectionQuery()) {
|
if (queryMethod.isCollectionQuery()) {
|
||||||
if (accessor.getPageable().isUnpaged()) {
|
if (accessor.getPageable().isUnpaged()) {
|
||||||
int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType());
|
int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType());
|
||||||
query.setPageable(PageRequest.of(0, Math.max(1, itemCount)));
|
query.setPageable(PageRequest.of(0, Math.max(1, itemCount)));
|
||||||
} else {
|
} else {
|
||||||
query.setPageable(accessor.getPageable());
|
query.setPageable(accessor.getPageable());
|
||||||
}
|
}
|
||||||
result = elasticsearchOperations.queryForList(query, queryMethod.getEntityInformation().getJavaType());
|
result = elasticsearchOperations.queryForList(query, queryMethod.getEntityInformation().getJavaType());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ClassUtils.isAssignable(Number.class, queryMethod.getReturnedObjectType())) {
|
if (ClassUtils.isAssignable(Number.class, queryMethod.getReturnedObjectType())) {
|
||||||
result = elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType());
|
result = elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType());
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CriteriaQuery createQuery(ParametersParameterAccessor accessor) {
|
public CriteriaQuery createQuery(ParametersParameterAccessor accessor) {
|
||||||
return new ElasticsearchQueryCreator(tree, accessor, mappingContext).createQuery();
|
return new ElasticsearchQueryCreator(tree, accessor, mappingContext).createQuery();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+50
-50
@@ -1,50 +1,50 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository.query;
|
package org.springframework.data.elasticsearch.repository.query;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import org.springframework.core.annotation.AnnotationUtils;
|
import org.springframework.core.annotation.AnnotationUtils;
|
||||||
import org.springframework.data.elasticsearch.annotations.Query;
|
import org.springframework.data.elasticsearch.annotations.Query;
|
||||||
import org.springframework.data.projection.ProjectionFactory;
|
import org.springframework.data.projection.ProjectionFactory;
|
||||||
import org.springframework.data.repository.core.RepositoryMetadata;
|
import org.springframework.data.repository.core.RepositoryMetadata;
|
||||||
import org.springframework.data.repository.query.QueryMethod;
|
import org.springframework.data.repository.query.QueryMethod;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ElasticsearchQueryMethod
|
* ElasticsearchQueryMethod
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public class ElasticsearchQueryMethod extends QueryMethod {
|
public class ElasticsearchQueryMethod extends QueryMethod {
|
||||||
|
|
||||||
private final Query queryAnnotation;
|
private final Query queryAnnotation;
|
||||||
|
|
||||||
public ElasticsearchQueryMethod(Method method, RepositoryMetadata metadata, ProjectionFactory factory) {
|
public ElasticsearchQueryMethod(Method method, RepositoryMetadata metadata, ProjectionFactory factory) {
|
||||||
super(method, metadata, factory);
|
super(method, metadata, factory);
|
||||||
this.queryAnnotation = method.getAnnotation(Query.class);
|
this.queryAnnotation = method.getAnnotation(Query.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasAnnotatedQuery() {
|
public boolean hasAnnotatedQuery() {
|
||||||
return this.queryAnnotation != null;
|
return this.queryAnnotation != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAnnotatedQuery() {
|
public String getAnnotatedQuery() {
|
||||||
return (String) AnnotationUtils.getValue(queryAnnotation, "value");
|
return (String) AnnotationUtils.getValue(queryAnnotation, "value");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+105
-105
@@ -1,105 +1,105 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository.query;
|
package org.springframework.data.elasticsearch.repository.query;
|
||||||
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.springframework.core.convert.support.GenericConversionService;
|
import org.springframework.core.convert.support.GenericConversionService;
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
||||||
import org.springframework.data.elasticsearch.core.convert.DateTimeConverters;
|
import org.springframework.data.elasticsearch.core.convert.DateTimeConverters;
|
||||||
import org.springframework.data.elasticsearch.core.query.StringQuery;
|
import org.springframework.data.elasticsearch.core.query.StringQuery;
|
||||||
import org.springframework.data.repository.query.ParametersParameterAccessor;
|
import org.springframework.data.repository.query.ParametersParameterAccessor;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ElasticsearchStringQuery
|
* ElasticsearchStringQuery
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public class ElasticsearchStringQuery extends AbstractElasticsearchRepositoryQuery {
|
public class ElasticsearchStringQuery extends AbstractElasticsearchRepositoryQuery {
|
||||||
|
|
||||||
private static final Pattern PARAMETER_PLACEHOLDER = Pattern.compile("\\?(\\d+)");
|
private static final Pattern PARAMETER_PLACEHOLDER = Pattern.compile("\\?(\\d+)");
|
||||||
private String query;
|
private String query;
|
||||||
|
|
||||||
private final GenericConversionService conversionService = new GenericConversionService();
|
private final GenericConversionService conversionService = new GenericConversionService();
|
||||||
|
|
||||||
{
|
{
|
||||||
if (!conversionService.canConvert(java.util.Date.class, String.class)) {
|
if (!conversionService.canConvert(java.util.Date.class, String.class)) {
|
||||||
conversionService.addConverter(DateTimeConverters.JavaDateConverter.INSTANCE);
|
conversionService.addConverter(DateTimeConverters.JavaDateConverter.INSTANCE);
|
||||||
}
|
}
|
||||||
if (!conversionService.canConvert(org.joda.time.ReadableInstant.class, String.class)) {
|
if (!conversionService.canConvert(org.joda.time.ReadableInstant.class, String.class)) {
|
||||||
conversionService.addConverter(DateTimeConverters.JodaDateTimeConverter.INSTANCE);
|
conversionService.addConverter(DateTimeConverters.JodaDateTimeConverter.INSTANCE);
|
||||||
}
|
}
|
||||||
if (!conversionService.canConvert(org.joda.time.LocalDateTime.class, String.class)) {
|
if (!conversionService.canConvert(org.joda.time.LocalDateTime.class, String.class)) {
|
||||||
conversionService.addConverter(DateTimeConverters.JodaLocalDateTimeConverter.INSTANCE);
|
conversionService.addConverter(DateTimeConverters.JodaLocalDateTimeConverter.INSTANCE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ElasticsearchStringQuery(ElasticsearchQueryMethod queryMethod, ElasticsearchOperations elasticsearchOperations,
|
public ElasticsearchStringQuery(ElasticsearchQueryMethod queryMethod, ElasticsearchOperations elasticsearchOperations,
|
||||||
String query) {
|
String query) {
|
||||||
super(queryMethod, elasticsearchOperations);
|
super(queryMethod, elasticsearchOperations);
|
||||||
Assert.notNull(query, "Query cannot be empty");
|
Assert.notNull(query, "Query cannot be empty");
|
||||||
this.query = query;
|
this.query = query;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object execute(Object[] parameters) {
|
public Object execute(Object[] parameters) {
|
||||||
ParametersParameterAccessor accessor = new ParametersParameterAccessor(queryMethod.getParameters(), parameters);
|
ParametersParameterAccessor accessor = new ParametersParameterAccessor(queryMethod.getParameters(), parameters);
|
||||||
StringQuery stringQuery = createQuery(accessor);
|
StringQuery stringQuery = createQuery(accessor);
|
||||||
if (queryMethod.isPageQuery()) {
|
if (queryMethod.isPageQuery()) {
|
||||||
stringQuery.setPageable(accessor.getPageable());
|
stringQuery.setPageable(accessor.getPageable());
|
||||||
return elasticsearchOperations.queryForPage(stringQuery, queryMethod.getEntityInformation().getJavaType());
|
return elasticsearchOperations.queryForPage(stringQuery, queryMethod.getEntityInformation().getJavaType());
|
||||||
} else if (queryMethod.isCollectionQuery()) {
|
} else if (queryMethod.isCollectionQuery()) {
|
||||||
if (accessor.getPageable().isPaged()) {
|
if (accessor.getPageable().isPaged()) {
|
||||||
stringQuery.setPageable(accessor.getPageable());
|
stringQuery.setPageable(accessor.getPageable());
|
||||||
}
|
}
|
||||||
return elasticsearchOperations.queryForList(stringQuery, queryMethod.getEntityInformation().getJavaType());
|
return elasticsearchOperations.queryForList(stringQuery, queryMethod.getEntityInformation().getJavaType());
|
||||||
}
|
}
|
||||||
|
|
||||||
return elasticsearchOperations.queryForObject(stringQuery, queryMethod.getEntityInformation().getJavaType());
|
return elasticsearchOperations.queryForObject(stringQuery, queryMethod.getEntityInformation().getJavaType());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected StringQuery createQuery(ParametersParameterAccessor parameterAccessor) {
|
protected StringQuery createQuery(ParametersParameterAccessor parameterAccessor) {
|
||||||
String queryString = replacePlaceholders(this.query, parameterAccessor);
|
String queryString = replacePlaceholders(this.query, parameterAccessor);
|
||||||
return new StringQuery(queryString);
|
return new StringQuery(queryString);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String replacePlaceholders(String input, ParametersParameterAccessor accessor) {
|
private String replacePlaceholders(String input, ParametersParameterAccessor accessor) {
|
||||||
Matcher matcher = PARAMETER_PLACEHOLDER.matcher(input);
|
Matcher matcher = PARAMETER_PLACEHOLDER.matcher(input);
|
||||||
String result = input;
|
String result = input;
|
||||||
while (matcher.find()) {
|
while (matcher.find()) {
|
||||||
String group = matcher.group();
|
String group = matcher.group();
|
||||||
int index = Integer.parseInt(matcher.group(1));
|
int index = Integer.parseInt(matcher.group(1));
|
||||||
result = result.replace(group, getParameterWithIndex(accessor, index));
|
result = result.replace(group, getParameterWithIndex(accessor, index));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getParameterWithIndex(ParametersParameterAccessor accessor, int index) {
|
private String getParameterWithIndex(ParametersParameterAccessor accessor, int index) {
|
||||||
Object parameter = accessor.getBindableValue(index);
|
Object parameter = accessor.getBindableValue(index);
|
||||||
if (parameter == null) {
|
if (parameter == null) {
|
||||||
return "null";
|
return "null";
|
||||||
}
|
}
|
||||||
if (conversionService.canConvert(parameter.getClass(), String.class)) {
|
if (conversionService.canConvert(parameter.getClass(), String.class)) {
|
||||||
return conversionService.convert(parameter, String.class);
|
return conversionService.convert(parameter, String.class);
|
||||||
}
|
}
|
||||||
return parameter.toString();
|
return parameter.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+195
-195
@@ -1,195 +1,195 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository.query.parser;
|
package org.springframework.data.elasticsearch.repository.query.parser;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
import org.springframework.dao.InvalidDataAccessApiUsageException;
|
import org.springframework.dao.InvalidDataAccessApiUsageException;
|
||||||
import org.springframework.data.domain.Sort;
|
import org.springframework.data.domain.Sort;
|
||||||
import org.springframework.data.elasticsearch.core.geo.GeoBox;
|
import org.springframework.data.elasticsearch.core.geo.GeoBox;
|
||||||
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
|
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
|
||||||
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
||||||
import org.springframework.data.elasticsearch.core.query.Criteria;
|
import org.springframework.data.elasticsearch.core.query.Criteria;
|
||||||
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
|
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
|
||||||
import org.springframework.data.geo.Box;
|
import org.springframework.data.geo.Box;
|
||||||
import org.springframework.data.geo.Distance;
|
import org.springframework.data.geo.Distance;
|
||||||
import org.springframework.data.geo.Point;
|
import org.springframework.data.geo.Point;
|
||||||
import org.springframework.data.mapping.context.MappingContext;
|
import org.springframework.data.mapping.context.MappingContext;
|
||||||
import org.springframework.data.mapping.context.PersistentPropertyPath;
|
import org.springframework.data.mapping.context.PersistentPropertyPath;
|
||||||
import org.springframework.data.repository.query.ParameterAccessor;
|
import org.springframework.data.repository.query.ParameterAccessor;
|
||||||
import org.springframework.data.repository.query.parser.AbstractQueryCreator;
|
import org.springframework.data.repository.query.parser.AbstractQueryCreator;
|
||||||
import org.springframework.data.repository.query.parser.Part;
|
import org.springframework.data.repository.query.parser.Part;
|
||||||
import org.springframework.data.repository.query.parser.PartTree;
|
import org.springframework.data.repository.query.parser.PartTree;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ElasticsearchQueryCreator
|
* ElasticsearchQueryCreator
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Franck Marchand
|
* @author Franck Marchand
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
*/
|
*/
|
||||||
public class ElasticsearchQueryCreator extends AbstractQueryCreator<CriteriaQuery, CriteriaQuery> {
|
public class ElasticsearchQueryCreator extends AbstractQueryCreator<CriteriaQuery, CriteriaQuery> {
|
||||||
|
|
||||||
private final MappingContext<?, ElasticsearchPersistentProperty> context;
|
private final MappingContext<?, ElasticsearchPersistentProperty> context;
|
||||||
|
|
||||||
public ElasticsearchQueryCreator(PartTree tree, ParameterAccessor parameters,
|
public ElasticsearchQueryCreator(PartTree tree, ParameterAccessor parameters,
|
||||||
MappingContext<?, ElasticsearchPersistentProperty> context) {
|
MappingContext<?, ElasticsearchPersistentProperty> context) {
|
||||||
super(tree, parameters);
|
super(tree, parameters);
|
||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ElasticsearchQueryCreator(PartTree tree, MappingContext<?, ElasticsearchPersistentProperty> context) {
|
public ElasticsearchQueryCreator(PartTree tree, MappingContext<?, ElasticsearchPersistentProperty> context) {
|
||||||
super(tree);
|
super(tree);
|
||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected CriteriaQuery create(Part part, Iterator<Object> iterator) {
|
protected CriteriaQuery create(Part part, Iterator<Object> iterator) {
|
||||||
PersistentPropertyPath<ElasticsearchPersistentProperty> path = context
|
PersistentPropertyPath<ElasticsearchPersistentProperty> path = context
|
||||||
.getPersistentPropertyPath(part.getProperty());
|
.getPersistentPropertyPath(part.getProperty());
|
||||||
return new CriteriaQuery(from(part,
|
return new CriteriaQuery(from(part,
|
||||||
new Criteria(path.toDotPath(ElasticsearchPersistentProperty.PropertyToFieldNameConverter.INSTANCE)), iterator));
|
new Criteria(path.toDotPath(ElasticsearchPersistentProperty.PropertyToFieldNameConverter.INSTANCE)), iterator));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected CriteriaQuery and(Part part, CriteriaQuery base, Iterator<Object> iterator) {
|
protected CriteriaQuery and(Part part, CriteriaQuery base, Iterator<Object> iterator) {
|
||||||
if (base == null) {
|
if (base == null) {
|
||||||
return create(part, iterator);
|
return create(part, iterator);
|
||||||
}
|
}
|
||||||
PersistentPropertyPath<ElasticsearchPersistentProperty> path = context
|
PersistentPropertyPath<ElasticsearchPersistentProperty> path = context
|
||||||
.getPersistentPropertyPath(part.getProperty());
|
.getPersistentPropertyPath(part.getProperty());
|
||||||
return base.addCriteria(from(part,
|
return base.addCriteria(from(part,
|
||||||
new Criteria(path.toDotPath(ElasticsearchPersistentProperty.PropertyToFieldNameConverter.INSTANCE)), iterator));
|
new Criteria(path.toDotPath(ElasticsearchPersistentProperty.PropertyToFieldNameConverter.INSTANCE)), iterator));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected CriteriaQuery or(CriteriaQuery base, CriteriaQuery query) {
|
protected CriteriaQuery or(CriteriaQuery base, CriteriaQuery query) {
|
||||||
return new CriteriaQuery(base.getCriteria().or(query.getCriteria()));
|
return new CriteriaQuery(base.getCriteria().or(query.getCriteria()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected CriteriaQuery complete(CriteriaQuery query, Sort sort) {
|
protected CriteriaQuery complete(CriteriaQuery query, Sort sort) {
|
||||||
if (query == null) {
|
if (query == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return query.addSort(sort);
|
return query.addSort(sort);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Criteria from(Part part, Criteria instance, Iterator<?> parameters) {
|
private Criteria from(Part part, Criteria instance, Iterator<?> parameters) {
|
||||||
Part.Type type = part.getType();
|
Part.Type type = part.getType();
|
||||||
|
|
||||||
Criteria criteria = instance;
|
Criteria criteria = instance;
|
||||||
if (criteria == null) {
|
if (criteria == null) {
|
||||||
criteria = new Criteria();
|
criteria = new Criteria();
|
||||||
}
|
}
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TRUE:
|
case TRUE:
|
||||||
return criteria.is(true);
|
return criteria.is(true);
|
||||||
case FALSE:
|
case FALSE:
|
||||||
return criteria.is(false);
|
return criteria.is(false);
|
||||||
case NEGATING_SIMPLE_PROPERTY:
|
case NEGATING_SIMPLE_PROPERTY:
|
||||||
return criteria.is(parameters.next()).not();
|
return criteria.is(parameters.next()).not();
|
||||||
case REGEX:
|
case REGEX:
|
||||||
return criteria.expression(parameters.next().toString());
|
return criteria.expression(parameters.next().toString());
|
||||||
case LIKE:
|
case LIKE:
|
||||||
case STARTING_WITH:
|
case STARTING_WITH:
|
||||||
return criteria.startsWith(parameters.next().toString());
|
return criteria.startsWith(parameters.next().toString());
|
||||||
case ENDING_WITH:
|
case ENDING_WITH:
|
||||||
return criteria.endsWith(parameters.next().toString());
|
return criteria.endsWith(parameters.next().toString());
|
||||||
case CONTAINING:
|
case CONTAINING:
|
||||||
return criteria.contains(parameters.next().toString());
|
return criteria.contains(parameters.next().toString());
|
||||||
case GREATER_THAN:
|
case GREATER_THAN:
|
||||||
return criteria.greaterThan(parameters.next());
|
return criteria.greaterThan(parameters.next());
|
||||||
case AFTER:
|
case AFTER:
|
||||||
case GREATER_THAN_EQUAL:
|
case GREATER_THAN_EQUAL:
|
||||||
return criteria.greaterThanEqual(parameters.next());
|
return criteria.greaterThanEqual(parameters.next());
|
||||||
case LESS_THAN:
|
case LESS_THAN:
|
||||||
return criteria.lessThan(parameters.next());
|
return criteria.lessThan(parameters.next());
|
||||||
case BEFORE:
|
case BEFORE:
|
||||||
case LESS_THAN_EQUAL:
|
case LESS_THAN_EQUAL:
|
||||||
return criteria.lessThanEqual(parameters.next());
|
return criteria.lessThanEqual(parameters.next());
|
||||||
case BETWEEN:
|
case BETWEEN:
|
||||||
return criteria.between(parameters.next(), parameters.next());
|
return criteria.between(parameters.next(), parameters.next());
|
||||||
case IN:
|
case IN:
|
||||||
return criteria.in(asArray(parameters.next()));
|
return criteria.in(asArray(parameters.next()));
|
||||||
case NOT_IN:
|
case NOT_IN:
|
||||||
return criteria.notIn(asArray(parameters.next()));
|
return criteria.notIn(asArray(parameters.next()));
|
||||||
case SIMPLE_PROPERTY:
|
case SIMPLE_PROPERTY:
|
||||||
case WITHIN: {
|
case WITHIN: {
|
||||||
Object firstParameter = parameters.next();
|
Object firstParameter = parameters.next();
|
||||||
Object secondParameter = null;
|
Object secondParameter = null;
|
||||||
if (type == Part.Type.SIMPLE_PROPERTY) {
|
if (type == Part.Type.SIMPLE_PROPERTY) {
|
||||||
if (part.getProperty().getType() != GeoPoint.class)
|
if (part.getProperty().getType() != GeoPoint.class)
|
||||||
return criteria.is(firstParameter);
|
return criteria.is(firstParameter);
|
||||||
else {
|
else {
|
||||||
// it means it's a simple find with exact geopoint matching (e.g. findByLocation)
|
// 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
|
// 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.
|
// as argument we use a "geo distance" query with a distance of one meter.
|
||||||
secondParameter = ".001km";
|
secondParameter = ".001km";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
secondParameter = parameters.next();
|
secondParameter = parameters.next();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (firstParameter instanceof GeoPoint && secondParameter instanceof String)
|
if (firstParameter instanceof GeoPoint && secondParameter instanceof String)
|
||||||
return criteria.within((GeoPoint) firstParameter, (String) secondParameter);
|
return criteria.within((GeoPoint) firstParameter, (String) secondParameter);
|
||||||
|
|
||||||
if (firstParameter instanceof Point && secondParameter instanceof Distance)
|
if (firstParameter instanceof Point && secondParameter instanceof Distance)
|
||||||
return criteria.within((Point) firstParameter, (Distance) secondParameter);
|
return criteria.within((Point) firstParameter, (Distance) secondParameter);
|
||||||
|
|
||||||
if (firstParameter instanceof String && secondParameter instanceof String)
|
if (firstParameter instanceof String && secondParameter instanceof String)
|
||||||
return criteria.within((String) firstParameter, (String) secondParameter);
|
return criteria.within((String) firstParameter, (String) secondParameter);
|
||||||
}
|
}
|
||||||
case NEAR: {
|
case NEAR: {
|
||||||
Object firstParameter = parameters.next();
|
Object firstParameter = parameters.next();
|
||||||
|
|
||||||
if (firstParameter instanceof GeoBox) {
|
if (firstParameter instanceof GeoBox) {
|
||||||
return criteria.boundedBy((GeoBox) firstParameter);
|
return criteria.boundedBy((GeoBox) firstParameter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (firstParameter instanceof Box) {
|
if (firstParameter instanceof Box) {
|
||||||
return criteria.boundedBy(GeoBox.fromBox((Box) firstParameter));
|
return criteria.boundedBy(GeoBox.fromBox((Box) firstParameter));
|
||||||
}
|
}
|
||||||
|
|
||||||
Object secondParameter = parameters.next();
|
Object secondParameter = parameters.next();
|
||||||
|
|
||||||
// "near" query can be the same query as the "within" query
|
// "near" query can be the same query as the "within" query
|
||||||
if (firstParameter instanceof GeoPoint && secondParameter instanceof String)
|
if (firstParameter instanceof GeoPoint && secondParameter instanceof String)
|
||||||
return criteria.within((GeoPoint) firstParameter, (String) secondParameter);
|
return criteria.within((GeoPoint) firstParameter, (String) secondParameter);
|
||||||
|
|
||||||
if (firstParameter instanceof Point && secondParameter instanceof Distance)
|
if (firstParameter instanceof Point && secondParameter instanceof Distance)
|
||||||
return criteria.within((Point) firstParameter, (Distance) secondParameter);
|
return criteria.within((Point) firstParameter, (Distance) secondParameter);
|
||||||
|
|
||||||
if (firstParameter instanceof String && secondParameter instanceof String)
|
if (firstParameter instanceof String && secondParameter instanceof String)
|
||||||
return criteria.within((String) firstParameter, (String) secondParameter);
|
return criteria.within((String) firstParameter, (String) secondParameter);
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new InvalidDataAccessApiUsageException("Illegal criteria found '" + type + "'.");
|
throw new InvalidDataAccessApiUsageException("Illegal criteria found '" + type + "'.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Object[] asArray(Object o) {
|
private Object[] asArray(Object o) {
|
||||||
if (o instanceof Collection) {
|
if (o instanceof Collection) {
|
||||||
return ((Collection<?>) o).toArray();
|
return ((Collection<?>) o).toArray();
|
||||||
} else if (o.getClass().isArray()) {
|
} else if (o.getClass().isArray()) {
|
||||||
return (Object[]) o;
|
return (Object[]) o;
|
||||||
}
|
}
|
||||||
return new Object[]{o};
|
return new Object[]{o};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -55,6 +55,7 @@ import org.springframework.util.Assert;
|
|||||||
* @author Kevin Leturc
|
* @author Kevin Leturc
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
* @author Christoph Strobl
|
* @author Christoph Strobl
|
||||||
|
* @author Michael Wirth
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractElasticsearchRepository<T, ID extends Serializable>
|
public abstract class AbstractElasticsearchRepository<T, ID extends Serializable>
|
||||||
implements ElasticsearchRepository<T, ID> {
|
implements ElasticsearchRepository<T, ID> {
|
||||||
@@ -188,7 +189,7 @@ public abstract class AbstractElasticsearchRepository<T, ID extends Serializable
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean existsById(ID id) {
|
public boolean existsById(ID id) {
|
||||||
return findById(id) != null;
|
return findById(id).isPresent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+38
-38
@@ -1,38 +1,38 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository.support;
|
package org.springframework.data.elasticsearch.repository.support;
|
||||||
|
|
||||||
import org.springframework.data.repository.core.EntityInformation;
|
import org.springframework.data.repository.core.EntityInformation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param <T>
|
* @param <T>
|
||||||
* @param <ID>
|
* @param <ID>
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Christoph Strobl
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
public interface ElasticsearchEntityInformation<T, ID> extends EntityInformation<T, ID> {
|
public interface ElasticsearchEntityInformation<T, ID> extends EntityInformation<T, ID> {
|
||||||
|
|
||||||
String getIdAttribute();
|
String getIdAttribute();
|
||||||
|
|
||||||
String getIndexName();
|
String getIndexName();
|
||||||
|
|
||||||
String getType();
|
String getType();
|
||||||
|
|
||||||
Long getVersion(T entity);
|
Long getVersion(T entity);
|
||||||
|
|
||||||
String getParentId(T entity);
|
String getParentId(T entity);
|
||||||
}
|
}
|
||||||
|
|||||||
+28
-28
@@ -1,28 +1,28 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository.support;
|
package org.springframework.data.elasticsearch.repository.support;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ElasticsearchEntityInformationCreator
|
* ElasticsearchEntityInformationCreator
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Christoph Strobl
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
public interface ElasticsearchEntityInformationCreator {
|
public interface ElasticsearchEntityInformationCreator {
|
||||||
|
|
||||||
<T, ID> ElasticsearchEntityInformation<T, ID> getEntityInformation(Class<T> domainClass);
|
<T, ID> ElasticsearchEntityInformation<T, ID> getEntityInformation(Class<T> domainClass);
|
||||||
}
|
}
|
||||||
|
|||||||
+56
-56
@@ -1,56 +1,56 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository.support;
|
package org.springframework.data.elasticsearch.repository.support;
|
||||||
|
|
||||||
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
|
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
|
||||||
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
||||||
import org.springframework.data.mapping.context.MappingContext;
|
import org.springframework.data.mapping.context.MappingContext;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ElasticsearchEntityInformationCreatorImpl
|
* ElasticsearchEntityInformationCreatorImpl
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
* @author Christoph Strobl
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
public class ElasticsearchEntityInformationCreatorImpl implements ElasticsearchEntityInformationCreator {
|
public class ElasticsearchEntityInformationCreatorImpl implements ElasticsearchEntityInformationCreator {
|
||||||
|
|
||||||
private final MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext;
|
private final MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext;
|
||||||
|
|
||||||
public ElasticsearchEntityInformationCreatorImpl(
|
public ElasticsearchEntityInformationCreatorImpl(
|
||||||
MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext) {
|
MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext) {
|
||||||
|
|
||||||
Assert.notNull(mappingContext, "MappingContext must not be null!");
|
Assert.notNull(mappingContext, "MappingContext must not be null!");
|
||||||
|
|
||||||
this.mappingContext = mappingContext;
|
this.mappingContext = mappingContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public <T, ID> ElasticsearchEntityInformation<T, ID> getEntityInformation(Class<T> domainClass) {
|
public <T, ID> ElasticsearchEntityInformation<T, ID> getEntityInformation(Class<T> domainClass) {
|
||||||
|
|
||||||
ElasticsearchPersistentEntity<T> persistentEntity = (ElasticsearchPersistentEntity<T>) mappingContext
|
ElasticsearchPersistentEntity<T> persistentEntity = (ElasticsearchPersistentEntity<T>) mappingContext
|
||||||
.getRequiredPersistentEntity(domainClass);
|
.getRequiredPersistentEntity(domainClass);
|
||||||
|
|
||||||
Assert.notNull(persistentEntity, String.format("Unable to obtain mapping metadata for %s!", 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));
|
Assert.notNull(persistentEntity.getIdProperty(), String.format("No id property found for %s!", domainClass));
|
||||||
|
|
||||||
return new MappingElasticsearchEntityInformation<>(persistentEntity);
|
return new MappingElasticsearchEntityInformation<>(persistentEntity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+47
-47
@@ -1,47 +1,47 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository.support;
|
package org.springframework.data.elasticsearch.repository.support;
|
||||||
|
|
||||||
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Elasticsearch specific repository implementation. Likely to be used as target within
|
* Elasticsearch specific repository implementation. Likely to be used as target within
|
||||||
* {@link ElasticsearchRepositoryFactory}
|
* {@link ElasticsearchRepositoryFactory}
|
||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Ryan Henszey
|
* @author Ryan Henszey
|
||||||
*/
|
*/
|
||||||
public class SimpleElasticsearchRepository<T> extends AbstractElasticsearchRepository<T, String> {
|
public class SimpleElasticsearchRepository<T> extends AbstractElasticsearchRepository<T, String> {
|
||||||
|
|
||||||
public SimpleElasticsearchRepository() {
|
public SimpleElasticsearchRepository() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
public SimpleElasticsearchRepository(ElasticsearchEntityInformation<T, String> metadata,
|
public SimpleElasticsearchRepository(ElasticsearchEntityInformation<T, String> metadata,
|
||||||
ElasticsearchOperations elasticsearchOperations) {
|
ElasticsearchOperations elasticsearchOperations) {
|
||||||
super(metadata, elasticsearchOperations);
|
super(metadata, elasticsearchOperations);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SimpleElasticsearchRepository(ElasticsearchOperations elasticsearchOperations) {
|
public SimpleElasticsearchRepository(ElasticsearchOperations elasticsearchOperations) {
|
||||||
super(elasticsearchOperations);
|
super(elasticsearchOperations);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String stringIdRepresentation(String id) {
|
protected String stringIdRepresentation(String id) {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,121 @@
|
|||||||
Spring Data Elasticsearch Changelog
|
Spring Data Elasticsearch Changelog
|
||||||
===================================
|
===================================
|
||||||
|
|
||||||
|
Changes in version 3.0.8.RELEASE (2018-06-13)
|
||||||
|
---------------------------------------------
|
||||||
|
* DATAES-460 - Avoid pulling in Netty 3 as dependency.
|
||||||
|
* DATAES-448 - Release 3.0.8 (Kay SR8).
|
||||||
|
* DATAES-420 - Analyzer of main field ignored when using @MultiField annotation.
|
||||||
|
* DATAES-312 - NullHandling.NULLS_LAST not working in query.sort.
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 2.1.13.RELEASE (2018-06-13)
|
||||||
|
----------------------------------------------
|
||||||
|
* DATAES-447 - Release 2.1.13 (Ingalls SR13).
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 3.1.0.M3 (2018-05-17)
|
||||||
|
----------------------------------------
|
||||||
|
* DATAES-451 - Adapt to SpEL extension API changes in Spring Data Commons.
|
||||||
|
* DATAES-440 - Release 3.1 M3 (Lovelace).
|
||||||
|
* DATAES-422 - Add support for IndicesOptions in search queries.
|
||||||
|
* DATAES-420 - Analyzer of main field ignored when using @MultiField annotation.
|
||||||
|
* DATAES-412 - Highlighted fields is not getting passed to the elastic search query.
|
||||||
|
* DATAES-363 - AbstractElasticsearchRepository.existsById(..) always returns true.
|
||||||
|
* DATAES-312 - NullHandling.NULLS_LAST not working in query.sort.
|
||||||
|
* DATAES-198 - @Version has no effect, so therefore is not useful with spring data elasticsearch.
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 3.0.7.RELEASE (2018-05-08)
|
||||||
|
---------------------------------------------
|
||||||
|
* DATAES-438 - Expected a boolean [true/false] for property [index] but got [not_analyzed].
|
||||||
|
* DATAES-437 - Release 3.0.7 (Kay SR7).
|
||||||
|
* DATAES-412 - Highlighted fields is not getting passed to the elastic search query.
|
||||||
|
* DATAES-402 - Paging not working correctly.
|
||||||
|
* DATAES-363 - AbstractElasticsearchRepository.existsById(..) always returns true.
|
||||||
|
* DATAES-198 - @Version has no effect, so therefore is not useful with spring data elasticsearch.
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 2.1.12.RELEASE (2018-05-08)
|
||||||
|
----------------------------------------------
|
||||||
|
* DATAES-436 - Release 2.1.12 (Ingalls SR12).
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 3.1.0.M2 (2018-04-13)
|
||||||
|
----------------------------------------
|
||||||
|
* DATAES-439 - Adapt to API changes in Spring Data Commons.
|
||||||
|
* DATAES-434 - Remove explicit declaration of Jackson library versions.
|
||||||
|
* DATAES-432 - Export composable repositories via CDI.
|
||||||
|
* DATAES-427 - Release 3.1 M2 (Lovelace).
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 3.0.6.RELEASE (2018-04-04)
|
||||||
|
---------------------------------------------
|
||||||
|
* DATAES-434 - Remove explicit declaration of Jackson library versions.
|
||||||
|
* DATAES-430 - Release 3.0.6 (Kay SR6).
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 2.1.11.RELEASE (2018-04-04)
|
||||||
|
----------------------------------------------
|
||||||
|
* DATAES-434 - Remove explicit declaration of Jackson library versions.
|
||||||
|
* DATAES-424 - Fix line endings.
|
||||||
|
* DATAES-423 - Release 2.1.11 (Ingalls SR11).
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 3.0.5.RELEASE (2018-02-28)
|
||||||
|
---------------------------------------------
|
||||||
|
* DATAES-429 - Release 3.0.5 (Kay SR5).
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 3.0.4.RELEASE (2018-02-19)
|
||||||
|
---------------------------------------------
|
||||||
|
* DATAES-425 - Release 3.0.4 (Kay SR4).
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 3.1.0.M1 (2018-02-06)
|
||||||
|
----------------------------------------
|
||||||
|
* DATAES-424 - Fix line endings.
|
||||||
|
* DATAES-414 - Reduce scope of Lo4j dependencies to test.
|
||||||
|
* DATAES-410 - Adapt API changes in Property in test cases.
|
||||||
|
* DATAES-401 - Release 3.1 M1 (Lovelace).
|
||||||
|
* DATAES-361 - log4j2.xml in classpath root of the library prevents Spring Boot's logging auto-configuration to work.
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 3.0.3.RELEASE (2018-01-24)
|
||||||
|
---------------------------------------------
|
||||||
|
* DATAES-424 - Fix line endings.
|
||||||
|
* DATAES-417 - Release 3.0.3 (Kay SR3).
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 2.1.10.RELEASE (2018-01-24)
|
||||||
|
----------------------------------------------
|
||||||
|
* DATAES-416 - Release 2.1.10 (Ingalls SR10).
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 3.0.2.RELEASE (2017-11-27)
|
||||||
|
---------------------------------------------
|
||||||
|
* DATAES-414 - Reduce scope of Lo4j dependencies to test.
|
||||||
|
* DATAES-411 - Release 3.0.2 (Kay SR2).
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 2.1.9.RELEASE (2017-11-27)
|
||||||
|
---------------------------------------------
|
||||||
|
* DATAES-408 - Ensure Spring 5 compatibility in Ingalls.
|
||||||
|
* DATAES-404 - Release 2.1.9 (Ingalls SR9).
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 3.0.1.RELEASE (2017-10-27)
|
||||||
|
---------------------------------------------
|
||||||
|
* DATAES-410 - Adapt API changes in Property in test cases.
|
||||||
|
* DATAES-400 - Release 3.0.1 (Kay SR1).
|
||||||
|
* DATAES-361 - log4j2.xml in classpath root of the library prevents Spring Boot's logging auto-configuration to work.
|
||||||
|
|
||||||
|
|
||||||
|
Changes in version 2.1.8.RELEASE (2017-10-11)
|
||||||
|
---------------------------------------------
|
||||||
|
* DATAES-391 - Release 2.1.8 (Ingalls SR8).
|
||||||
|
|
||||||
|
|
||||||
Changes in version 3.0.0.RELEASE (2017-10-02)
|
Changes in version 3.0.0.RELEASE (2017-10-02)
|
||||||
---------------------------------------------
|
---------------------------------------------
|
||||||
* DATAES-397 - Add explicit automatic module name for Java 9.
|
* DATAES-397 - Add explicit automatic module name for Java 9.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Spring Data Elasticsearch 3.0 GA
|
Spring Data Elasticsearch 3.0.8
|
||||||
Copyright (c) [2013-2016] Pivotal Software, Inc.
|
Copyright (c) [2013-2016] Pivotal Software, Inc.
|
||||||
|
|
||||||
This product is licensed to you under the Apache License, Version 2.0 (the "License").
|
This product is licensed to you under the Apache License, Version 2.0 (the "License").
|
||||||
|
|||||||
@@ -1,73 +1,73 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014-2017 the original author or authors.
|
* Copyright 2014-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.data.elasticsearch;
|
package org.springframework.data.elasticsearch;
|
||||||
|
|
||||||
import static org.apache.commons.lang.RandomStringUtils.*;
|
import static org.apache.commons.lang.RandomStringUtils.*;
|
||||||
import static org.hamcrest.Matchers.*;
|
import static org.hamcrest.Matchers.*;
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
|
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
|
||||||
import org.springframework.data.elasticsearch.entities.Author;
|
import org.springframework.data.elasticsearch.entities.Author;
|
||||||
import org.springframework.data.elasticsearch.entities.Book;
|
import org.springframework.data.elasticsearch.entities.Book;
|
||||||
import org.springframework.data.elasticsearch.repositories.book.SampleElasticSearchBookRepository;
|
import org.springframework.data.elasticsearch.repositories.book.SampleElasticSearchBookRepository;
|
||||||
import org.springframework.test.context.ContextConfiguration;
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Christoph Strobl
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
@ContextConfiguration("classpath:/repository-test-nested-object-books.xml")
|
@ContextConfiguration("classpath:/repository-test-nested-object-books.xml")
|
||||||
public class InnerObjectTests {
|
public class InnerObjectTests {
|
||||||
|
|
||||||
@Autowired private SampleElasticSearchBookRepository bookRepository;
|
@Autowired private SampleElasticSearchBookRepository bookRepository;
|
||||||
|
|
||||||
@Autowired private ElasticsearchTemplate elasticsearchTemplate;
|
@Autowired private ElasticsearchTemplate elasticsearchTemplate;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void before() {
|
public void before() {
|
||||||
elasticsearchTemplate.deleteIndex(Book.class);
|
elasticsearchTemplate.deleteIndex(Book.class);
|
||||||
elasticsearchTemplate.createIndex(Book.class);
|
elasticsearchTemplate.createIndex(Book.class);
|
||||||
elasticsearchTemplate.putMapping(Book.class);
|
elasticsearchTemplate.putMapping(Book.class);
|
||||||
elasticsearchTemplate.refresh(Book.class);
|
elasticsearchTemplate.refresh(Book.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldIndexInnerObject() {
|
public void shouldIndexInnerObject() {
|
||||||
// given
|
// given
|
||||||
String id = randomAlphanumeric(5);
|
String id = randomAlphanumeric(5);
|
||||||
Book book = new Book();
|
Book book = new Book();
|
||||||
book.setId(id);
|
book.setId(id);
|
||||||
book.setName("xyz");
|
book.setName("xyz");
|
||||||
Author author = new Author();
|
Author author = new Author();
|
||||||
author.setId("1");
|
author.setId("1");
|
||||||
author.setName("ABC");
|
author.setName("ABC");
|
||||||
book.setAuthor(author);
|
book.setAuthor(author);
|
||||||
// when
|
// when
|
||||||
bookRepository.save(book);
|
bookRepository.save(book);
|
||||||
// then
|
// then
|
||||||
assertThat(bookRepository.findById(id), is(notNullValue()));
|
assertThat(bookRepository.findById(id), is(notNullValue()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,385 +1,385 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch;
|
package org.springframework.data.elasticsearch;
|
||||||
|
|
||||||
import static org.apache.commons.lang.RandomStringUtils.*;
|
import static org.apache.commons.lang.RandomStringUtils.*;
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.*;
|
import static org.elasticsearch.index.query.QueryBuilders.*;
|
||||||
import static org.hamcrest.CoreMatchers.is;
|
import static org.hamcrest.CoreMatchers.is;
|
||||||
import static org.hamcrest.Matchers.notNullValue;
|
import static org.hamcrest.Matchers.notNullValue;
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.lucene.search.join.ScoreMode;
|
import org.apache.lucene.search.join.ScoreMode;
|
||||||
import org.elasticsearch.index.query.BoolQueryBuilder;
|
import org.elasticsearch.index.query.BoolQueryBuilder;
|
||||||
import org.elasticsearch.index.query.QueryBuilder;
|
import org.elasticsearch.index.query.QueryBuilder;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
|
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
|
||||||
import org.springframework.data.elasticsearch.core.query.GetQuery;
|
import org.springframework.data.elasticsearch.core.query.GetQuery;
|
||||||
import org.springframework.data.elasticsearch.core.query.IndexQuery;
|
import org.springframework.data.elasticsearch.core.query.IndexQuery;
|
||||||
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
|
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
|
||||||
import org.springframework.data.elasticsearch.core.query.SearchQuery;
|
import org.springframework.data.elasticsearch.core.query.SearchQuery;
|
||||||
import org.springframework.data.elasticsearch.entities.Author;
|
import org.springframework.data.elasticsearch.entities.Author;
|
||||||
import org.springframework.data.elasticsearch.entities.Book;
|
import org.springframework.data.elasticsearch.entities.Book;
|
||||||
import org.springframework.data.elasticsearch.entities.Car;
|
import org.springframework.data.elasticsearch.entities.Car;
|
||||||
import org.springframework.data.elasticsearch.entities.GirlFriend;
|
import org.springframework.data.elasticsearch.entities.GirlFriend;
|
||||||
import org.springframework.data.elasticsearch.entities.Person;
|
import org.springframework.data.elasticsearch.entities.Person;
|
||||||
import org.springframework.data.elasticsearch.entities.PersonMultipleLevelNested;
|
import org.springframework.data.elasticsearch.entities.PersonMultipleLevelNested;
|
||||||
import org.springframework.test.context.ContextConfiguration;
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
*/
|
*/
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
@ContextConfiguration("classpath:/repository-test-nested-object.xml")
|
@ContextConfiguration("classpath:/repository-test-nested-object.xml")
|
||||||
public class NestedObjectTests {
|
public class NestedObjectTests {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ElasticsearchTemplate elasticsearchTemplate;
|
private ElasticsearchTemplate elasticsearchTemplate;
|
||||||
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void before() {
|
public void before() {
|
||||||
elasticsearchTemplate.deleteIndex(Book.class);
|
elasticsearchTemplate.deleteIndex(Book.class);
|
||||||
elasticsearchTemplate.createIndex(Book.class);
|
elasticsearchTemplate.createIndex(Book.class);
|
||||||
elasticsearchTemplate.putMapping(Book.class);
|
elasticsearchTemplate.putMapping(Book.class);
|
||||||
elasticsearchTemplate.refresh(Book.class);
|
elasticsearchTemplate.refresh(Book.class);
|
||||||
elasticsearchTemplate.deleteIndex(Person.class);
|
elasticsearchTemplate.deleteIndex(Person.class);
|
||||||
elasticsearchTemplate.createIndex(Person.class);
|
elasticsearchTemplate.createIndex(Person.class);
|
||||||
elasticsearchTemplate.putMapping(Person.class);
|
elasticsearchTemplate.putMapping(Person.class);
|
||||||
elasticsearchTemplate.refresh(Person.class);
|
elasticsearchTemplate.refresh(Person.class);
|
||||||
elasticsearchTemplate.deleteIndex(PersonMultipleLevelNested.class);
|
elasticsearchTemplate.deleteIndex(PersonMultipleLevelNested.class);
|
||||||
elasticsearchTemplate.createIndex(PersonMultipleLevelNested.class);
|
elasticsearchTemplate.createIndex(PersonMultipleLevelNested.class);
|
||||||
elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class);
|
elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class);
|
||||||
elasticsearchTemplate.refresh(PersonMultipleLevelNested.class);
|
elasticsearchTemplate.refresh(PersonMultipleLevelNested.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldIndexInitialLevelNestedObject() {
|
public void shouldIndexInitialLevelNestedObject() {
|
||||||
|
|
||||||
final List<Car> cars = new ArrayList<>();
|
final List<Car> cars = new ArrayList<>();
|
||||||
|
|
||||||
final Car saturn = new Car();
|
final Car saturn = new Car();
|
||||||
saturn.setName("Saturn");
|
saturn.setName("Saturn");
|
||||||
saturn.setModel("SL");
|
saturn.setModel("SL");
|
||||||
|
|
||||||
final Car subaru = new Car();
|
final Car subaru = new Car();
|
||||||
subaru.setName("Subaru");
|
subaru.setName("Subaru");
|
||||||
subaru.setModel("Imprezza");
|
subaru.setModel("Imprezza");
|
||||||
|
|
||||||
final Car ford = new Car();
|
final Car ford = new Car();
|
||||||
ford.setName("Ford");
|
ford.setName("Ford");
|
||||||
ford.setModel("Focus");
|
ford.setModel("Focus");
|
||||||
|
|
||||||
cars.add(saturn);
|
cars.add(saturn);
|
||||||
cars.add(subaru);
|
cars.add(subaru);
|
||||||
cars.add(ford);
|
cars.add(ford);
|
||||||
|
|
||||||
final Person foo = new Person();
|
final Person foo = new Person();
|
||||||
foo.setName("Foo");
|
foo.setName("Foo");
|
||||||
foo.setId("1");
|
foo.setId("1");
|
||||||
foo.setCar(cars);
|
foo.setCar(cars);
|
||||||
|
|
||||||
final Car car = new Car();
|
final Car car = new Car();
|
||||||
car.setName("Saturn");
|
car.setName("Saturn");
|
||||||
car.setModel("Imprezza");
|
car.setModel("Imprezza");
|
||||||
|
|
||||||
final Person bar = new Person();
|
final Person bar = new Person();
|
||||||
bar.setId("2");
|
bar.setId("2");
|
||||||
bar.setName("Bar");
|
bar.setName("Bar");
|
||||||
bar.setCar(Arrays.asList(car));
|
bar.setCar(Arrays.asList(car));
|
||||||
|
|
||||||
final List<IndexQuery> indexQueries = new ArrayList<>();
|
final List<IndexQuery> indexQueries = new ArrayList<>();
|
||||||
final IndexQuery indexQuery1 = new IndexQuery();
|
final IndexQuery indexQuery1 = new IndexQuery();
|
||||||
indexQuery1.setId(foo.getId());
|
indexQuery1.setId(foo.getId());
|
||||||
indexQuery1.setObject(foo);
|
indexQuery1.setObject(foo);
|
||||||
|
|
||||||
final IndexQuery indexQuery2 = new IndexQuery();
|
final IndexQuery indexQuery2 = new IndexQuery();
|
||||||
indexQuery2.setId(bar.getId());
|
indexQuery2.setId(bar.getId());
|
||||||
indexQuery2.setObject(bar);
|
indexQuery2.setObject(bar);
|
||||||
|
|
||||||
indexQueries.add(indexQuery1);
|
indexQueries.add(indexQuery1);
|
||||||
indexQueries.add(indexQuery2);
|
indexQueries.add(indexQuery2);
|
||||||
|
|
||||||
elasticsearchTemplate.putMapping(Person.class);
|
elasticsearchTemplate.putMapping(Person.class);
|
||||||
elasticsearchTemplate.bulkIndex(indexQueries);
|
elasticsearchTemplate.bulkIndex(indexQueries);
|
||||||
elasticsearchTemplate.refresh(Person.class);
|
elasticsearchTemplate.refresh(Person.class);
|
||||||
|
|
||||||
final QueryBuilder builder = nestedQuery("car", boolQuery().must(termQuery("car.name", "saturn")).must(termQuery("car.model", "imprezza")), ScoreMode.None);
|
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 SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build();
|
||||||
final List<Person> persons = elasticsearchTemplate.queryForList(searchQuery, Person.class);
|
final List<Person> persons = elasticsearchTemplate.queryForList(searchQuery, Person.class);
|
||||||
|
|
||||||
assertThat(persons.size(), is(1));
|
assertThat(persons.size(), is(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldIndexMultipleLevelNestedObject() {
|
public void shouldIndexMultipleLevelNestedObject() {
|
||||||
//given
|
//given
|
||||||
final List<IndexQuery> indexQueries = createPerson();
|
final List<IndexQuery> indexQueries = createPerson();
|
||||||
|
|
||||||
//when
|
//when
|
||||||
elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class);
|
elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class);
|
||||||
elasticsearchTemplate.bulkIndex(indexQueries);
|
elasticsearchTemplate.bulkIndex(indexQueries);
|
||||||
elasticsearchTemplate.refresh(PersonMultipleLevelNested.class);
|
elasticsearchTemplate.refresh(PersonMultipleLevelNested.class);
|
||||||
|
|
||||||
//then
|
//then
|
||||||
final GetQuery getQuery = new GetQuery();
|
final GetQuery getQuery = new GetQuery();
|
||||||
getQuery.setId("1");
|
getQuery.setId("1");
|
||||||
final PersonMultipleLevelNested personIndexed = elasticsearchTemplate.queryForObject(getQuery, PersonMultipleLevelNested.class);
|
final PersonMultipleLevelNested personIndexed = elasticsearchTemplate.queryForObject(getQuery, PersonMultipleLevelNested.class);
|
||||||
assertThat(personIndexed, is(notNullValue()));
|
assertThat(personIndexed, is(notNullValue()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldIndexMultipleLevelNestedObjectWithIncludeInParent() {
|
public void shouldIndexMultipleLevelNestedObjectWithIncludeInParent() {
|
||||||
//given
|
//given
|
||||||
final List<IndexQuery> indexQueries = createPerson();
|
final List<IndexQuery> indexQueries = createPerson();
|
||||||
|
|
||||||
//when
|
//when
|
||||||
elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class);
|
elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class);
|
||||||
elasticsearchTemplate.bulkIndex(indexQueries);
|
elasticsearchTemplate.bulkIndex(indexQueries);
|
||||||
// then
|
// then
|
||||||
|
|
||||||
final Map mapping = elasticsearchTemplate.getMapping(PersonMultipleLevelNested.class);
|
final Map mapping = elasticsearchTemplate.getMapping(PersonMultipleLevelNested.class);
|
||||||
|
|
||||||
assertThat(mapping, is(notNullValue()));
|
assertThat(mapping, is(notNullValue()));
|
||||||
final Map propertyMap = (Map) mapping.get("properties");
|
final Map propertyMap = (Map) mapping.get("properties");
|
||||||
assertThat(propertyMap, is(notNullValue()));
|
assertThat(propertyMap, is(notNullValue()));
|
||||||
final Map bestCarsAttributes = (Map) propertyMap.get("bestCars");
|
final Map bestCarsAttributes = (Map) propertyMap.get("bestCars");
|
||||||
assertThat(bestCarsAttributes.get("include_in_parent"), is(notNullValue()));
|
assertThat(bestCarsAttributes.get("include_in_parent"), is(notNullValue()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldSearchUsingNestedQueryOnMultipleLevelNestedObject() {
|
public void shouldSearchUsingNestedQueryOnMultipleLevelNestedObject() {
|
||||||
//given
|
//given
|
||||||
final List<IndexQuery> indexQueries = createPerson();
|
final List<IndexQuery> indexQueries = createPerson();
|
||||||
|
|
||||||
//when
|
//when
|
||||||
elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class);
|
elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class);
|
||||||
elasticsearchTemplate.bulkIndex(indexQueries);
|
elasticsearchTemplate.bulkIndex(indexQueries);
|
||||||
elasticsearchTemplate.refresh(PersonMultipleLevelNested.class);
|
elasticsearchTemplate.refresh(PersonMultipleLevelNested.class);
|
||||||
|
|
||||||
//then
|
//then
|
||||||
final BoolQueryBuilder builder = boolQuery();
|
final BoolQueryBuilder builder = boolQuery();
|
||||||
builder.must(nestedQuery("girlFriends", termQuery("girlFriends.type", "temp"),ScoreMode.None))
|
builder.must(nestedQuery("girlFriends", termQuery("girlFriends.type", "temp"),ScoreMode.None))
|
||||||
.must(nestedQuery("girlFriends.cars", termQuery("girlFriends.cars.name", "Ford".toLowerCase()),ScoreMode.None));
|
.must(nestedQuery("girlFriends.cars", termQuery("girlFriends.cars.name", "Ford".toLowerCase()),ScoreMode.None));
|
||||||
|
|
||||||
final SearchQuery searchQuery = new NativeSearchQueryBuilder()
|
final SearchQuery searchQuery = new NativeSearchQueryBuilder()
|
||||||
.withQuery(builder)
|
.withQuery(builder)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
final Page<PersonMultipleLevelNested> personIndexed = elasticsearchTemplate.queryForPage(searchQuery, PersonMultipleLevelNested.class);
|
final Page<PersonMultipleLevelNested> personIndexed = elasticsearchTemplate.queryForPage(searchQuery, PersonMultipleLevelNested.class);
|
||||||
assertThat(personIndexed, is(notNullValue()));
|
assertThat(personIndexed, is(notNullValue()));
|
||||||
assertThat(personIndexed.getTotalElements(), is(1L));
|
assertThat(personIndexed.getTotalElements(), is(1L));
|
||||||
assertThat(personIndexed.getContent().get(0).getId(), is("1"));
|
assertThat(personIndexed.getContent().get(0).getId(), is("1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private List<IndexQuery> createPerson() {
|
private List<IndexQuery> createPerson() {
|
||||||
|
|
||||||
final PersonMultipleLevelNested person1 = new PersonMultipleLevelNested();
|
final PersonMultipleLevelNested person1 = new PersonMultipleLevelNested();
|
||||||
|
|
||||||
person1.setId("1");
|
person1.setId("1");
|
||||||
person1.setName("name");
|
person1.setName("name");
|
||||||
|
|
||||||
final Car saturn = new Car();
|
final Car saturn = new Car();
|
||||||
saturn.setName("Saturn");
|
saturn.setName("Saturn");
|
||||||
saturn.setModel("SL");
|
saturn.setModel("SL");
|
||||||
|
|
||||||
final Car subaru = new Car();
|
final Car subaru = new Car();
|
||||||
subaru.setName("Subaru");
|
subaru.setName("Subaru");
|
||||||
subaru.setModel("Imprezza");
|
subaru.setModel("Imprezza");
|
||||||
|
|
||||||
final Car car = new Car();
|
final Car car = new Car();
|
||||||
car.setName("Saturn");
|
car.setName("Saturn");
|
||||||
car.setModel("Imprezza");
|
car.setModel("Imprezza");
|
||||||
|
|
||||||
final Car ford = new Car();
|
final Car ford = new Car();
|
||||||
ford.setName("Ford");
|
ford.setName("Ford");
|
||||||
ford.setModel("Focus");
|
ford.setModel("Focus");
|
||||||
|
|
||||||
final GirlFriend permanent = new GirlFriend();
|
final GirlFriend permanent = new GirlFriend();
|
||||||
permanent.setName("permanent");
|
permanent.setName("permanent");
|
||||||
permanent.setType("permanent");
|
permanent.setType("permanent");
|
||||||
permanent.setCars(Arrays.asList(saturn, subaru));
|
permanent.setCars(Arrays.asList(saturn, subaru));
|
||||||
|
|
||||||
final GirlFriend temp = new GirlFriend();
|
final GirlFriend temp = new GirlFriend();
|
||||||
temp.setName("temp");
|
temp.setName("temp");
|
||||||
temp.setType("temp");
|
temp.setType("temp");
|
||||||
temp.setCars(Arrays.asList(car, ford));
|
temp.setCars(Arrays.asList(car, ford));
|
||||||
|
|
||||||
person1.setGirlFriends(Arrays.asList(permanent, temp));
|
person1.setGirlFriends(Arrays.asList(permanent, temp));
|
||||||
|
|
||||||
final IndexQuery indexQuery1 = new IndexQuery();
|
final IndexQuery indexQuery1 = new IndexQuery();
|
||||||
indexQuery1.setId(person1.getId());
|
indexQuery1.setId(person1.getId());
|
||||||
indexQuery1.setObject(person1);
|
indexQuery1.setObject(person1);
|
||||||
|
|
||||||
final PersonMultipleLevelNested person2 = new PersonMultipleLevelNested();
|
final PersonMultipleLevelNested person2 = new PersonMultipleLevelNested();
|
||||||
|
|
||||||
person2.setId("2");
|
person2.setId("2");
|
||||||
person2.setName("name");
|
person2.setName("name");
|
||||||
|
|
||||||
person2.setGirlFriends(Arrays.asList(permanent));
|
person2.setGirlFriends(Arrays.asList(permanent));
|
||||||
|
|
||||||
final IndexQuery indexQuery2 = new IndexQuery();
|
final IndexQuery indexQuery2 = new IndexQuery();
|
||||||
indexQuery2.setId(person2.getId());
|
indexQuery2.setId(person2.getId());
|
||||||
indexQuery2.setObject(person2);
|
indexQuery2.setObject(person2);
|
||||||
|
|
||||||
final List<IndexQuery> indexQueries = new ArrayList<>();
|
final List<IndexQuery> indexQueries = new ArrayList<>();
|
||||||
indexQueries.add(indexQuery1);
|
indexQueries.add(indexQuery1);
|
||||||
indexQueries.add(indexQuery2);
|
indexQueries.add(indexQuery2);
|
||||||
|
|
||||||
return indexQueries;
|
return indexQueries;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldSearchBooksForPersonInitialLevelNestedType() {
|
public void shouldSearchBooksForPersonInitialLevelNestedType() {
|
||||||
|
|
||||||
final List<Car> cars = new ArrayList<>();
|
final List<Car> cars = new ArrayList<>();
|
||||||
|
|
||||||
final Car saturn = new Car();
|
final Car saturn = new Car();
|
||||||
saturn.setName("Saturn");
|
saturn.setName("Saturn");
|
||||||
saturn.setModel("SL");
|
saturn.setModel("SL");
|
||||||
|
|
||||||
final Car subaru = new Car();
|
final Car subaru = new Car();
|
||||||
subaru.setName("Subaru");
|
subaru.setName("Subaru");
|
||||||
subaru.setModel("Imprezza");
|
subaru.setModel("Imprezza");
|
||||||
|
|
||||||
final Car ford = new Car();
|
final Car ford = new Car();
|
||||||
ford.setName("Ford");
|
ford.setName("Ford");
|
||||||
ford.setModel("Focus");
|
ford.setModel("Focus");
|
||||||
|
|
||||||
cars.add(saturn);
|
cars.add(saturn);
|
||||||
cars.add(subaru);
|
cars.add(subaru);
|
||||||
cars.add(ford);
|
cars.add(ford);
|
||||||
|
|
||||||
final Book java = new Book();
|
final Book java = new Book();
|
||||||
java.setId("1");
|
java.setId("1");
|
||||||
java.setName("java");
|
java.setName("java");
|
||||||
final Author javaAuthor = new Author();
|
final Author javaAuthor = new Author();
|
||||||
javaAuthor.setId("1");
|
javaAuthor.setId("1");
|
||||||
javaAuthor.setName("javaAuthor");
|
javaAuthor.setName("javaAuthor");
|
||||||
java.setAuthor(javaAuthor);
|
java.setAuthor(javaAuthor);
|
||||||
|
|
||||||
final Book spring = new Book();
|
final Book spring = new Book();
|
||||||
spring.setId("2");
|
spring.setId("2");
|
||||||
spring.setName("spring");
|
spring.setName("spring");
|
||||||
final Author springAuthor = new Author();
|
final Author springAuthor = new Author();
|
||||||
springAuthor.setId("2");
|
springAuthor.setId("2");
|
||||||
springAuthor.setName("springAuthor");
|
springAuthor.setName("springAuthor");
|
||||||
spring.setAuthor(springAuthor);
|
spring.setAuthor(springAuthor);
|
||||||
|
|
||||||
final Person foo = new Person();
|
final Person foo = new Person();
|
||||||
foo.setName("Foo");
|
foo.setName("Foo");
|
||||||
foo.setId("1");
|
foo.setId("1");
|
||||||
foo.setCar(cars);
|
foo.setCar(cars);
|
||||||
foo.setBooks(Arrays.asList(java, spring));
|
foo.setBooks(Arrays.asList(java, spring));
|
||||||
|
|
||||||
final Car car = new Car();
|
final Car car = new Car();
|
||||||
car.setName("Saturn");
|
car.setName("Saturn");
|
||||||
car.setModel("Imprezza");
|
car.setModel("Imprezza");
|
||||||
|
|
||||||
final Person bar = new Person();
|
final Person bar = new Person();
|
||||||
bar.setId("2");
|
bar.setId("2");
|
||||||
bar.setName("Bar");
|
bar.setName("Bar");
|
||||||
bar.setCar(Arrays.asList(car));
|
bar.setCar(Arrays.asList(car));
|
||||||
|
|
||||||
final List<IndexQuery> indexQueries = new ArrayList<>();
|
final List<IndexQuery> indexQueries = new ArrayList<>();
|
||||||
final IndexQuery indexQuery1 = new IndexQuery();
|
final IndexQuery indexQuery1 = new IndexQuery();
|
||||||
indexQuery1.setId(foo.getId());
|
indexQuery1.setId(foo.getId());
|
||||||
indexQuery1.setObject(foo);
|
indexQuery1.setObject(foo);
|
||||||
|
|
||||||
final IndexQuery indexQuery2 = new IndexQuery();
|
final IndexQuery indexQuery2 = new IndexQuery();
|
||||||
indexQuery2.setId(bar.getId());
|
indexQuery2.setId(bar.getId());
|
||||||
indexQuery2.setObject(bar);
|
indexQuery2.setObject(bar);
|
||||||
|
|
||||||
indexQueries.add(indexQuery1);
|
indexQueries.add(indexQuery1);
|
||||||
indexQueries.add(indexQuery2);
|
indexQueries.add(indexQuery2);
|
||||||
|
|
||||||
elasticsearchTemplate.putMapping(Person.class);
|
elasticsearchTemplate.putMapping(Person.class);
|
||||||
elasticsearchTemplate.bulkIndex(indexQueries);
|
elasticsearchTemplate.bulkIndex(indexQueries);
|
||||||
elasticsearchTemplate.refresh(Person.class);
|
elasticsearchTemplate.refresh(Person.class);
|
||||||
|
|
||||||
final QueryBuilder builder = nestedQuery("books", boolQuery().must(termQuery("books.name", "java")), ScoreMode.None);
|
final QueryBuilder builder = nestedQuery("books", boolQuery().must(termQuery("books.name", "java")), ScoreMode.None);
|
||||||
|
|
||||||
final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build();
|
final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build();
|
||||||
final List<Person> persons = elasticsearchTemplate.queryForList(searchQuery, Person.class);
|
final List<Person> persons = elasticsearchTemplate.queryForList(searchQuery, Person.class);
|
||||||
|
|
||||||
assertThat(persons.size(), is(1));
|
assertThat(persons.size(), is(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
DATAES-73
|
DATAES-73
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void shouldIndexAndSearchMapAsNestedType() {
|
public void shouldIndexAndSearchMapAsNestedType() {
|
||||||
//given
|
//given
|
||||||
final Book book1 = new Book();
|
final Book book1 = new Book();
|
||||||
final Book book2 = new Book();
|
final Book book2 = new Book();
|
||||||
|
|
||||||
book1.setId(randomNumeric(5));
|
book1.setId(randomNumeric(5));
|
||||||
book1.setName("testBook1");
|
book1.setName("testBook1");
|
||||||
|
|
||||||
book2.setId(randomNumeric(5));
|
book2.setId(randomNumeric(5));
|
||||||
book2.setName("testBook2");
|
book2.setName("testBook2");
|
||||||
|
|
||||||
final Map<Integer, Collection<String>> map1 = new HashMap<>();
|
final Map<Integer, Collection<String>> map1 = new HashMap<>();
|
||||||
map1.put(1, Arrays.asList("test1", "test2"));
|
map1.put(1, Arrays.asList("test1", "test2"));
|
||||||
|
|
||||||
final Map<Integer, Collection<String>> map2 = new HashMap<>();
|
final Map<Integer, Collection<String>> map2 = new HashMap<>();
|
||||||
map2.put(1, Arrays.asList("test3", "test4"));
|
map2.put(1, Arrays.asList("test3", "test4"));
|
||||||
|
|
||||||
book1.setBuckets(map1);
|
book1.setBuckets(map1);
|
||||||
book2.setBuckets(map2);
|
book2.setBuckets(map2);
|
||||||
|
|
||||||
final List<IndexQuery> indexQueries = new ArrayList<>();
|
final List<IndexQuery> indexQueries = new ArrayList<>();
|
||||||
final IndexQuery indexQuery1 = new IndexQuery();
|
final IndexQuery indexQuery1 = new IndexQuery();
|
||||||
indexQuery1.setId(book1.getId());
|
indexQuery1.setId(book1.getId());
|
||||||
indexQuery1.setObject(book1);
|
indexQuery1.setObject(book1);
|
||||||
|
|
||||||
final IndexQuery indexQuery2 = new IndexQuery();
|
final IndexQuery indexQuery2 = new IndexQuery();
|
||||||
indexQuery2.setId(book2.getId());
|
indexQuery2.setId(book2.getId());
|
||||||
indexQuery2.setObject(book2);
|
indexQuery2.setObject(book2);
|
||||||
|
|
||||||
indexQueries.add(indexQuery1);
|
indexQueries.add(indexQuery1);
|
||||||
indexQueries.add(indexQuery2);
|
indexQueries.add(indexQuery2);
|
||||||
//when
|
//when
|
||||||
elasticsearchTemplate.bulkIndex(indexQueries);
|
elasticsearchTemplate.bulkIndex(indexQueries);
|
||||||
elasticsearchTemplate.refresh(Book.class);
|
elasticsearchTemplate.refresh(Book.class);
|
||||||
//then
|
//then
|
||||||
final SearchQuery searchQuery = new NativeSearchQueryBuilder()
|
final SearchQuery searchQuery = new NativeSearchQueryBuilder()
|
||||||
.withQuery(nestedQuery("buckets", termQuery("buckets.1", "test3"),ScoreMode.None))
|
.withQuery(nestedQuery("buckets", termQuery("buckets.1", "test3"),ScoreMode.None))
|
||||||
.build();
|
.build();
|
||||||
final Page<Book> books = elasticsearchTemplate.queryForPage(searchQuery, Book.class);
|
final Page<Book> books = elasticsearchTemplate.queryForPage(searchQuery, Book.class);
|
||||||
|
|
||||||
assertThat(books.getContent().size(), is(1));
|
assertThat(books.getContent().size(), is(1));
|
||||||
assertThat(books.getContent().get(0).getId(), is(book2.getId()));
|
assertThat(books.getContent().get(0).getId(), is(book2.getId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,35 +1,35 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch;
|
package org.springframework.data.elasticsearch;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.springframework.beans.factory.BeanCreationException;
|
import org.springframework.beans.factory.BeanCreationException;
|
||||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||||
import org.springframework.data.elasticsearch.repositories.nondocument.NonDocumentEntityRepository;
|
import org.springframework.data.elasticsearch.repositories.nondocument.NonDocumentEntityRepository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public class NonDocumentEntityTests {
|
public class NonDocumentEntityTests {
|
||||||
|
|
||||||
@Test(expected = BeanCreationException.class)
|
@Test(expected = BeanCreationException.class)
|
||||||
public void shouldNotInitialiseRepositoryWithNonDocument() {
|
public void shouldNotInitialiseRepositoryWithNonDocument() {
|
||||||
// when
|
// when
|
||||||
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/repository-non-document-entity.xml");
|
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/repository-non-document-entity.xml");
|
||||||
ctx.getBean(NonDocumentEntityRepository.class);
|
ctx.getBean(NonDocumentEntityRepository.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+55
-55
@@ -1,55 +1,55 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.config;
|
package org.springframework.data.elasticsearch.config;
|
||||||
|
|
||||||
import static org.hamcrest.CoreMatchers.*;
|
import static org.hamcrest.CoreMatchers.*;
|
||||||
import static org.hamcrest.core.Is.is;
|
import static org.hamcrest.core.Is.is;
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.data.elasticsearch.client.TransportClientFactoryBean;
|
import org.springframework.data.elasticsearch.client.TransportClientFactoryBean;
|
||||||
import org.springframework.data.elasticsearch.repositories.sample.SampleElasticsearchRepository;
|
import org.springframework.data.elasticsearch.repositories.sample.SampleElasticsearchRepository;
|
||||||
import org.springframework.test.context.ContextConfiguration;
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
@ContextConfiguration("namespace.xml")
|
@ContextConfiguration("namespace.xml")
|
||||||
public class ElasticsearchNamespaceHandlerTests {
|
public class ElasticsearchNamespaceHandlerTests {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ApplicationContext context;
|
private ApplicationContext context;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldCreateTransportClient() {
|
public void shouldCreateTransportClient() {
|
||||||
assertThat(context.getBean(TransportClientFactoryBean.class), is(notNullValue()));
|
assertThat(context.getBean(TransportClientFactoryBean.class), is(notNullValue()));
|
||||||
assertThat(context.getBean(TransportClientFactoryBean.class), is(instanceOf(TransportClientFactoryBean.class)));
|
assertThat(context.getBean(TransportClientFactoryBean.class), is(instanceOf(TransportClientFactoryBean.class)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldCreateRepository() {
|
public void shouldCreateRepository() {
|
||||||
assertThat(context.getBean(TransportClientFactoryBean.class), is(notNullValue()));
|
assertThat(context.getBean(TransportClientFactoryBean.class), is(notNullValue()));
|
||||||
assertThat(context.getBean(SampleElasticsearchRepository.class),
|
assertThat(context.getBean(SampleElasticsearchRepository.class),
|
||||||
is(instanceOf(SampleElasticsearchRepository.class)));
|
is(instanceOf(SampleElasticsearchRepository.class)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+68
-2
@@ -16,14 +16,15 @@
|
|||||||
package org.springframework.data.elasticsearch.core;
|
package org.springframework.data.elasticsearch.core;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.LinkedList;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import com.fasterxml.jackson.databind.util.ArrayIterator;
|
import com.fasterxml.jackson.databind.util.ArrayIterator;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import org.elasticsearch.action.get.GetResponse;
|
import org.elasticsearch.action.get.GetResponse;
|
||||||
|
import org.elasticsearch.action.get.MultiGetItemResponse;
|
||||||
|
import org.elasticsearch.action.get.MultiGetResponse;
|
||||||
import org.elasticsearch.action.search.SearchResponse;
|
import org.elasticsearch.action.search.SearchResponse;
|
||||||
import org.elasticsearch.search.SearchHit;
|
import org.elasticsearch.search.SearchHit;
|
||||||
import org.elasticsearch.search.SearchHitField;
|
import org.elasticsearch.search.SearchHitField;
|
||||||
@@ -41,6 +42,7 @@ import org.springframework.data.elasticsearch.annotations.Document;
|
|||||||
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
|
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
|
||||||
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
|
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
|
||||||
import org.springframework.data.elasticsearch.entities.Car;
|
import org.springframework.data.elasticsearch.entities.Car;
|
||||||
|
import org.springframework.data.elasticsearch.entities.SampleEntity;
|
||||||
|
|
||||||
import static java.util.Arrays.asList;
|
import static java.util.Arrays.asList;
|
||||||
import static org.hamcrest.Matchers.*;
|
import static org.hamcrest.Matchers.*;
|
||||||
@@ -50,6 +52,7 @@ import static org.mockito.Mockito.*;
|
|||||||
/**
|
/**
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
|
* @author Chris White
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public class DefaultResultMapperTests {
|
public class DefaultResultMapperTests {
|
||||||
@@ -153,6 +156,69 @@ public class DefaultResultMapperTests {
|
|||||||
assertThat(result.getId(), is("identifier"));
|
assertThat(result.getId(), is("identifier"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test // DATAES-198
|
||||||
|
public void setsVersionFromGetResponse() {
|
||||||
|
GetResponse response = mock(GetResponse.class);
|
||||||
|
when(response.getSourceAsString()).thenReturn("{}");
|
||||||
|
when(response.getVersion()).thenReturn(1234L);
|
||||||
|
|
||||||
|
SampleEntity result = resultMapper.mapResult(response, SampleEntity.class);
|
||||||
|
|
||||||
|
assertThat(result, is(notNullValue()));
|
||||||
|
assertThat(result.getVersion(), is(1234L));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test // DATAES-198
|
||||||
|
public void setsVersionFromMultiGetResponse() {
|
||||||
|
GetResponse response1 = mock(GetResponse.class);
|
||||||
|
when(response1.getSourceAsString()).thenReturn("{}");
|
||||||
|
when(response1.isExists()).thenReturn(true);
|
||||||
|
when(response1.getVersion()).thenReturn(1234L);
|
||||||
|
|
||||||
|
GetResponse response2 = mock(GetResponse.class);
|
||||||
|
when(response2.getSourceAsString()).thenReturn("{}");
|
||||||
|
when(response2.isExists()).thenReturn(true);
|
||||||
|
when(response2.getVersion()).thenReturn(5678L);
|
||||||
|
|
||||||
|
MultiGetResponse multiResponse = mock(MultiGetResponse.class);
|
||||||
|
when(multiResponse.getResponses()).thenReturn(new MultiGetItemResponse[] {
|
||||||
|
new MultiGetItemResponse(response1, null), new MultiGetItemResponse(response2, null) });
|
||||||
|
|
||||||
|
LinkedList<SampleEntity> results = resultMapper.mapResults(multiResponse, SampleEntity.class);
|
||||||
|
|
||||||
|
assertThat(results, is(notNullValue()));
|
||||||
|
assertThat(results, hasSize(2));
|
||||||
|
|
||||||
|
assertThat(results.get(0).getVersion(), is(1234L));
|
||||||
|
assertThat(results.get(1).getVersion(), is(5678L));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test // DATAES-198
|
||||||
|
public void setsVersionFromSearchResponse() {
|
||||||
|
SearchHit hit1 = mock(SearchHit.class);
|
||||||
|
when(hit1.getSourceAsString()).thenReturn("{}");
|
||||||
|
when(hit1.getVersion()).thenReturn(1234L);
|
||||||
|
|
||||||
|
SearchHit hit2 = mock(SearchHit.class);
|
||||||
|
when(hit2.getSourceAsString()).thenReturn("{}");
|
||||||
|
when(hit2.getVersion()).thenReturn(5678L);
|
||||||
|
|
||||||
|
SearchHits searchHits = mock(SearchHits.class);
|
||||||
|
when(searchHits.getTotalHits()).thenReturn(2L);
|
||||||
|
when(searchHits.iterator()).thenReturn(Arrays.asList(hit1, hit2).iterator());
|
||||||
|
|
||||||
|
SearchResponse searchResponse = mock(SearchResponse.class);
|
||||||
|
when(searchResponse.getHits()).thenReturn(searchHits);
|
||||||
|
|
||||||
|
AggregatedPage<SampleEntity> results = resultMapper.mapResults(searchResponse, SampleEntity.class,
|
||||||
|
mock(Pageable.class));
|
||||||
|
|
||||||
|
assertThat(results, is(notNullValue()));
|
||||||
|
|
||||||
|
assertThat(results.getContent().get(0).getVersion(), is(1234L));
|
||||||
|
assertThat(results.getContent().get(1).getVersion(), is(5678L));
|
||||||
|
}
|
||||||
|
|
||||||
private Aggregation createCarAggregation() {
|
private Aggregation createCarAggregation() {
|
||||||
Aggregation aggregation = mock(Terms.class);
|
Aggregation aggregation = mock(Terms.class);
|
||||||
when(aggregation.getName()).thenReturn("Diesel");
|
when(aggregation.getName()).thenReturn("Diesel");
|
||||||
|
|||||||
+2173
-2014
File diff suppressed because it is too large
Load Diff
@@ -25,6 +25,7 @@ import java.io.IOException;
|
|||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -43,6 +44,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
|||||||
* @author Jakub Vavrik
|
* @author Jakub Vavrik
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Keivn Leturc
|
* @author Keivn Leturc
|
||||||
|
* @author Nordine Bittich
|
||||||
*/
|
*/
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
@ContextConfiguration("classpath:elasticsearch-template-test.xml")
|
@ContextConfiguration("classpath:elasticsearch-template-test.xml")
|
||||||
@@ -189,8 +191,28 @@ public class MappingBuilderTests {
|
|||||||
elasticsearchTemplate.createIndex(Book.class);
|
elasticsearchTemplate.createIndex(Book.class);
|
||||||
elasticsearchTemplate.putMapping(Book.class);
|
elasticsearchTemplate.putMapping(Book.class);
|
||||||
//when
|
//when
|
||||||
|
|
||||||
//then
|
//then
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test // DATAES-420
|
||||||
|
public void shouldUseBothAnalyzer() {
|
||||||
|
//given
|
||||||
|
elasticsearchTemplate.deleteIndex(Book.class);
|
||||||
|
elasticsearchTemplate.createIndex(Book.class);
|
||||||
|
elasticsearchTemplate.putMapping(Book.class);
|
||||||
|
|
||||||
|
//when
|
||||||
|
Map mapping = elasticsearchTemplate.getMapping(Book.class);
|
||||||
|
Map descriptionMapping = (Map) ((Map) mapping.get("properties")).get("description");
|
||||||
|
Map prefixDescription = (Map) ((Map) descriptionMapping.get("fields")).get("prefix");
|
||||||
|
|
||||||
|
//then
|
||||||
|
assertThat(prefixDescription.size(), is(3));
|
||||||
|
assertThat(prefixDescription.get("type"), equalTo("text"));
|
||||||
|
assertThat(prefixDescription.get("analyzer"), equalTo("stop"));
|
||||||
|
assertThat(prefixDescription.get("search_analyzer"), equalTo("standard"));
|
||||||
|
assertThat(descriptionMapping.get("type"), equalTo("text"));
|
||||||
|
assertThat(descriptionMapping.get("analyzer"), equalTo("whitespace"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* 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.aggregation;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.PageRequest;
|
||||||
|
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Remco Zigterman
|
||||||
|
*/
|
||||||
|
public class AggregatedPageImplTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void constructFacetedPageWithPageable() {
|
||||||
|
Page<String> page = new AggregatedPageImpl<>(Arrays.asList("Test", "Test 2"), PageRequest.of(0, 2), 10);
|
||||||
|
|
||||||
|
assertEquals(10, page.getTotalElements());
|
||||||
|
assertEquals(2, page.getNumberOfElements());
|
||||||
|
assertEquals(2, page.getSize());
|
||||||
|
assertEquals(5, page.getTotalPages());
|
||||||
|
}
|
||||||
|
}
|
||||||
+73
-73
@@ -1,73 +1,73 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.convert;
|
package org.springframework.data.elasticsearch.core.convert;
|
||||||
|
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.joda.time.DateTimeZone;
|
import org.joda.time.DateTimeZone;
|
||||||
import org.joda.time.LocalDateTime;
|
import org.joda.time.LocalDateTime;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public class DateTimeConvertersTests {
|
public class DateTimeConvertersTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testJodaDateTimeConverterWithNullValue() {
|
public void testJodaDateTimeConverterWithNullValue() {
|
||||||
Assert.assertNull(DateTimeConverters.JodaDateTimeConverter.INSTANCE.convert(null));
|
Assert.assertNull(DateTimeConverters.JodaDateTimeConverter.INSTANCE.convert(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testJodaDateTimeConverter() {
|
public void testJodaDateTimeConverter() {
|
||||||
DateTime dateTime = new DateTime(2013, 1, 24, 6, 35, 0, DateTimeZone.UTC);
|
DateTime dateTime = new DateTime(2013, 1, 24, 6, 35, 0, DateTimeZone.UTC);
|
||||||
Assert
|
Assert
|
||||||
.assertEquals("2013-01-24T06:35:00.000Z", DateTimeConverters.JodaDateTimeConverter.INSTANCE.convert(dateTime));
|
.assertEquals("2013-01-24T06:35:00.000Z", DateTimeConverters.JodaDateTimeConverter.INSTANCE.convert(dateTime));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testJodaLocalDateTimeConverterWithNullValue() {
|
public void testJodaLocalDateTimeConverterWithNullValue() {
|
||||||
Assert.assertNull(DateTimeConverters.JodaLocalDateTimeConverter.INSTANCE.convert(null));
|
Assert.assertNull(DateTimeConverters.JodaLocalDateTimeConverter.INSTANCE.convert(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testJodaLocalDateTimeConverter() {
|
public void testJodaLocalDateTimeConverter() {
|
||||||
LocalDateTime dateTime = new LocalDateTime(new DateTime(2013, 1, 24, 6, 35, 0, DateTimeZone.UTC).getMillis(),
|
LocalDateTime dateTime = new LocalDateTime(new DateTime(2013, 1, 24, 6, 35, 0, DateTimeZone.UTC).getMillis(),
|
||||||
DateTimeZone.UTC);
|
DateTimeZone.UTC);
|
||||||
Assert.assertEquals("2013-01-24T06:35:00.000Z",
|
Assert.assertEquals("2013-01-24T06:35:00.000Z",
|
||||||
DateTimeConverters.JodaLocalDateTimeConverter.INSTANCE.convert(dateTime));
|
DateTimeConverters.JodaLocalDateTimeConverter.INSTANCE.convert(dateTime));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testJavaDateConverterWithNullValue() {
|
public void testJavaDateConverterWithNullValue() {
|
||||||
Assert.assertNull(DateTimeConverters.JavaDateConverter.INSTANCE.convert(null));
|
Assert.assertNull(DateTimeConverters.JavaDateConverter.INSTANCE.convert(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testJavaDateConverter() {
|
public void testJavaDateConverter() {
|
||||||
DateTime dateTime = new DateTime(2013, 1, 24, 6, 35, 0, DateTimeZone.UTC);
|
DateTime dateTime = new DateTime(2013, 1, 24, 6, 35, 0, DateTimeZone.UTC);
|
||||||
Calendar calendar = Calendar.getInstance();
|
Calendar calendar = Calendar.getInstance();
|
||||||
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
|
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||||
calendar.setTimeInMillis(dateTime.getMillis());
|
calendar.setTimeInMillis(dateTime.getMillis());
|
||||||
|
|
||||||
Assert.assertEquals("2013-01-24T06:35:00.000Z",
|
Assert.assertEquals("2013-01-24T06:35:00.000Z",
|
||||||
DateTimeConverters.JavaDateConverter.INSTANCE.convert(calendar.getTime()));
|
DateTimeConverters.JavaDateConverter.INSTANCE.convert(calendar.getTime()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+57
-57
@@ -1,57 +1,57 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.convert;
|
package org.springframework.data.elasticsearch.core.convert;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.*;
|
import static org.hamcrest.Matchers.*;
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.springframework.core.convert.ConversionService;
|
import org.springframework.core.convert.ConversionService;
|
||||||
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
|
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
|
||||||
import org.springframework.data.mapping.context.MappingContext;
|
import org.springframework.data.mapping.context.MappingContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public class MappingElasticsearchConverterTests {
|
public class MappingElasticsearchConverterTests {
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
@Test(expected = IllegalArgumentException.class)
|
||||||
public void shouldFailToInitializeGivenMappingContextIsNull() {
|
public void shouldFailToInitializeGivenMappingContextIsNull() {
|
||||||
// given
|
// given
|
||||||
new MappingElasticsearchConverter(null);
|
new MappingElasticsearchConverter(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldReturnMappingContextWithWhichItWasInitialized() {
|
public void shouldReturnMappingContextWithWhichItWasInitialized() {
|
||||||
// given
|
// given
|
||||||
MappingContext mappingContext = new SimpleElasticsearchMappingContext();
|
MappingContext mappingContext = new SimpleElasticsearchMappingContext();
|
||||||
MappingElasticsearchConverter converter = new MappingElasticsearchConverter(mappingContext);
|
MappingElasticsearchConverter converter = new MappingElasticsearchConverter(mappingContext);
|
||||||
// then
|
// then
|
||||||
assertThat(converter.getMappingContext(), is(notNullValue()));
|
assertThat(converter.getMappingContext(), is(notNullValue()));
|
||||||
assertThat(converter.getMappingContext(), is(sameInstance(mappingContext)));
|
assertThat(converter.getMappingContext(), is(sameInstance(mappingContext)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldReturnDefaultConversionService() {
|
public void shouldReturnDefaultConversionService() {
|
||||||
// given
|
// given
|
||||||
MappingElasticsearchConverter converter = new MappingElasticsearchConverter(new SimpleElasticsearchMappingContext());
|
MappingElasticsearchConverter converter = new MappingElasticsearchConverter(new SimpleElasticsearchMappingContext());
|
||||||
// when
|
// when
|
||||||
ConversionService conversionService = converter.getConversionService();
|
ConversionService conversionService = converter.getConversionService();
|
||||||
// then
|
// then
|
||||||
assertThat(conversionService, is(notNullValue()));
|
assertThat(conversionService, is(notNullValue()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+111
-111
@@ -1,111 +1,111 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014-2017 the original author or authors.
|
* Copyright 2014-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.facet;
|
package org.springframework.data.elasticsearch.core.facet;
|
||||||
|
|
||||||
import static org.springframework.data.elasticsearch.annotations.FieldType.Integer;
|
import static org.springframework.data.elasticsearch.annotations.FieldType.Integer;
|
||||||
import static org.springframework.data.elasticsearch.annotations.FieldType.text;
|
import static org.springframework.data.elasticsearch.annotations.FieldType.Text;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.data.annotation.Id;
|
import org.springframework.data.annotation.Id;
|
||||||
import org.springframework.data.elasticsearch.annotations.*;
|
import org.springframework.data.elasticsearch.annotations.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simple type to test facets
|
* Simple type to test facets
|
||||||
*
|
*
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
@Document(indexName = "test-index-articles", type = "article", shards = 1, replicas = 0, refreshInterval = "-1")
|
@Document(indexName = "test-index-articles", type = "article", shards = 1, replicas = 0, refreshInterval = "-1")
|
||||||
public class ArticleEntity {
|
public class ArticleEntity {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
private String id;
|
private String id;
|
||||||
private String title;
|
private String title;
|
||||||
@Field(type = text, fielddata = true)
|
@Field(type = Text, fielddata = true)
|
||||||
private String subject;
|
private String subject;
|
||||||
|
|
||||||
@MultiField(
|
@MultiField(
|
||||||
mainField = @Field(type = text),
|
mainField = @Field(type = Text),
|
||||||
otherFields = {
|
otherFields = {
|
||||||
@InnerField(suffix = "untouched", type = text, store = true, fielddata = true, indexAnalyzer = "keyword"),
|
@InnerField(suffix = "untouched", type = Text, store = true, fielddata = true, analyzer = "keyword"),
|
||||||
@InnerField(suffix = "sort", type = text, store = true, indexAnalyzer = "keyword")
|
@InnerField(suffix = "sort", type = Text, store = true, analyzer = "keyword")
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
private List<String> authors = new ArrayList<>();
|
private List<String> authors = new ArrayList<>();
|
||||||
|
|
||||||
@Field(type = Integer, store = true)
|
@Field(type = Integer, store = true)
|
||||||
private List<Integer> publishedYears = new ArrayList<>();
|
private List<Integer> publishedYears = new ArrayList<>();
|
||||||
|
|
||||||
private int score;
|
private int score;
|
||||||
|
|
||||||
private ArticleEntity() {
|
private ArticleEntity() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArticleEntity(String id) {
|
public ArticleEntity(String id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(String id) {
|
public void setId(String id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getTitle() {
|
public String getTitle() {
|
||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTitle(String title) {
|
public void setTitle(String title) {
|
||||||
this.title = title;
|
this.title = title;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSubject() {
|
public String getSubject() {
|
||||||
return subject;
|
return subject;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSubject(String subject) {
|
public void setSubject(String subject) {
|
||||||
this.subject = subject;
|
this.subject = subject;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getAuthors() {
|
public List<String> getAuthors() {
|
||||||
return authors;
|
return authors;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAuthors(List<String> authors) {
|
public void setAuthors(List<String> authors) {
|
||||||
this.authors = authors;
|
this.authors = authors;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Integer> getPublishedYears() {
|
public List<Integer> getPublishedYears() {
|
||||||
return publishedYears;
|
return publishedYears;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPublishedYears(List<Integer> publishedYears) {
|
public void setPublishedYears(List<Integer> publishedYears) {
|
||||||
this.publishedYears = publishedYears;
|
this.publishedYears = publishedYears;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getScore() {
|
public int getScore() {
|
||||||
return score;
|
return score;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setScore(int score) {
|
public void setScore(int score) {
|
||||||
this.score = score;
|
this.score = score;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+69
-69
@@ -1,69 +1,69 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014 the original author or authors.
|
* Copyright 2014 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.facet;
|
package org.springframework.data.elasticsearch.core.facet;
|
||||||
|
|
||||||
import org.springframework.data.elasticsearch.core.query.IndexQuery;
|
import org.springframework.data.elasticsearch.core.query.IndexQuery;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simple type to test facets
|
* Simple type to test facets
|
||||||
*
|
*
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public class ArticleEntityBuilder {
|
public class ArticleEntityBuilder {
|
||||||
|
|
||||||
private ArticleEntity result;
|
private ArticleEntity result;
|
||||||
|
|
||||||
public ArticleEntityBuilder(String id) {
|
public ArticleEntityBuilder(String id) {
|
||||||
result = new ArticleEntity(id);
|
result = new ArticleEntity(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArticleEntityBuilder title(String title) {
|
public ArticleEntityBuilder title(String title) {
|
||||||
result.setTitle(title);
|
result.setTitle(title);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArticleEntityBuilder subject(String subject) {
|
public ArticleEntityBuilder subject(String subject) {
|
||||||
result.setSubject(subject);
|
result.setSubject(subject);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArticleEntityBuilder addAuthor(String author) {
|
public ArticleEntityBuilder addAuthor(String author) {
|
||||||
result.getAuthors().add(author);
|
result.getAuthors().add(author);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArticleEntityBuilder addPublishedYear(Integer year) {
|
public ArticleEntityBuilder addPublishedYear(Integer year) {
|
||||||
result.getPublishedYears().add(year);
|
result.getPublishedYears().add(year);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArticleEntityBuilder score(int score) {
|
public ArticleEntityBuilder score(int score) {
|
||||||
result.setScore(score);
|
result.setScore(score);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArticleEntity build() {
|
public ArticleEntity build() {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IndexQuery buildIndex() {
|
public IndexQuery buildIndex() {
|
||||||
IndexQuery indexQuery = new IndexQuery();
|
IndexQuery indexQuery = new IndexQuery();
|
||||||
indexQuery.setId(result.getId());
|
indexQuery.setId(result.getId());
|
||||||
indexQuery.setObject(result);
|
indexQuery.setObject(result);
|
||||||
return indexQuery;
|
return indexQuery;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+109
-108
@@ -1,108 +1,109 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.core.mapping;
|
package org.springframework.data.elasticsearch.core.mapping;
|
||||||
|
|
||||||
import java.beans.IntrospectionException;
|
import java.beans.IntrospectionException;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.springframework.data.annotation.Version;
|
import org.springframework.data.annotation.Version;
|
||||||
import org.springframework.data.mapping.MappingException;
|
import org.springframework.data.mapping.MappingException;
|
||||||
import org.springframework.data.mapping.model.Property;
|
import org.springframework.data.mapping.model.Property;
|
||||||
import org.springframework.data.mapping.model.SimpleTypeHolder;
|
import org.springframework.data.mapping.model.SimpleTypeHolder;
|
||||||
import org.springframework.data.util.ClassTypeInformation;
|
import org.springframework.data.util.ClassTypeInformation;
|
||||||
import org.springframework.data.util.TypeInformation;
|
import org.springframework.data.util.TypeInformation;
|
||||||
import org.springframework.util.ReflectionUtils;
|
import org.springframework.util.ReflectionUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public class SimpleElasticsearchPersistentEntityTests {
|
public class SimpleElasticsearchPersistentEntityTests {
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
@Test(expected = IllegalArgumentException.class)
|
||||||
public void shouldThrowExceptionGivenVersionPropertyIsNotLong() throws NoSuchFieldException, IntrospectionException {
|
public void shouldThrowExceptionGivenVersionPropertyIsNotLong() throws NoSuchFieldException, IntrospectionException {
|
||||||
// given
|
// given
|
||||||
TypeInformation typeInformation = ClassTypeInformation.from(EntityWithWrongVersionType.class);
|
TypeInformation typeInformation = ClassTypeInformation.from(EntityWithWrongVersionType.class);
|
||||||
SimpleElasticsearchPersistentEntity<EntityWithWrongVersionType> entity = new SimpleElasticsearchPersistentEntity<>(
|
SimpleElasticsearchPersistentEntity<EntityWithWrongVersionType> entity = new SimpleElasticsearchPersistentEntity<>(
|
||||||
typeInformation);
|
typeInformation);
|
||||||
|
|
||||||
SimpleElasticsearchPersistentProperty persistentProperty = createProperty(entity, "version");
|
SimpleElasticsearchPersistentProperty persistentProperty = createProperty(entity, "version");
|
||||||
|
|
||||||
// when
|
// when
|
||||||
entity.addPersistentProperty(persistentProperty);
|
entity.addPersistentProperty(persistentProperty);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = MappingException.class)
|
@Test(expected = MappingException.class)
|
||||||
public void shouldThrowExceptionGivenMultipleVersionPropertiesArePresent()
|
public void shouldThrowExceptionGivenMultipleVersionPropertiesArePresent()
|
||||||
throws NoSuchFieldException, IntrospectionException {
|
throws NoSuchFieldException, IntrospectionException {
|
||||||
// given
|
// given
|
||||||
TypeInformation typeInformation = ClassTypeInformation.from(EntityWithMultipleVersionField.class);
|
TypeInformation typeInformation = ClassTypeInformation.from(EntityWithMultipleVersionField.class);
|
||||||
SimpleElasticsearchPersistentEntity<EntityWithMultipleVersionField> entity = new SimpleElasticsearchPersistentEntity<>(
|
SimpleElasticsearchPersistentEntity<EntityWithMultipleVersionField> entity = new SimpleElasticsearchPersistentEntity<>(
|
||||||
typeInformation);
|
typeInformation);
|
||||||
|
|
||||||
SimpleElasticsearchPersistentProperty persistentProperty1 = createProperty(entity, "version1");
|
SimpleElasticsearchPersistentProperty persistentProperty1 = createProperty(entity, "version1");
|
||||||
|
|
||||||
SimpleElasticsearchPersistentProperty persistentProperty2 = createProperty(entity, "version2");
|
SimpleElasticsearchPersistentProperty persistentProperty2 = createProperty(entity, "version2");
|
||||||
|
|
||||||
entity.addPersistentProperty(persistentProperty1);
|
entity.addPersistentProperty(persistentProperty1);
|
||||||
// when
|
// when
|
||||||
entity.addPersistentProperty(persistentProperty2);
|
entity.addPersistentProperty(persistentProperty2);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static SimpleElasticsearchPersistentProperty createProperty(SimpleElasticsearchPersistentEntity<?> entity,
|
private static SimpleElasticsearchPersistentProperty createProperty(SimpleElasticsearchPersistentEntity<?> entity,
|
||||||
String field) {
|
String field) {
|
||||||
|
|
||||||
Property property = Property.of(ReflectionUtils.findField(entity.getTypeInformation().getType(), field));
|
TypeInformation<?> type = entity.getTypeInformation();
|
||||||
return new SimpleElasticsearchPersistentProperty(property, entity, SimpleTypeHolder.DEFAULT);
|
Property property = Property.of(type, ReflectionUtils.findField(entity.getType(), field));
|
||||||
|
return new SimpleElasticsearchPersistentProperty(property, entity, SimpleTypeHolder.DEFAULT);
|
||||||
}
|
|
||||||
|
}
|
||||||
private class EntityWithWrongVersionType {
|
|
||||||
|
private class EntityWithWrongVersionType {
|
||||||
@Version private String version;
|
|
||||||
|
@Version private String version;
|
||||||
public String getVersion() {
|
|
||||||
return version;
|
public String getVersion() {
|
||||||
}
|
return version;
|
||||||
|
}
|
||||||
public void setVersion(String version) {
|
|
||||||
this.version = version;
|
public void setVersion(String version) {
|
||||||
}
|
this.version = version;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
private class EntityWithMultipleVersionField {
|
|
||||||
|
private class EntityWithMultipleVersionField {
|
||||||
@Version private Long version1;
|
|
||||||
@Version private Long version2;
|
@Version private Long version1;
|
||||||
|
@Version private Long version2;
|
||||||
public Long getVersion1() {
|
|
||||||
return version1;
|
public Long getVersion1() {
|
||||||
}
|
return version1;
|
||||||
|
}
|
||||||
public void setVersion1(Long version1) {
|
|
||||||
this.version1 = version1;
|
public void setVersion1(Long version1) {
|
||||||
}
|
this.version1 = version1;
|
||||||
|
}
|
||||||
public Long getVersion2() {
|
|
||||||
return version2;
|
public Long getVersion2() {
|
||||||
}
|
return version2;
|
||||||
|
}
|
||||||
public void setVersion2(Long version2) {
|
|
||||||
this.version2 = version2;
|
public void setVersion2(Long version2) {
|
||||||
}
|
this.version2 = version2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
+725
-725
File diff suppressed because it is too large
Load Diff
@@ -1,42 +1,42 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.entities;
|
package org.springframework.data.elasticsearch.entities;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public class Author {
|
public class Author {
|
||||||
|
|
||||||
private String id;
|
private String id;
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(String id) {
|
public void setId(String id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setName(String name) {
|
public void setName(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,52 +1,62 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.entities;
|
package org.springframework.data.elasticsearch.entities;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.springframework.data.annotation.Id;
|
import org.springframework.data.annotation.Id;
|
||||||
import org.springframework.data.elasticsearch.annotations.Document;
|
import org.springframework.data.elasticsearch.annotations.Document;
|
||||||
import org.springframework.data.elasticsearch.annotations.Field;
|
import org.springframework.data.elasticsearch.annotations.Field;
|
||||||
import org.springframework.data.elasticsearch.annotations.FieldType;
|
import org.springframework.data.elasticsearch.annotations.FieldType;
|
||||||
|
import org.springframework.data.elasticsearch.annotations.InnerField;
|
||||||
/**
|
import org.springframework.data.elasticsearch.annotations.MultiField;
|
||||||
* @author Rizwan Idrees
|
|
||||||
* @author Mohsin Husen
|
/**
|
||||||
*/
|
* @author Rizwan Idrees
|
||||||
@Setter
|
* @author Mohsin Husen
|
||||||
@Getter
|
* @author Nordine Bittich
|
||||||
@NoArgsConstructor
|
*/
|
||||||
@AllArgsConstructor
|
@Setter
|
||||||
@Builder
|
@Getter
|
||||||
@Document(indexName = "test-index-book", type = "book", shards = 1, replicas = 0, refreshInterval = "-1")
|
@NoArgsConstructor
|
||||||
public class Book {
|
@AllArgsConstructor
|
||||||
|
@Builder
|
||||||
@Id
|
@Document(indexName = "test-index-book", type = "book", shards = 1, replicas = 0, refreshInterval = "-1")
|
||||||
private String id;
|
public class Book {
|
||||||
private String name;
|
|
||||||
@Field(type = FieldType.Object)
|
@Id
|
||||||
private Author author;
|
private String id;
|
||||||
@Field(type = FieldType.Nested)
|
private String name;
|
||||||
private Map<Integer, Collection<String>> buckets = new HashMap<>();
|
@Field(type = FieldType.Object)
|
||||||
}
|
private Author author;
|
||||||
|
@Field(type = FieldType.Nested)
|
||||||
|
private Map<Integer, Collection<String>> buckets = new HashMap<>();
|
||||||
|
@MultiField(
|
||||||
|
mainField = @Field(type = FieldType.Text, analyzer = "whitespace"),
|
||||||
|
otherFields = {
|
||||||
|
@InnerField(suffix = "prefix", type = FieldType.Text, analyzer = "stop", searchAnalyzer = "standard")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
private String description;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,59 +1,59 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014 the original author or authors.
|
* Copyright 2014 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.entities;
|
package org.springframework.data.elasticsearch.entities;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.data.elasticsearch.annotations.Field;
|
import org.springframework.data.elasticsearch.annotations.Field;
|
||||||
import org.springframework.data.elasticsearch.annotations.FieldType;
|
import org.springframework.data.elasticsearch.annotations.FieldType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class GirlFriend {
|
public class GirlFriend {
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
private String type;
|
private String type;
|
||||||
|
|
||||||
@Field(type = FieldType.Nested)
|
@Field(type = FieldType.Nested)
|
||||||
private List<Car> cars;
|
private List<Car> cars;
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setName(String name) {
|
public void setName(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getType() {
|
public String getType() {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setType(String type) {
|
public void setType(String type) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Car> getCars() {
|
public List<Car> getCars() {
|
||||||
return cars;
|
return cars;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCars(List<Car> cars) {
|
public void setCars(List<Car> cars) {
|
||||||
this.cars = cars;
|
this.cars = cars;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+46
-46
@@ -1,46 +1,46 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.entities;
|
package org.springframework.data.elasticsearch.entities;
|
||||||
|
|
||||||
import org.springframework.data.annotation.Id;
|
import org.springframework.data.annotation.Id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public class NonDocumentEntity {
|
public class NonDocumentEntity {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
private String someId;
|
private String someId;
|
||||||
private String someField1;
|
private String someField1;
|
||||||
private String someField2;
|
private String someField2;
|
||||||
|
|
||||||
public String getSomeField1() {
|
public String getSomeField1() {
|
||||||
return someField1;
|
return someField1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSomeField1(String someField1) {
|
public void setSomeField1(String someField1) {
|
||||||
this.someField1 = someField1;
|
this.someField1 = someField1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSomeField2() {
|
public String getSomeField2() {
|
||||||
return someField2;
|
return someField2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSomeField2(String someField2) {
|
public void setSomeField2(String someField2) {
|
||||||
this.someField2 = someField2;
|
this.someField2 = someField2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import org.springframework.core.style.ToStringCreator;
|
|||||||
import org.springframework.data.annotation.Id;
|
import org.springframework.data.annotation.Id;
|
||||||
import org.springframework.data.elasticsearch.annotations.Document;
|
import org.springframework.data.elasticsearch.annotations.Document;
|
||||||
import org.springframework.data.elasticsearch.annotations.Field;
|
import org.springframework.data.elasticsearch.annotations.Field;
|
||||||
import org.springframework.data.elasticsearch.annotations.FieldIndex;
|
|
||||||
import org.springframework.data.elasticsearch.annotations.FieldType;
|
import org.springframework.data.elasticsearch.annotations.FieldType;
|
||||||
import org.springframework.data.elasticsearch.annotations.Parent;
|
import org.springframework.data.elasticsearch.annotations.Parent;
|
||||||
|
|
||||||
@@ -38,7 +37,7 @@ public class ParentEntity {
|
|||||||
|
|
||||||
@Id
|
@Id
|
||||||
private String id;
|
private String id;
|
||||||
@Field(type = FieldType.text, store = true)
|
@Field(type = FieldType.Text, store = true)
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
public ParentEntity() {
|
public ParentEntity() {
|
||||||
@@ -67,10 +66,10 @@ public class ParentEntity {
|
|||||||
|
|
||||||
@Id
|
@Id
|
||||||
private String id;
|
private String id;
|
||||||
@Field(type = FieldType.text, store = true)
|
@Field(type = FieldType.Text, store = true)
|
||||||
@Parent(type = PARENT_TYPE)
|
@Parent(type = PARENT_TYPE)
|
||||||
private String parentId;
|
private String parentId;
|
||||||
@Field(type = FieldType.text, store = true)
|
@Field(type = FieldType.Text, store = true)
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
public ChildEntity() {
|
public ChildEntity() {
|
||||||
|
|||||||
+88
-88
@@ -1,88 +1,88 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014 the original author or authors.
|
* Copyright 2014 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.entities;
|
package org.springframework.data.elasticsearch.entities;
|
||||||
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.data.annotation.Id;
|
import org.springframework.data.annotation.Id;
|
||||||
import org.springframework.data.elasticsearch.annotations.Document;
|
import org.springframework.data.elasticsearch.annotations.Document;
|
||||||
import org.springframework.data.elasticsearch.annotations.Field;
|
import org.springframework.data.elasticsearch.annotations.Field;
|
||||||
import org.springframework.data.elasticsearch.annotations.FieldType;
|
import org.springframework.data.elasticsearch.annotations.FieldType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Document(indexName = "test-index-person-multiple-level-nested", type = "user", shards = 1, replicas = 0, refreshInterval = "-1")
|
@Document(indexName = "test-index-person-multiple-level-nested", type = "user", shards = 1, replicas = 0, refreshInterval = "-1")
|
||||||
public class PersonMultipleLevelNested {
|
public class PersonMultipleLevelNested {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
private String id;
|
private String id;
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@Field(type = FieldType.Nested)
|
@Field(type = FieldType.Nested)
|
||||||
private List<GirlFriend> girlFriends;
|
private List<GirlFriend> girlFriends;
|
||||||
|
|
||||||
@Field(type = FieldType.Nested)
|
@Field(type = FieldType.Nested)
|
||||||
private List<Car> cars;
|
private List<Car> cars;
|
||||||
|
|
||||||
@Field(type = FieldType.Nested, includeInParent = true)
|
@Field(type = FieldType.Nested, includeInParent = true)
|
||||||
private List<Car> bestCars;
|
private List<Car> bestCars;
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(String id) {
|
public void setId(String id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setName(String name) {
|
public void setName(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<GirlFriend> getGirlFriends() {
|
public List<GirlFriend> getGirlFriends() {
|
||||||
return girlFriends;
|
return girlFriends;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setGirlFriends(List<GirlFriend> girlFriends) {
|
public void setGirlFriends(List<GirlFriend> girlFriends) {
|
||||||
this.girlFriends = girlFriends;
|
this.girlFriends = girlFriends;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Car> getCars() {
|
public List<Car> getCars() {
|
||||||
return cars;
|
return cars;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCars(List<Car> cars) {
|
public void setCars(List<Car> cars) {
|
||||||
this.cars = cars;
|
this.cars = cars;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Car> getBestCars() {
|
public List<Car> getBestCars() {
|
||||||
return bestCars;
|
return bestCars;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBestCars(List<Car> bestCars) {
|
public void setBestCars(List<Car> bestCars) {
|
||||||
this.bestCars = bestCars;
|
this.bestCars = bestCars;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,97 +1,97 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014 the original author or authors.
|
* Copyright 2014 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.entities;
|
package org.springframework.data.elasticsearch.entities;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.data.annotation.Id;
|
import org.springframework.data.annotation.Id;
|
||||||
import org.springframework.data.elasticsearch.annotations.Document;
|
import org.springframework.data.elasticsearch.annotations.Document;
|
||||||
import org.springframework.data.elasticsearch.annotations.Field;
|
import org.springframework.data.elasticsearch.annotations.Field;
|
||||||
import org.springframework.data.elasticsearch.annotations.FieldType;
|
import org.springframework.data.elasticsearch.annotations.FieldType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
*/
|
*/
|
||||||
@Setter
|
@Setter
|
||||||
@Getter
|
@Getter
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Builder
|
@Builder
|
||||||
@Document(indexName = "test-index-product", type = "test-product-type", shards = 1, replicas = 0, refreshInterval = "-1")
|
@Document(indexName = "test-index-product", type = "test-product-type", shards = 1, replicas = 0, refreshInterval = "-1")
|
||||||
public class Product {
|
public class Product {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
private String id;
|
private String id;
|
||||||
|
|
||||||
private List<String> title;
|
private List<String> title;
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
private String description;
|
private String description;
|
||||||
|
|
||||||
private String text;
|
private String text;
|
||||||
|
|
||||||
private List<String> categories;
|
private List<String> categories;
|
||||||
|
|
||||||
private Float weight;
|
private Float weight;
|
||||||
|
|
||||||
@Field(type = FieldType.Float)
|
@Field(type = FieldType.Float)
|
||||||
private Float price;
|
private Float price;
|
||||||
|
|
||||||
private Integer popularity;
|
private Integer popularity;
|
||||||
|
|
||||||
private boolean available;
|
private boolean available;
|
||||||
|
|
||||||
private String location;
|
private String location;
|
||||||
|
|
||||||
private Date lastModified;
|
private Date lastModified;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return id.hashCode();
|
return id.hashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (this == obj) {
|
if (this == obj) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (obj == null) {
|
if (obj == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (getClass() != obj.getClass()) {
|
if (getClass() != obj.getClass()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Product other = (Product) obj;
|
Product other = (Product) obj;
|
||||||
if (id == null) {
|
if (id == null) {
|
||||||
if (other.id != null) {
|
if (other.id != null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (!id.equals(other.id)) {
|
} else if (!id.equals(other.id)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
package org.springframework.data.elasticsearch.entities;
|
package org.springframework.data.elasticsearch.entities;
|
||||||
|
|
||||||
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
|
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
|
||||||
import static org.springframework.data.elasticsearch.annotations.FieldType.text;
|
import static org.springframework.data.elasticsearch.annotations.FieldType.Text;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@ public class SampleDateMappingEntity {
|
|||||||
@Id
|
@Id
|
||||||
private String id;
|
private String id;
|
||||||
|
|
||||||
@Field(type = text, index = false, store = true, analyzer = "standard")
|
@Field(type = Text, index = false, store = true, analyzer = "standard")
|
||||||
private String message;
|
private String message;
|
||||||
|
|
||||||
@Field(type = Date, format = DateFormat.custom, pattern = "dd.MM.yyyy hh:mm")
|
@Field(type = Date, format = DateFormat.custom, pattern = "dd.MM.yyyy hh:mm")
|
||||||
|
|||||||
@@ -1,96 +1,99 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.entities;
|
package org.springframework.data.elasticsearch.entities;
|
||||||
|
|
||||||
import java.lang.Double;
|
import java.lang.Double;
|
||||||
import java.lang.Long;
|
import java.lang.Long;
|
||||||
import java.lang.Object;
|
import java.lang.Object;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import org.springframework.data.annotation.Id;
|
import lombok.ToString;
|
||||||
import org.springframework.data.annotation.Version;
|
import org.springframework.data.annotation.Id;
|
||||||
import org.springframework.data.elasticsearch.annotations.Document;
|
import org.springframework.data.annotation.Version;
|
||||||
import org.springframework.data.elasticsearch.annotations.Field;
|
import org.springframework.data.elasticsearch.annotations.Document;
|
||||||
import org.springframework.data.elasticsearch.annotations.ScriptedField;
|
import org.springframework.data.elasticsearch.annotations.Field;
|
||||||
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
|
import org.springframework.data.elasticsearch.annotations.ScriptedField;
|
||||||
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
|
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
|
||||||
|
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
|
||||||
/**
|
|
||||||
* @author Rizwan Idrees
|
/**
|
||||||
* @author Mohsin Husen
|
* @author Rizwan Idrees
|
||||||
*/
|
* @author Mohsin Husen
|
||||||
|
* @author Chris White
|
||||||
@Setter
|
*/
|
||||||
@Getter
|
|
||||||
@NoArgsConstructor
|
@Setter
|
||||||
@AllArgsConstructor
|
@Getter
|
||||||
@Builder
|
@NoArgsConstructor
|
||||||
@Document(indexName = "test-index-sample", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1")
|
@AllArgsConstructor
|
||||||
public class SampleEntity {
|
@ToString
|
||||||
|
@Builder
|
||||||
@Id
|
@Document(indexName = "test-index-sample", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1")
|
||||||
private String id;
|
public class SampleEntity {
|
||||||
@Field(type = text, store = true, fielddata = true)
|
|
||||||
private String type;
|
@Id
|
||||||
@Field(type = text, store = true, fielddata = true)
|
private String id;
|
||||||
private String message;
|
@Field(type = Text, store = true, fielddata = true)
|
||||||
private int rate;
|
private String type;
|
||||||
@ScriptedField
|
@Field(type = Text, store = true, fielddata = true)
|
||||||
private Double scriptedRate;
|
private String message;
|
||||||
private boolean available;
|
private int rate;
|
||||||
private String highlightedMessage;
|
@ScriptedField
|
||||||
|
private Double scriptedRate;
|
||||||
private GeoPoint location;
|
private boolean available;
|
||||||
|
private String highlightedMessage;
|
||||||
@Version
|
|
||||||
private Long version;
|
private GeoPoint location;
|
||||||
|
|
||||||
@Override
|
@Version
|
||||||
public boolean equals(Object o) {
|
private Long version;
|
||||||
if (this == o) return true;
|
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
SampleEntity that = (SampleEntity) o;
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
if (available != that.available) return false;
|
|
||||||
if (rate != that.rate) return false;
|
SampleEntity that = (SampleEntity) o;
|
||||||
if (highlightedMessage != null ? !highlightedMessage.equals(that.highlightedMessage) : that.highlightedMessage != null)
|
|
||||||
return false;
|
if (available != that.available) return false;
|
||||||
if (id != null ? !id.equals(that.id) : that.id != null) return false;
|
if (rate != that.rate) return false;
|
||||||
if (location != null ? !location.equals(that.location) : that.location != null) return false;
|
if (highlightedMessage != null ? !highlightedMessage.equals(that.highlightedMessage) : that.highlightedMessage != null)
|
||||||
if (message != null ? !message.equals(that.message) : that.message != null) return false;
|
return false;
|
||||||
if (type != null ? !type.equals(that.type) : that.type != null) return false;
|
if (id != null ? !id.equals(that.id) : that.id != null) return false;
|
||||||
if (version != null ? !version.equals(that.version) : that.version != 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;
|
||||||
return true;
|
if (type != null ? !type.equals(that.type) : that.type != null) return false;
|
||||||
}
|
if (version != null ? !version.equals(that.version) : that.version != null) return false;
|
||||||
|
|
||||||
@Override
|
return true;
|
||||||
public int hashCode() {
|
}
|
||||||
int result = id != null ? id.hashCode() : 0;
|
|
||||||
result = 31 * result + (type != null ? type.hashCode() : 0);
|
@Override
|
||||||
result = 31 * result + (message != null ? message.hashCode() : 0);
|
public int hashCode() {
|
||||||
result = 31 * result + rate;
|
int result = id != null ? id.hashCode() : 0;
|
||||||
result = 31 * result + (available ? 1 : 0);
|
result = 31 * result + (type != null ? type.hashCode() : 0);
|
||||||
result = 31 * result + (highlightedMessage != null ? highlightedMessage.hashCode() : 0);
|
result = 31 * result + (message != null ? message.hashCode() : 0);
|
||||||
result = 31 * result + (location != null ? location.hashCode() : 0);
|
result = 31 * result + rate;
|
||||||
result = 31 * result + (version != null ? version.hashCode() : 0);
|
result = 31 * result + (available ? 1 : 0);
|
||||||
return result;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+1
-1
@@ -48,7 +48,7 @@ public class SampleEntityUUIDKeyed {
|
|||||||
@Id
|
@Id
|
||||||
private UUID id;
|
private UUID id;
|
||||||
private String type;
|
private String type;
|
||||||
@Field(type = FieldType.text, fielddata = true)
|
@Field(type = FieldType.Text, fielddata = true)
|
||||||
private String message;
|
private String message;
|
||||||
private int rate;
|
private int rate;
|
||||||
@ScriptedField
|
@ScriptedField
|
||||||
|
|||||||
+2
-2
@@ -15,7 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.entities;
|
package org.springframework.data.elasticsearch.entities;
|
||||||
|
|
||||||
import static org.springframework.data.elasticsearch.annotations.FieldType.text;
|
import static org.springframework.data.elasticsearch.annotations.FieldType.Text;
|
||||||
|
|
||||||
import org.springframework.data.elasticsearch.annotations.Document;
|
import org.springframework.data.elasticsearch.annotations.Document;
|
||||||
import org.springframework.data.elasticsearch.annotations.Field;
|
import org.springframework.data.elasticsearch.annotations.Field;
|
||||||
@@ -26,7 +26,7 @@ import org.springframework.data.elasticsearch.annotations.Field;
|
|||||||
@Document(indexName = "test-index-sample-inherited", type = "mapping", shards = 1, replicas = 0, refreshInterval = "-1")
|
@Document(indexName = "test-index-sample-inherited", type = "mapping", shards = 1, replicas = 0, refreshInterval = "-1")
|
||||||
public class SampleInheritedEntity extends AbstractInheritedEntity {
|
public class SampleInheritedEntity extends AbstractInheritedEntity {
|
||||||
|
|
||||||
@Field(type = text, index = false, store = true, analyzer = "standard")
|
@Field(type = Text, index = false, store = true, analyzer = "standard")
|
||||||
private String message;
|
private String message;
|
||||||
|
|
||||||
public String getMessage() {
|
public String getMessage() {
|
||||||
|
|||||||
+68
-68
@@ -1,68 +1,68 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.entities;
|
package org.springframework.data.elasticsearch.entities;
|
||||||
|
|
||||||
import static org.springframework.data.elasticsearch.annotations.FieldType.text;
|
import static org.springframework.data.elasticsearch.annotations.FieldType.Text;
|
||||||
|
|
||||||
import org.springframework.data.annotation.Id;
|
import org.springframework.data.annotation.Id;
|
||||||
import org.springframework.data.elasticsearch.annotations.Document;
|
import org.springframework.data.elasticsearch.annotations.Document;
|
||||||
import org.springframework.data.elasticsearch.annotations.Field;
|
import org.springframework.data.elasticsearch.annotations.Field;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
@Document(indexName = "test-index-sample-mapping", type = "mapping", shards = 1, replicas = 0, refreshInterval = "-1")
|
@Document(indexName = "test-index-sample-mapping", type = "mapping", shards = 1, replicas = 0, refreshInterval = "-1")
|
||||||
public class SampleMappingEntity {
|
public class SampleMappingEntity {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
private String id;
|
private String id;
|
||||||
|
|
||||||
@Field(type = text, index = false, store = true, analyzer = "standard")
|
@Field(type = Text, index = false, store = true, analyzer = "standard")
|
||||||
private String message;
|
private String message;
|
||||||
|
|
||||||
private NestedEntity nested;
|
private NestedEntity nested;
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(String id) {
|
public void setId(String id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getMessage() {
|
public String getMessage() {
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMessage(String message) {
|
public void setMessage(String message) {
|
||||||
this.message = message;
|
this.message = message;
|
||||||
}
|
}
|
||||||
|
|
||||||
static class NestedEntity {
|
static class NestedEntity {
|
||||||
|
|
||||||
@Field(type = text)
|
@Field(type = Text)
|
||||||
private String someField;
|
private String someField;
|
||||||
|
|
||||||
public String getSomeField() {
|
public String getSomeField() {
|
||||||
return someField;
|
return someField;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSomeField(String someField) {
|
public void setSomeField(String someField) {
|
||||||
this.someField = someField;
|
this.someField = someField;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -15,7 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.entities;
|
package org.springframework.data.elasticsearch.entities;
|
||||||
|
|
||||||
import static org.springframework.data.elasticsearch.annotations.FieldType.text;
|
import static org.springframework.data.elasticsearch.annotations.FieldType.Text;
|
||||||
|
|
||||||
import org.springframework.data.annotation.Id;
|
import org.springframework.data.annotation.Id;
|
||||||
import org.springframework.data.annotation.Transient;
|
import org.springframework.data.annotation.Transient;
|
||||||
@@ -31,7 +31,7 @@ public class SampleTransientEntity {
|
|||||||
@Id
|
@Id
|
||||||
private String id;
|
private String id;
|
||||||
|
|
||||||
@Field(type = text, index = false, store = true, analyzer = "standard")
|
@Field(type = Text, index = false, store = true, analyzer = "standard")
|
||||||
private String message;
|
private String message;
|
||||||
|
|
||||||
@Transient
|
@Transient
|
||||||
|
|||||||
+1212
-1212
File diff suppressed because it is too large
Load Diff
+27
-27
@@ -1,27 +1,27 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2014 the original author or authors.
|
* Copyright 2013-2014 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repositories.book;
|
package org.springframework.data.elasticsearch.repositories.book;
|
||||||
|
|
||||||
import org.springframework.data.elasticsearch.entities.Book;
|
import org.springframework.data.elasticsearch.entities.Book;
|
||||||
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
|
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
public interface SampleElasticSearchBookRepository extends ElasticsearchRepository<Book, String> {
|
public interface SampleElasticSearchBookRepository extends ElasticsearchRepository<Book, String> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+32
-32
@@ -1,32 +1,32 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014-2017 the original author or authors.
|
* Copyright 2014-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repositories.cdi;
|
package org.springframework.data.elasticsearch.repositories.cdi;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import org.springframework.data.elasticsearch.entities.Product;
|
import org.springframework.data.elasticsearch.entities.Product;
|
||||||
import org.springframework.data.repository.CrudRepository;
|
import org.springframework.data.repository.CrudRepository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
* @author Christoph Strobl
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
public interface CdiProductRepository extends CrudRepository<Product, String> {
|
public interface CdiProductRepository extends CrudRepository<Product, String> {
|
||||||
|
|
||||||
Optional<Product> findById(String id);
|
Optional<Product> findById(String id);
|
||||||
}
|
}
|
||||||
|
|||||||
+58
-58
@@ -1,58 +1,58 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014-2016 the original author or authors.
|
* Copyright 2014-2016 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repositories.cdi;
|
package org.springframework.data.elasticsearch.repositories.cdi;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
class CdiRepositoryClient {
|
class CdiRepositoryClient {
|
||||||
|
|
||||||
private CdiProductRepository repository;
|
private CdiProductRepository repository;
|
||||||
private SamplePersonRepository samplePersonRepository;
|
private SamplePersonRepository samplePersonRepository;
|
||||||
private QualifiedProductRepository qualifiedProductRepository;
|
private QualifiedProductRepository qualifiedProductRepository;
|
||||||
|
|
||||||
public CdiProductRepository getRepository() {
|
public CdiProductRepository getRepository() {
|
||||||
return repository;
|
return repository;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public void setRepository(CdiProductRepository repository) {
|
public void setRepository(CdiProductRepository repository) {
|
||||||
this.repository = repository;
|
this.repository = repository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SamplePersonRepository getSamplePersonRepository() {
|
public SamplePersonRepository getSamplePersonRepository() {
|
||||||
return samplePersonRepository;
|
return samplePersonRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public void setSamplePersonRepository(SamplePersonRepository samplePersonRepository) {
|
public void setSamplePersonRepository(SamplePersonRepository samplePersonRepository) {
|
||||||
this.samplePersonRepository = samplePersonRepository;
|
this.samplePersonRepository = samplePersonRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QualifiedProductRepository getQualifiedProductRepository() {
|
public QualifiedProductRepository getQualifiedProductRepository() {
|
||||||
return qualifiedProductRepository;
|
return qualifiedProductRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public void setQualifiedProductRepository(
|
public void setQualifiedProductRepository(
|
||||||
@PersonDB @OtherQualifier QualifiedProductRepository qualifiedProductRepository) {
|
@PersonDB @OtherQualifier QualifiedProductRepository qualifiedProductRepository) {
|
||||||
this.qualifiedProductRepository = qualifiedProductRepository;
|
this.qualifiedProductRepository = qualifiedProductRepository;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+56
-56
@@ -1,56 +1,56 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014-2015 the original author or authors.
|
* Copyright 2014-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repositories.cdi;
|
package org.springframework.data.elasticsearch.repositories.cdi;
|
||||||
|
|
||||||
import javax.annotation.PreDestroy;
|
import javax.annotation.PreDestroy;
|
||||||
import javax.enterprise.context.ApplicationScoped;
|
import javax.enterprise.context.ApplicationScoped;
|
||||||
import javax.enterprise.inject.Produces;
|
import javax.enterprise.inject.Produces;
|
||||||
|
|
||||||
import org.elasticsearch.client.Client;
|
import org.elasticsearch.client.Client;
|
||||||
import org.elasticsearch.node.NodeValidationException;
|
import org.elasticsearch.node.NodeValidationException;
|
||||||
import org.springframework.data.elasticsearch.Utils;
|
import org.springframework.data.elasticsearch.Utils;
|
||||||
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
||||||
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
|
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
@ApplicationScoped
|
@ApplicationScoped
|
||||||
class ElasticsearchTemplateProducer {
|
class ElasticsearchTemplateProducer {
|
||||||
|
|
||||||
@Produces
|
@Produces
|
||||||
public Client createNodeClient() throws NodeValidationException {
|
public Client createNodeClient() throws NodeValidationException {
|
||||||
return Utils.getNodeClient();
|
return Utils.getNodeClient();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Produces
|
@Produces
|
||||||
public ElasticsearchOperations createElasticsearchTemplate(Client client) {
|
public ElasticsearchOperations createElasticsearchTemplate(Client client) {
|
||||||
return new ElasticsearchTemplate(client);
|
return new ElasticsearchTemplate(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Produces
|
@Produces
|
||||||
@OtherQualifier
|
@OtherQualifier
|
||||||
@PersonDB
|
@PersonDB
|
||||||
public ElasticsearchOperations createQualifiedElasticsearchTemplate(Client client) {
|
public ElasticsearchOperations createQualifiedElasticsearchTemplate(Client client) {
|
||||||
return new ElasticsearchTemplate(client);
|
return new ElasticsearchTemplate(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreDestroy
|
@PreDestroy
|
||||||
public void shutdown() {
|
public void shutdown() {
|
||||||
// remove everything to avoid conflicts with other tests in case server not shut down properly
|
// remove everything to avoid conflicts with other tests in case server not shut down properly
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+132
-132
@@ -1,132 +1,132 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repositories.custom;
|
package org.springframework.data.elasticsearch.repositories.custom;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.elasticsearch.annotations.Query;
|
import org.springframework.data.elasticsearch.annotations.Query;
|
||||||
import org.springframework.data.elasticsearch.core.geo.GeoBox;
|
import org.springframework.data.elasticsearch.core.geo.GeoBox;
|
||||||
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
|
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
|
||||||
import org.springframework.data.elasticsearch.entities.SampleEntity;
|
import org.springframework.data.elasticsearch.entities.SampleEntity;
|
||||||
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
|
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
|
||||||
import org.springframework.data.geo.Box;
|
import org.springframework.data.geo.Box;
|
||||||
import org.springframework.data.geo.Distance;
|
import org.springframework.data.geo.Distance;
|
||||||
import org.springframework.data.geo.Point;
|
import org.springframework.data.geo.Point;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Kevin Leturc
|
* @author Kevin Leturc
|
||||||
*/
|
*/
|
||||||
public interface SampleCustomMethodRepository extends ElasticsearchRepository<SampleEntity, String> {
|
public interface SampleCustomMethodRepository extends ElasticsearchRepository<SampleEntity, String> {
|
||||||
|
|
||||||
Page<SampleEntity> findByType(String type, Pageable pageable);
|
Page<SampleEntity> findByType(String type, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByTypeNot(String type, Pageable pageable);
|
Page<SampleEntity> findByTypeNot(String type, Pageable pageable);
|
||||||
|
|
||||||
@Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}")
|
@Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}")
|
||||||
Page<SampleEntity> findByMessage(String message, Pageable pageable);
|
Page<SampleEntity> findByMessage(String message, Pageable pageable);
|
||||||
|
|
||||||
@Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}")
|
@Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}")
|
||||||
List<SampleEntity> findByMessage(String message);
|
List<SampleEntity> findByMessage(String message);
|
||||||
|
|
||||||
Page<SampleEntity> findByAvailable(boolean available, Pageable pageable);
|
Page<SampleEntity> findByAvailable(boolean available, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByRateLessThan(int rate, Pageable pageable);
|
Page<SampleEntity> findByRateLessThan(int rate, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByRateBefore(int rate, Pageable pageable);
|
Page<SampleEntity> findByRateBefore(int rate, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByRateAfter(int rate, Pageable pageable);
|
Page<SampleEntity> findByRateAfter(int rate, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByMessageLike(String message, Pageable pageable);
|
Page<SampleEntity> findByMessageLike(String message, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByMessageStartingWith(String message, Pageable pageable);
|
Page<SampleEntity> findByMessageStartingWith(String message, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByMessageEndingWith(String message, Pageable pageable);
|
Page<SampleEntity> findByMessageEndingWith(String message, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByMessageContaining(String message, Pageable pageable);
|
Page<SampleEntity> findByMessageContaining(String message, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByIdIn(List<String> ids, Pageable pageable);
|
Page<SampleEntity> findByIdIn(List<String> ids, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByIdNotIn(List<String> ids, Pageable pageable);
|
Page<SampleEntity> findByIdNotIn(List<String> ids, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByAvailableTrue(Pageable pageable);
|
Page<SampleEntity> findByAvailableTrue(Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByAvailableFalse(Pageable pageable);
|
Page<SampleEntity> findByAvailableFalse(Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByMessageOrderByTypeAsc(String message, Pageable pageable);
|
Page<SampleEntity> findByMessageOrderByTypeAsc(String message, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByLocation(GeoPoint point, Pageable pageable);
|
Page<SampleEntity> findByLocation(GeoPoint point, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByLocationAndMessage(GeoPoint point, String msg, Pageable pageable);
|
Page<SampleEntity> findByLocationAndMessage(GeoPoint point, String msg, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByLocationWithin(GeoPoint point, String distance, Pageable pageable);
|
Page<SampleEntity> findByLocationWithin(GeoPoint point, String distance, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByLocationWithin(Point point, Distance distance, Pageable pageable);
|
Page<SampleEntity> findByLocationWithin(Point point, Distance distance, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByLocationNear(GeoBox box, Pageable pageable);
|
Page<SampleEntity> findByLocationNear(GeoBox box, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByLocationNear(Box box, Pageable pageable);
|
Page<SampleEntity> findByLocationNear(Box box, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByLocationNear(Point point, Distance distance, Pageable pageable);
|
Page<SampleEntity> findByLocationNear(Point point, Distance distance, Pageable pageable);
|
||||||
|
|
||||||
Page<SampleEntity> findByLocationNear(GeoPoint point, String distance, Pageable pageable);
|
Page<SampleEntity> findByLocationNear(GeoPoint point, String distance, Pageable pageable);
|
||||||
|
|
||||||
Stream<SampleEntity> findByType(String type);
|
Stream<SampleEntity> findByType(String type);
|
||||||
|
|
||||||
long countByType(String type);
|
long countByType(String type);
|
||||||
|
|
||||||
long countByTypeNot(String type);
|
long countByTypeNot(String type);
|
||||||
|
|
||||||
long countByAvailable(boolean available);
|
long countByAvailable(boolean available);
|
||||||
|
|
||||||
long countByRateLessThan(int rate);
|
long countByRateLessThan(int rate);
|
||||||
|
|
||||||
long countByRateBefore(int rate);
|
long countByRateBefore(int rate);
|
||||||
|
|
||||||
long countByRateAfter(int rate);
|
long countByRateAfter(int rate);
|
||||||
|
|
||||||
long countByMessageLike(String message);
|
long countByMessageLike(String message);
|
||||||
|
|
||||||
long countByMessageStartingWith(String message);
|
long countByMessageStartingWith(String message);
|
||||||
|
|
||||||
long countByMessageEndingWith(String message);
|
long countByMessageEndingWith(String message);
|
||||||
|
|
||||||
long countByMessageContaining(String message);
|
long countByMessageContaining(String message);
|
||||||
|
|
||||||
long countByIdIn(List<String> ids);
|
long countByIdIn(List<String> ids);
|
||||||
|
|
||||||
long countByIdNotIn(List<String> ids);
|
long countByIdNotIn(List<String> ids);
|
||||||
|
|
||||||
long countByAvailableTrue();
|
long countByAvailableTrue();
|
||||||
|
|
||||||
long countByAvailableFalse();
|
long countByAvailableFalse();
|
||||||
|
|
||||||
long countByLocationWithin(GeoPoint point, String distance);
|
long countByLocationWithin(GeoPoint point, String distance);
|
||||||
|
|
||||||
long countByLocationWithin(Point point, Distance distance);
|
long countByLocationWithin(Point point, Distance distance);
|
||||||
|
|
||||||
long countByLocationNear(GeoBox box);
|
long countByLocationNear(GeoBox box);
|
||||||
|
|
||||||
long countByLocationNear(Box box);
|
long countByLocationNear(Box box);
|
||||||
|
|
||||||
long countByLocationNear(Point point, Distance distance);
|
long countByLocationNear(Point point, Distance distance);
|
||||||
|
|
||||||
long countByLocationNear(GeoPoint point, String distance);
|
long countByLocationNear(GeoPoint point, String distance);
|
||||||
}
|
}
|
||||||
|
|||||||
+30
-30
@@ -1,30 +1,30 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2014 the original author or authors.
|
* Copyright 2013-2014 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repositories.nondocument;
|
package org.springframework.data.elasticsearch.repositories.nondocument;
|
||||||
|
|
||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.data.elasticsearch.entities.NonDocumentEntity;
|
import org.springframework.data.elasticsearch.entities.NonDocumentEntity;
|
||||||
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
|
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
*/
|
*/
|
||||||
@Lazy
|
@Lazy
|
||||||
public interface NonDocumentEntityRepository extends ElasticsearchRepository<NonDocumentEntity, String> {
|
public interface NonDocumentEntityRepository extends ElasticsearchRepository<NonDocumentEntity, String> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+38
-38
@@ -1,38 +1,38 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repositories.sample;
|
package org.springframework.data.elasticsearch.repositories.sample;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.data.elasticsearch.entities.SampleEntity;
|
import org.springframework.data.elasticsearch.entities.SampleEntity;
|
||||||
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
|
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Christoph Strobl
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
public interface SampleElasticsearchRepository extends ElasticsearchRepository<SampleEntity, String> {
|
public interface SampleElasticsearchRepository extends ElasticsearchRepository<SampleEntity, String> {
|
||||||
|
|
||||||
long deleteSampleEntityById(String id);
|
long deleteSampleEntityById(String id);
|
||||||
|
|
||||||
List<SampleEntity> deleteByAvailable(boolean available);
|
List<SampleEntity> deleteByAvailable(boolean available);
|
||||||
|
|
||||||
List<SampleEntity> deleteByMessage(String message);
|
List<SampleEntity> deleteByMessage(String message);
|
||||||
|
|
||||||
void deleteByType(String type);
|
void deleteByType(String type);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+64
-64
@@ -1,64 +1,64 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2017 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository.support;
|
package org.springframework.data.elasticsearch.repository.support;
|
||||||
|
|
||||||
import static org.mockito.Mockito.*;
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.junit.MockitoJUnitRunner;
|
import org.mockito.junit.MockitoJUnitRunner;
|
||||||
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
||||||
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
|
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
|
||||||
import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter;
|
import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter;
|
||||||
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
|
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
|
||||||
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
||||||
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
|
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
|
||||||
import org.springframework.data.mapping.context.MappingContext;
|
import org.springframework.data.mapping.context.MappingContext;
|
||||||
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
|
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
|
||||||
import org.springframework.data.repository.core.RepositoryMetadata;
|
import org.springframework.data.repository.core.RepositoryMetadata;
|
||||||
import org.springframework.data.repository.core.support.DefaultRepositoryMetadata;
|
import org.springframework.data.repository.core.support.DefaultRepositoryMetadata;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
@RunWith(MockitoJUnitRunner.class)
|
@RunWith(MockitoJUnitRunner.class)
|
||||||
public class ElasticsearchRepositoryFactoryTests {
|
public class ElasticsearchRepositoryFactoryTests {
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private ElasticsearchOperations operations;
|
private ElasticsearchOperations operations;
|
||||||
private ElasticsearchConverter converter;
|
private ElasticsearchConverter converter;
|
||||||
private ElasticsearchRepositoryFactory factory;
|
private ElasticsearchRepositoryFactory factory;
|
||||||
MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext = new SimpleElasticsearchMappingContext();
|
MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext = new SimpleElasticsearchMappingContext();
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void before() {
|
public void before() {
|
||||||
converter = new MappingElasticsearchConverter(mappingContext);
|
converter = new MappingElasticsearchConverter(mappingContext);
|
||||||
when(operations.getElasticsearchConverter()).thenReturn(converter);
|
when(operations.getElasticsearchConverter()).thenReturn(converter);
|
||||||
factory = new ElasticsearchRepositoryFactory(operations);
|
factory = new ElasticsearchRepositoryFactory(operations);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
@Test(expected = IllegalArgumentException.class)
|
||||||
public void shouldThrowExceptionGivenQueryDslRepository() {
|
public void shouldThrowExceptionGivenQueryDslRepository() {
|
||||||
// given
|
// given
|
||||||
RepositoryMetadata metadata = new DefaultRepositoryMetadata(QuerydslPredicateExecutor.class);
|
RepositoryMetadata metadata = new DefaultRepositoryMetadata(QuerydslPredicateExecutor.class);
|
||||||
// when
|
// when
|
||||||
factory.getRepositoryBaseClass(metadata);
|
factory.getRepositoryBaseClass(metadata);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+564
-550
File diff suppressed because it is too large
Load Diff
+14
@@ -45,6 +45,7 @@ import static org.junit.Assert.*;
|
|||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
* @author Christoph Strobl
|
* @author Christoph Strobl
|
||||||
|
* @author Michael Wirth
|
||||||
*/
|
*/
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
@ContextConfiguration("classpath:/simple-repository-test.xml")
|
@ContextConfiguration("classpath:/simple-repository-test.xml")
|
||||||
@@ -262,6 +263,19 @@ public class UUIDElasticsearchRepositoryTests {
|
|||||||
assertEquals(exist, true);
|
assertEquals(exist, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test // DATAES-363
|
||||||
|
public void shouldReturnFalseGivenDocumentWithIdDoesNotExist() {
|
||||||
|
|
||||||
|
// given
|
||||||
|
UUID documentId = UUID.randomUUID();
|
||||||
|
|
||||||
|
// when
|
||||||
|
boolean exist = repository.existsById(documentId);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(exist, is(false));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldDeleteAll() {
|
public void shouldDeleteAll() {
|
||||||
// when
|
// when
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
|
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
|
||||||
xsi:schemaLocation="http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd
|
xsi:schemaLocation="http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd
|
||||||
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
|
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
|
||||||
|
|
||||||
<import resource="infrastructure.xml"/>
|
<import resource="infrastructure.xml"/>
|
||||||
|
|
||||||
<bean name="elasticsearchTemplate"
|
<bean name="elasticsearchTemplate"
|
||||||
class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
|
class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
|
||||||
<constructor-arg name="client" ref="client"/>
|
<constructor-arg name="client" ref="client"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
|
||||||
<elasticsearch:repositories
|
<elasticsearch:repositories
|
||||||
base-package="org.springframework.data.elasticsearch.repositories.custom"/>
|
base-package="org.springframework.data.elasticsearch.repositories.custom"/>
|
||||||
|
|
||||||
</beans>
|
</beans>
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
|
||||||
|
|
||||||
<import resource="infrastructure.xml"/>
|
<import resource="infrastructure.xml"/>
|
||||||
|
|
||||||
<bean name="elasticsearchTemplate"
|
<bean name="elasticsearchTemplate"
|
||||||
class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
|
class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
|
||||||
<constructor-arg name="client" ref="client"/>
|
<constructor-arg name="client" ref="client"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
</beans>
|
</beans>
|
||||||
@@ -1,18 +1,18 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
|
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
|
||||||
xsi:schemaLocation="http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd
|
xsi:schemaLocation="http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd
|
||||||
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
|
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||||
|
|
||||||
<elasticsearch:node-client id="client" local="true" cluster-name="#{T(java.util.UUID).randomUUID().toString()}"
|
<elasticsearch:node-client id="client" local="true" cluster-name="#{T(java.util.UUID).randomUUID().toString()}"
|
||||||
http-enabled="false" path-data="target/elasticsearchTestData" path-home="src/test/resources/test-home-dir"
|
http-enabled="false" path-data="target/elasticsearchTestData" path-home="src/test/resources/test-home-dir"
|
||||||
path-configuration="node-client-configuration.yml"/>
|
path-configuration="node-client-configuration.yml"/>
|
||||||
|
|
||||||
<!-- ip4 -->
|
<!-- ip4 -->
|
||||||
<!--<elasticsearch:transport-client id="client" cluster-name="elasticsearch" cluster-nodes="127.0.0.1:9300" />-->
|
<!--<elasticsearch:transport-client id="client" cluster-name="elasticsearch" cluster-nodes="127.0.0.1:9300" />-->
|
||||||
|
|
||||||
<!-- ip6 -->
|
<!-- ip6 -->
|
||||||
<!--<elasticsearch:transport-client id="client" cluster-name="elasticsearch" cluster-nodes="[::1]:9300" />-->
|
<!--<elasticsearch:transport-client id="client" cluster-name="elasticsearch" cluster-nodes="[::1]:9300" />-->
|
||||||
|
|
||||||
</beans>
|
</beans>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user