@@ -37,9 +37,10 @@ public class FieldsMappingBuilder {
37
37
*/
38
38
@ SuppressWarnings ("unchecked" )
39
39
public void parseFieldMappings (Class <?> clazz , Map <String , Object > classDefinitionMap , List <IFacetBuilderHelper > facetFields ,
40
- List <IFilterBuilderHelper > filteredFields , Map <String , SourceFetchContext > fetchContexts , String pathPrefix ) throws IntrospectionException {
40
+ List <IFilterBuilderHelper > filteredFields , Map <String , SourceFetchContext > fetchContexts , String pathPrefix , String nestedPrefix )
41
+ throws IntrospectionException {
41
42
if (clazz .getSuperclass () != null && clazz .getSuperclass () != Object .class ) {
42
- parseFieldMappings (clazz .getSuperclass (), classDefinitionMap , facetFields , filteredFields , fetchContexts , pathPrefix );
43
+ parseFieldMappings (clazz .getSuperclass (), classDefinitionMap , facetFields , filteredFields , fetchContexts , pathPrefix , nestedPrefix );
43
44
}
44
45
45
46
List <Indexable > indexables = getIndexables (clazz );
@@ -51,13 +52,14 @@ public void parseFieldMappings(Class<?> clazz, Map<String, Object> classDefiniti
51
52
}
52
53
53
54
for (Indexable indexable : indexables ) {
54
- parseFieldMappings (clazz , classDefinitionMap , facetFields , filteredFields , fetchContexts , propertiesDefinitionMap , pathPrefix , indexable );
55
+ parseFieldMappings (clazz , classDefinitionMap , facetFields , filteredFields , fetchContexts , propertiesDefinitionMap , pathPrefix , nestedPrefix ,
56
+ indexable );
55
57
}
56
58
}
57
59
58
60
private void parseFieldMappings (Class <?> clazz , Map <String , Object > classDefinitionMap , List <IFacetBuilderHelper > facetFields ,
59
61
List <IFilterBuilderHelper > filteredFields , Map <String , SourceFetchContext > fetchContexts , Map <String , Object > propertiesDefinitionMap ,
60
- String pathPrefix , Indexable indexable ) {
62
+ String pathPrefix , String nestedPrefix , Indexable indexable ) {
61
63
String esFieldName = pathPrefix + indexable .getName ();
62
64
63
65
if (pathPrefix == null || pathPrefix .isEmpty ()) {
@@ -70,51 +72,51 @@ private void parseFieldMappings(Class<?> clazz, Map<String, Object> classDefinit
70
72
}
71
73
72
74
processFetchContextAnnotation (fetchContexts , esFieldName , indexable );
73
- processFilterAnnotation (filteredFields , esFieldName , indexable );
75
+ processFilterAnnotation (filteredFields , nestedPrefix , esFieldName , indexable );
74
76
processFacetAnnotation (facetFields , filteredFields , esFieldName , indexable );
75
77
76
78
// process the fields
77
79
if (ClassUtils .isPrimitiveOrWrapper (indexable .getType ()) || indexable .getType () == String .class || indexable .getType () == Date .class ) {
78
- processStringOrPrimitive (clazz , propertiesDefinitionMap , pathPrefix , indexable );
80
+ processStringOrPrimitive (clazz , propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
79
81
} else if (indexable .getType ().isEnum ()) {
80
82
StringField annotation = indexable .getAnnotation (StringField .class );
81
83
if (annotation != null ) {
82
- processStringOrPrimitive (clazz , propertiesDefinitionMap , pathPrefix , indexable );
84
+ processStringOrPrimitive (clazz , propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
83
85
}
84
86
} else if (Map .class .isAssignableFrom (indexable .getType ())) {
85
87
MapKeyValue annotation = indexable .getAnnotation (MapKeyValue .class );
86
88
if (annotation != null ) {
87
89
// Create an object mapping with key and value
88
90
processFieldAnnotation (MapKeyValue .class , new MapKeyValueAnnotationParser (this , filteredFields , facetFields ), propertiesDefinitionMap ,
89
- pathPrefix , indexable );
91
+ pathPrefix , nestedPrefix , indexable );
90
92
} else {
91
- processComplexOrArray (clazz , facetFields , filteredFields , pathPrefix , propertiesDefinitionMap , indexable );
93
+ processComplexOrArray (clazz , facetFields , filteredFields , pathPrefix , nestedPrefix , propertiesDefinitionMap , indexable );
92
94
}
93
95
} else {
94
- processComplexOrArray (clazz , facetFields , filteredFields , pathPrefix , propertiesDefinitionMap , indexable );
96
+ processComplexOrArray (clazz , facetFields , filteredFields , pathPrefix , nestedPrefix , propertiesDefinitionMap , indexable );
95
97
}
96
98
}
97
99
98
100
private void processComplexOrArray (Class <?> clazz , List <IFacetBuilderHelper > facetFields , List <IFilterBuilderHelper > filteredFields , String pathPrefix ,
99
- Map <String , Object > propertiesDefinitionMap , Indexable indexable ) {
101
+ String nestedPrefix , Map <String , Object > propertiesDefinitionMap , Indexable indexable ) {
100
102
// mapping of a complex field
101
103
if (indexable .isArrayOrCollection ()) {
102
104
Class <?> arrayType = indexable .getComponentType ();
103
105
// process the array type.
104
106
if (ClassUtils .isPrimitiveOrWrapper (arrayType ) || arrayType == String .class || indexable .getType () == Date .class ) {
105
- processStringOrPrimitive (clazz , propertiesDefinitionMap , pathPrefix , indexable );
107
+ processStringOrPrimitive (clazz , propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
106
108
} else if (arrayType .isEnum ()) {
107
109
// if this is an enum and there is a String
108
110
StringField annotation = indexable .getAnnotation (StringField .class );
109
111
if (annotation != null ) {
110
- processStringOrPrimitive (clazz , propertiesDefinitionMap , pathPrefix , indexable );
112
+ processStringOrPrimitive (clazz , propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
111
113
}
112
114
} else {
113
- processComplexType (clazz , propertiesDefinitionMap , pathPrefix , indexable , filteredFields , facetFields );
115
+ processComplexType (clazz , propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable , filteredFields , facetFields );
114
116
}
115
117
} else {
116
118
// process the type
117
- processComplexType (clazz , propertiesDefinitionMap , pathPrefix , indexable , filteredFields , facetFields );
119
+ processComplexType (clazz , propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable , filteredFields , facetFields );
118
120
}
119
121
}
120
122
@@ -206,7 +208,7 @@ private void processFetchContextAnnotation(Map<String, SourceFetchContext> fetch
206
208
}
207
209
}
208
210
209
- private void processFilterAnnotation (List <IFilterBuilderHelper > classFilters , String esFieldName , Indexable indexable ) {
211
+ private void processFilterAnnotation (List <IFilterBuilderHelper > classFilters , String nestedPrefix , String esFieldName , Indexable indexable ) {
210
212
TermFilter termFilter = indexable .getAnnotation (TermFilter .class );
211
213
if (termFilter != null ) {
212
214
String [] paths = termFilter .paths ();
@@ -223,9 +225,9 @@ private void processFilterAnnotation(List<IFilterBuilderHelper> classFilters, St
223
225
}
224
226
for (String path : paths ) {
225
227
path = path .trim ();
226
- addFilter (classFilters , esFieldName , indexable , path , isAnalyzed (indexable , null ));
228
+ addFilter (classFilters , nestedPrefix , esFieldName , indexable , path , isAnalyzed (indexable , null ));
227
229
for (String alternateFieldName : alternateFieldNames (indexable )) {
228
- addFilter (classFilters , alternateFieldName , indexable , path , isAnalyzed (indexable , alternateFieldName ));
230
+ addFilter (classFilters , nestedPrefix , alternateFieldName , indexable , path , isAnalyzed (indexable , alternateFieldName ));
229
231
}
230
232
}
231
233
return ;
@@ -237,18 +239,14 @@ private void processFilterAnnotation(List<IFilterBuilderHelper> classFilters, St
237
239
}
238
240
}
239
241
240
- private void addFilter (List <IFilterBuilderHelper > classFilters , String esFieldName , Indexable indexable , String path , boolean isAnalyzed ) {
241
- String nestedPath = indexable .getAnnotation (NestedObject .class ) == null ? null : esFieldName ;
242
- if (nestedPath == null ) {
243
- int nestedIndicator = esFieldName .lastIndexOf ("." );
244
- if (nestedIndicator > 0 ) {
245
- nestedPath = esFieldName .substring (0 , nestedIndicator );
246
- esFieldName = esFieldName .substring (nestedIndicator + 1 , esFieldName .length ());
247
- }
242
+ private void addFilter (List <IFilterBuilderHelper > classFilters , String nestedPrefix , String esFieldName , Indexable indexable , String path ,
243
+ boolean isAnalyzed ) {
244
+ if (nestedPrefix != null ) {
245
+ esFieldName = esFieldName .substring (nestedPrefix .length () + 1 );
248
246
}
249
247
String filterPath = getFilterPath (path , esFieldName );
250
248
251
- classFilters .add (new TermsFilterBuilderHelper (isAnalyzed , nestedPath , filterPath ));
249
+ classFilters .add (new TermsFilterBuilderHelper (isAnalyzed , nestedPrefix , filterPath ));
252
250
}
253
251
254
252
private void processFacetAnnotation (List <IFacetBuilderHelper > classFacets , List <IFilterBuilderHelper > classFilters , String esFieldName ,
@@ -337,37 +335,38 @@ private String[] alternateFieldNames(Indexable indexable) {
337
335
return multi .multiNames ();
338
336
}
339
337
340
- private void processStringOrPrimitive (Class <?> clazz , Map <String , Object > propertiesDefinitionMap , String pathPrefix , Indexable indexable ) {
341
- processFieldAnnotation (IndexName .class , new IndexNameAnnotationParser (), propertiesDefinitionMap , pathPrefix , indexable );
342
- processFieldAnnotation (NullValue .class , new NullValueAnnotationParser (), propertiesDefinitionMap , pathPrefix , indexable );
338
+ private void processStringOrPrimitive (Class <?> clazz , Map <String , Object > propertiesDefinitionMap , String pathPrefix , String nestedPrefix ,
339
+ Indexable indexable ) {
340
+ processFieldAnnotation (IndexName .class , new IndexNameAnnotationParser (), propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
341
+ processFieldAnnotation (NullValue .class , new NullValueAnnotationParser (), propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
343
342
344
343
// String field annotations.
345
- processFieldAnnotation (StringField .class , new StringFieldAnnotationParser (), propertiesDefinitionMap , pathPrefix , indexable );
346
- processFieldAnnotation (StringFieldMulti .class , new StringFieldMultiAnnotationParser (), propertiesDefinitionMap , pathPrefix , indexable );
347
- processFieldAnnotation (Analyser .class , new AnalyserAnnotationParser (), propertiesDefinitionMap , pathPrefix , indexable );
348
- processFieldAnnotation (IndexAnalyser .class , new IndexAnalyserAnnotationParser (), propertiesDefinitionMap , pathPrefix , indexable );
349
- processFieldAnnotation (SearchAnalyser .class , new SearchAnalyserAnnotationParser (), propertiesDefinitionMap , pathPrefix , indexable );
344
+ processFieldAnnotation (StringField .class , new StringFieldAnnotationParser (), propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
345
+ processFieldAnnotation (StringFieldMulti .class , new StringFieldMultiAnnotationParser (), propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
346
+ processFieldAnnotation (Analyser .class , new AnalyserAnnotationParser (), propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
347
+ processFieldAnnotation (IndexAnalyser .class , new IndexAnalyserAnnotationParser (), propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
348
+ processFieldAnnotation (SearchAnalyser .class , new SearchAnalyserAnnotationParser (), propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
350
349
351
350
// Numeric field annotation
352
- processFieldAnnotation (NumberField .class , new NumberFieldAnnotationParser (), propertiesDefinitionMap , pathPrefix , indexable );
351
+ processFieldAnnotation (NumberField .class , new NumberFieldAnnotationParser (), propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
353
352
354
353
// Date field annotation
355
- processFieldAnnotation (DateField .class , new DateFieldAnnotationParser (), propertiesDefinitionMap , pathPrefix , indexable );
356
- processFieldAnnotation (DateFormat .class , new DateFormatAnnotationParser (), propertiesDefinitionMap , pathPrefix , indexable );
354
+ processFieldAnnotation (DateField .class , new DateFieldAnnotationParser (), propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
355
+ processFieldAnnotation (DateFormat .class , new DateFormatAnnotationParser (), propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
357
356
358
357
// Boolean field annotation
359
- processFieldAnnotation (BooleanField .class , new BooleanFieldAnnotationParser (), propertiesDefinitionMap , pathPrefix , indexable );
358
+ processFieldAnnotation (BooleanField .class , new BooleanFieldAnnotationParser (), propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
360
359
// TODO binary type mapping
361
360
}
362
361
363
- private void processComplexType (Class <?> clazz , Map <String , Object > propertiesDefinitionMap , String pathPrefix , Indexable indexable ,
362
+ private void processComplexType (Class <?> clazz , Map <String , Object > propertiesDefinitionMap , String pathPrefix , String nestedPrefix , Indexable indexable ,
364
363
List <IFilterBuilderHelper > filters , List <IFacetBuilderHelper > facets ) {
365
364
NestedObjectFieldAnnotationParser nested = new NestedObjectFieldAnnotationParser (this , filters , facets );
366
- processFieldAnnotation (NestedObject .class , nested , propertiesDefinitionMap , pathPrefix , indexable );
365
+ processFieldAnnotation (NestedObject .class , nested , propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
367
366
368
367
if (propertiesDefinitionMap .get (indexable .getName ()) == null ) {
369
368
ObjectFieldAnnotationParser objectFieldAnnotationParser = new ObjectFieldAnnotationParser (this , filters , facets );
370
- processFieldAnnotation (ObjectField .class , objectFieldAnnotationParser , propertiesDefinitionMap , pathPrefix , indexable );
369
+ processFieldAnnotation (ObjectField .class , objectFieldAnnotationParser , propertiesDefinitionMap , pathPrefix , nestedPrefix , indexable );
371
370
// by default we consider the complex object as an object mapping and process recursive mapping of every field just as ES would process based on
372
371
// dynamic
373
372
// mapping
@@ -378,22 +377,22 @@ private void processComplexType(Class<?> clazz, Map<String, Object> propertiesDe
378
377
fieldDefinition = new HashMap <String , Object >();
379
378
propertiesDefinitionMap .put (indexable .getName (), fieldDefinition );
380
379
}
381
- objectFieldAnnotationParser .parseAnnotation (null , fieldDefinition , pathPrefix , indexable );
380
+ objectFieldAnnotationParser .parseAnnotation (null , fieldDefinition , pathPrefix , nestedPrefix , indexable );
382
381
}
383
382
}
384
383
}
385
384
386
385
@ SuppressWarnings ("unchecked" )
387
386
private <T extends Annotation > void processFieldAnnotation (Class <T > annotationClass , IPropertyAnnotationParser <T > propertyAnnotationParser ,
388
- Map <String , Object > propertiesDefinitionMap , String pathPrefix , Indexable indexable ) {
387
+ Map <String , Object > propertiesDefinitionMap , String pathPrefix , String nestedPrefix , Indexable indexable ) {
389
388
T annotation = indexable .getAnnotation (annotationClass );
390
389
if (annotation != null ) {
391
390
Map <String , Object > fieldDefinition = (Map <String , Object >) propertiesDefinitionMap .get (indexable .getName ());
392
391
if (fieldDefinition == null ) {
393
392
fieldDefinition = new HashMap <String , Object >();
394
393
propertiesDefinitionMap .put (indexable .getName (), fieldDefinition );
395
394
}
396
- propertyAnnotationParser .parseAnnotation (annotation , fieldDefinition , pathPrefix , indexable );
395
+ propertyAnnotationParser .parseAnnotation (annotation , fieldDefinition , pathPrefix , nestedPrefix , indexable );
397
396
}
398
397
}
399
398
0 commit comments