/
LuceneIndexSchemaRootNodeBuilder.java
151 lines (129 loc) · 5.99 KB
/
LuceneIndexSchemaRootNodeBuilder.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.backend.lucene.document.model.dsl.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.hibernate.search.backend.lucene.analysis.model.impl.LuceneAnalysisDefinitionRegistry;
import org.hibernate.search.backend.lucene.document.model.impl.AbstractLuceneIndexSchemaFieldNode;
import org.hibernate.search.backend.lucene.document.model.impl.AbstractLuceneIndexSchemaFieldTemplate;
import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexModel;
import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexSchemaNamedPredicateNode;
import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexSchemaValueFieldNode;
import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexSchemaValueFieldTemplate;
import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexSchemaNodeCollector;
import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexSchemaObjectFieldNode;
import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexSchemaObjectFieldTemplate;
import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexSchemaObjectNode;
import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexSchemaRootNode;
import org.hibernate.search.backend.lucene.types.dsl.LuceneIndexFieldTypeFactory;
import org.hibernate.search.backend.lucene.types.dsl.impl.LuceneIndexFieldTypeFactoryImpl;
import org.hibernate.search.engine.backend.document.model.dsl.spi.IndexSchemaBuildContext;
import org.hibernate.search.engine.backend.types.ObjectStructure;
import org.hibernate.search.engine.backend.types.converter.spi.DocumentIdentifierValueConverter;
import org.hibernate.search.engine.backend.types.converter.spi.StringDocumentIdentifierValueConverter;
import org.hibernate.search.engine.backend.document.model.dsl.spi.IndexSchemaRootNodeBuilder;
import org.hibernate.search.engine.mapper.mapping.building.spi.IndexFieldTypeDefaultsProvider;
import org.hibernate.search.engine.reporting.spi.EventContexts;
import org.hibernate.search.util.common.reporting.EventContext;
public class LuceneIndexSchemaRootNodeBuilder extends AbstractLuceneIndexSchemaObjectNodeBuilder
implements IndexSchemaRootNodeBuilder, IndexSchemaBuildContext {
private final EventContext indexEventContext;
private final String mappedTypeName;
private final LuceneAnalysisDefinitionRegistry analysisDefinitionRegistry;
private DocumentIdentifierValueConverter<?> idDslConverter;
public LuceneIndexSchemaRootNodeBuilder(EventContext indexEventContext,
String mappedTypeName, LuceneAnalysisDefinitionRegistry analysisDefinitionRegistry) {
this.indexEventContext = indexEventContext;
this.mappedTypeName = mappedTypeName;
this.analysisDefinitionRegistry = analysisDefinitionRegistry;
}
@Override
public EventContext eventContext() {
return getIndexEventContext().append( EventContexts.indexSchemaRoot() );
}
@Override
public LuceneIndexFieldTypeFactory createTypeFactory(IndexFieldTypeDefaultsProvider defaultsProvider) {
return new LuceneIndexFieldTypeFactoryImpl( indexEventContext, analysisDefinitionRegistry, defaultsProvider );
}
@Override
public void explicitRouting() {
// Nothing to do
}
@Override
public void idDslConverter(DocumentIdentifierValueConverter<?> idDslConverter) {
this.idDslConverter = idDslConverter;
}
@Override
public LuceneIndexSchemaRootNodeBuilder getRootNodeBuilder() {
return this;
}
public LuceneIndexModel build(String indexName) {
Map<String, AbstractLuceneIndexSchemaFieldNode> staticFields = new HashMap<>();
List<AbstractLuceneIndexSchemaFieldTemplate<?>> fieldTemplates = new ArrayList<>();
Map<String, LuceneIndexSchemaNamedPredicateNode> namedPredicateNodes = new HashMap<>();
// Initializing a one-element array so that we can mutate the boolean below.
// Alternatively we could use AtomicBoolean, but we don't need concurrent access here.
boolean[] hasNestedDocument = new boolean[1];
LuceneIndexSchemaNodeCollector collector = new LuceneIndexSchemaNodeCollector() {
@Override
public void collect(String absoluteFieldPath, LuceneIndexSchemaValueFieldNode<?> node) {
staticFields.put( absoluteFieldPath, node );
}
@Override
public void collect(String absolutePath, LuceneIndexSchemaObjectFieldNode node) {
staticFields.put( absolutePath, node );
if ( isNested( node.structure() ) ) {
hasNestedDocument[0] = true;
}
}
@Override
public void collect(LuceneIndexSchemaObjectFieldTemplate template) {
fieldTemplates.add( template );
if ( isNested( template.structure() ) ) {
hasNestedDocument[0] = true;
}
}
@Override
public void collect(String absoluteFilterPath, LuceneIndexSchemaNamedPredicateNode node) {
namedPredicateNodes.put( absoluteFilterPath, node );
}
@Override
public void collect(LuceneIndexSchemaValueFieldTemplate template) {
fieldTemplates.add( template );
}
};
Map<String, AbstractLuceneIndexSchemaFieldNode> staticChildrenByName = new TreeMap<>();
LuceneIndexSchemaObjectNode rootNode = new LuceneIndexSchemaRootNode( staticChildrenByName );
contributeChildren( rootNode, collector, staticChildrenByName );
return new LuceneIndexModel(
indexName,
mappedTypeName,
idDslConverter == null ? new StringDocumentIdentifierValueConverter() : idDslConverter,
rootNode, staticFields, fieldTemplates, namedPredicateNodes, hasNestedDocument[0]
);
}
@Override
String getAbsolutePath() {
return null;
}
EventContext getIndexEventContext() {
return indexEventContext;
}
private boolean isNested(ObjectStructure structure) {
switch ( structure ) {
case NESTED:
return true;
case FLATTENED:
case DEFAULT:
default:
return false;
}
}
}