Skip to content

Commit 2ce5282

Browse files
ls-urs-kellersothawo
authored andcommitted
Allow IndexCoordinates in repositories
It is common to have multiple indexes with the same document structure. E.g. rolling indices over time and having a wildcard alias. Sometimes one wants to select different IndexCoordinates than specified in `@Document(indexName = "...", ...)`. Also you might want to use the same Repository to do cross cluster searches and for this need to specify the IndexCoordinates. It would therefore be helpful to support IndexCoordinates as an argument to repository methods the same way ScrollPosition, Sort and Pageable are handled. This PR is an attempt to introduce this change. I keep it as draft to get some comments I can add tests to it if we can agree on the change being valid. # Conflicts: # src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchParameter.java # src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchParameters.java # src/test/java/org/springframework/data/elasticsearch/repository/query/StubParameterAccessor.java
1 parent 9a66c77 commit 2ce5282

8 files changed

+65
-9
lines changed

src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractElasticsearchRepositoryQuery.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,13 @@ public Object execute(Object[] parameters) {
9090

9191
Query query = createQuery(parameters);
9292

93-
IndexCoordinates index = elasticsearchOperations.getIndexCoordinatesFor(clazz);
93+
IndexCoordinates index = parameterAccessor
94+
.getIndexCoordinatesOrDefaults(elasticsearchOperations.getIndexCoordinatesFor(clazz));
9495

9596
Object result = null;
9697

9798
if (isDeleteQuery()) {
99+
index = elasticsearchOperations.getIndexCoordinatesFor(clazz);
98100
result = countOrGetDocumentsForDelete(query, parameterAccessor);
99101
elasticsearchOperations.delete(DeleteQuery.builder(query).build(), clazz, index);
100102
elasticsearchOperations.indexOps(index).refresh();

src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractReactiveElasticsearchRepositoryQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ private Object execute(ElasticsearchParametersParameterAccessor parameterAccesso
110110
evaluationContextProvider);
111111

112112
String indexName = queryMethod.getEntityInformation().getIndexName();
113-
IndexCoordinates index = IndexCoordinates.of(indexName);
113+
IndexCoordinates index = parameterAccessor.getIndexCoordinatesOrDefaults(IndexCoordinates.of(indexName));
114114

115115
ReactiveElasticsearchQueryExecution execution = getExecution(parameterAccessor,
116116
new ResultProcessingConverter(processor));

src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchParameter.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.springframework.data.elasticsearch.repository.query;
1717

1818
import org.springframework.core.MethodParameter;
19+
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
1920
import org.springframework.data.core.TypeInformation;
2021
import org.springframework.data.elasticsearch.core.query.RuntimeField;
2122
import org.springframework.data.elasticsearch.core.query.ScriptedField;
@@ -42,7 +43,8 @@ public class ElasticsearchParameter extends Parameter {
4243

4344
@Override
4445
public boolean isSpecialParameter() {
45-
return super.isSpecialParameter() || isScriptedFieldParameter() || isRuntimeFieldParameter();
46+
return super.isSpecialParameter() || isScriptedFieldParameter() || isRuntimeFieldParameter()
47+
|| isIndexCoordinatesParameter();
4648
}
4749

4850
public Boolean isScriptedFieldParameter() {
@@ -52,4 +54,7 @@ public Boolean isScriptedFieldParameter() {
5254
public Boolean isRuntimeFieldParameter() {
5355
return RuntimeField.class.isAssignableFrom(getType());
5456
}
57+
public Boolean isIndexCoordinatesParameter() {
58+
return IndexCoordinates.class.isAssignableFrom(getType());
59+
}
5560
}

src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchParameterAccessor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
*/
1616
package org.springframework.data.elasticsearch.repository.query;
1717

18+
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
1819
import org.springframework.data.repository.query.ParameterAccessor;
20+
import org.springframework.lang.NonNull;
1921

2022
/**
2123
* @author Christoph Strobl
@@ -29,4 +31,6 @@ public interface ElasticsearchParameterAccessor extends ParameterAccessor {
2931
* @return
3032
*/
3133
Object[] getValues();
34+
35+
IndexCoordinates getIndexCoordinatesOrDefaults(@NonNull IndexCoordinates defaults);
3236
}

src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchParameters.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@
2929
* @since 3.2
3030
*/
3131
public class ElasticsearchParameters extends Parameters<ElasticsearchParameters, ElasticsearchParameter> {
32-
3332
private final List<ElasticsearchParameter> scriptedFields = new ArrayList<>();
3433
private final List<ElasticsearchParameter> runtimeFields = new ArrayList<>();
3534

35+
private final int indexCoordinatesIndex;
36+
3637
public ElasticsearchParameters(ParametersSource parametersSource) {
3738

3839
super(parametersSource,
@@ -53,16 +54,35 @@ public ElasticsearchParameters(ParametersSource parametersSource) {
5354
runtimeFields.add(parameter);
5455
}
5556
}
57+
this.indexCoordinatesIndex = initIndexCoordinatesIndex();
58+
}
59+
60+
private int initIndexCoordinatesIndex() {
61+
int index = 0;
62+
List<Integer> foundIndices = new ArrayList<>();
63+
for (ElasticsearchParameter parameter : this) {
64+
if (parameter.isIndexCoordinatesParameter()) {
65+
foundIndices.add(index);
66+
}
67+
index++;
68+
}
69+
if (foundIndices.size() > 1) {
70+
throw new IllegalArgumentException(this + " can only contain at most one IndexCoordinates parameter.");
71+
}
72+
return foundIndices.isEmpty() ? -1 : foundIndices.get(0);
5673
}
5774

5875
private ElasticsearchParameter parameterFactory(MethodParameter methodParameter, TypeInformation<?> domainType) {
5976
return new ElasticsearchParameter(methodParameter, domainType);
6077
}
6178

79+
6280
private ElasticsearchParameters(List<ElasticsearchParameter> parameters) {
6381
super(parameters);
82+
this.indexCoordinatesIndex = initIndexCoordinatesIndex();
6483
}
6584

85+
6686
@Override
6787
protected ElasticsearchParameters createFrom(List<ElasticsearchParameter> parameters) {
6888
return new ElasticsearchParameters(parameters);
@@ -75,4 +95,12 @@ List<ElasticsearchParameter> getScriptedFields() {
7595
List<ElasticsearchParameter> getRuntimeFields() {
7696
return runtimeFields;
7797
}
98+
99+
public boolean hasIndexCoordinatesParameter() {
100+
return this.indexCoordinatesIndex != -1;
101+
}
102+
103+
public int getIndexCoordinatesIndex() {
104+
return indexCoordinatesIndex;
105+
}
78106
}

src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchParametersParameterAccessor.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,13 @@
1515
*/
1616
package org.springframework.data.elasticsearch.repository.query;
1717

18+
import java.util.Arrays;
19+
import java.util.List;
20+
21+
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
22+
import org.springframework.data.repository.query.Parameters;
1823
import org.springframework.data.repository.query.ParametersParameterAccessor;
24+
import org.springframework.lang.NonNull;
1925

2026
/**
2127
* @author Christoph Strobl
@@ -25,6 +31,7 @@ public class ElasticsearchParametersParameterAccessor extends ParametersParamete
2531
implements ElasticsearchParameterAccessor {
2632

2733
private final Object[] values;
34+
private final ElasticsearchParameters eleasticSearchParameters;
2835

2936
/**
3037
* Creates a new {@link ElasticsearchParametersParameterAccessor}.
@@ -36,10 +43,20 @@ public class ElasticsearchParametersParameterAccessor extends ParametersParamete
3643

3744
super(method.getParameters(), values);
3845
this.values = values;
46+
this.eleasticSearchParameters = method.getParameters();
3947
}
4048

4149
@Override
4250
public Object[] getValues() {
4351
return values;
4452
}
53+
54+
55+
@Override
56+
public IndexCoordinates getIndexCoordinatesOrDefaults(@NonNull IndexCoordinates defaults) {
57+
if (!eleasticSearchParameters.hasIndexCoordinatesParameter()) {
58+
return defaults;
59+
}
60+
return (IndexCoordinates) getValues()[eleasticSearchParameters.getIndexCoordinatesIndex()];
61+
}
4562
}

src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchQueryMethod.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,11 @@ private String[] mapParameters(String[] source, ElasticsearchParametersParameter
373373
return fieldNames.toArray(new String[0]);
374374
}
375375

376+
@Override
377+
public ElasticsearchParameters getParameters() {
378+
return (ElasticsearchParameters) super.getParameters();
379+
}
380+
376381
// region Copied from QueryMethod base class
377382
/*
378383
* Copied from the QueryMethod class adding support for collections of SearchHit instances. No static method here.

src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchQueryMethod.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,6 @@ public boolean isStreamQuery() {
136136
return true;
137137
}
138138

139-
@Override
140-
public ElasticsearchParameters getParameters() {
141-
return (ElasticsearchParameters) super.getParameters();
142-
}
143-
144139
@Override
145140
protected boolean isAllowedGenericType(ParameterizedType methodGenericReturnType) {
146141
return super.isAllowedGenericType(methodGenericReturnType)

0 commit comments

Comments
 (0)