|
43 | 43 | import java.io.IOException;
|
44 | 44 | import java.text.ParseException;
|
45 | 45 | import java.util.ArrayList;
|
| 46 | +import java.util.HashMap; |
46 | 47 | import java.util.Iterator;
|
47 | 48 | import java.util.List;
|
48 | 49 | import java.util.Map;
|
@@ -193,61 +194,73 @@ protected void setupFieldType(BuilderContext context) {
|
193 | 194 | }
|
194 | 195 | }
|
195 | 196 |
|
| 197 | + protected static final String DEPRECATED_PARAMETERS_KEY = "deprecated_parameters"; |
| 198 | + |
196 | 199 | public static class TypeParser implements Mapper.TypeParser {
|
| 200 | + protected boolean parseXContentParameters(String name, Map.Entry<String, Object> entry, Map<String, Object> params) |
| 201 | + throws MapperParsingException { |
| 202 | + if (DeprecatedParameters.parse(name, entry.getKey(), entry.getValue(), |
| 203 | + (DeprecatedParameters)params.get(DEPRECATED_PARAMETERS_KEY))) { |
| 204 | + return true; |
| 205 | + } |
| 206 | + return false; |
| 207 | + } |
| 208 | + |
| 209 | + protected Builder newBuilder(String name, Map<String, Object> params) { |
| 210 | + if (params.containsKey(DEPRECATED_PARAMETERS_KEY)) { |
| 211 | + return new LegacyGeoShapeFieldMapper.Builder(name, (DeprecatedParameters)params.get(DEPRECATED_PARAMETERS_KEY)); |
| 212 | + } |
| 213 | + return new GeoShapeFieldMapper.Builder(name); |
| 214 | + } |
197 | 215 |
|
198 | 216 | @Override
|
199 | 217 | public Mapper.Builder parse(String name, Map<String, Object> node, ParserContext parserContext) throws MapperParsingException {
|
200 |
| - Boolean coerce = null; |
201 |
| - Boolean ignoreZ = null; |
202 |
| - Boolean ignoreMalformed = null; |
203 |
| - Orientation orientation = null; |
204 |
| - DeprecatedParameters deprecatedParameters = new DeprecatedParameters(); |
205 |
| - boolean parsedDeprecatedParams = false; |
| 218 | + Map<String, Object> params = new HashMap<>(); |
| 219 | + boolean parsedDeprecatedParameters = false; |
| 220 | + params.put(DEPRECATED_PARAMETERS_KEY, new DeprecatedParameters()); |
206 | 221 | for (Iterator<Map.Entry<String, Object>> iterator = node.entrySet().iterator(); iterator.hasNext();) {
|
207 | 222 | Map.Entry<String, Object> entry = iterator.next();
|
208 | 223 | String fieldName = entry.getKey();
|
209 | 224 | Object fieldNode = entry.getValue();
|
210 |
| - if (DeprecatedParameters.parse(name, fieldName, fieldNode, deprecatedParameters)) { |
211 |
| - parsedDeprecatedParams = true; |
| 225 | + if (parseXContentParameters(name, entry, params)) { |
| 226 | + parsedDeprecatedParameters = true; |
212 | 227 | iterator.remove();
|
213 | 228 | } else if (Names.ORIENTATION.match(fieldName, LoggingDeprecationHandler.INSTANCE)) {
|
214 |
| - orientation = ShapeBuilder.Orientation.fromString(fieldNode.toString()); |
| 229 | + params.put(Names.ORIENTATION.getPreferredName(), ShapeBuilder.Orientation.fromString(fieldNode.toString())); |
215 | 230 | iterator.remove();
|
216 | 231 | } else if (IGNORE_MALFORMED.equals(fieldName)) {
|
217 |
| - ignoreMalformed = XContentMapValues.nodeBooleanValue(fieldNode, name + ".ignore_malformed"); |
| 232 | + params.put(IGNORE_MALFORMED, XContentMapValues.nodeBooleanValue(fieldNode, name + ".ignore_malformed")); |
218 | 233 | iterator.remove();
|
219 | 234 | } else if (Names.COERCE.match(fieldName, LoggingDeprecationHandler.INSTANCE)) {
|
220 |
| - coerce = XContentMapValues.nodeBooleanValue(fieldNode, name + "." + Names.COERCE.getPreferredName()); |
| 235 | + params.put(Names.COERCE.getPreferredName(), |
| 236 | + XContentMapValues.nodeBooleanValue(fieldNode, name + "." + Names.COERCE.getPreferredName())); |
221 | 237 | iterator.remove();
|
222 | 238 | } else if (GeoPointFieldMapper.Names.IGNORE_Z_VALUE.getPreferredName().equals(fieldName)) {
|
223 |
| - ignoreZ = XContentMapValues.nodeBooleanValue(fieldNode, |
224 |
| - name + "." + GeoPointFieldMapper.Names.IGNORE_Z_VALUE.getPreferredName()); |
| 239 | + params.put(GeoPointFieldMapper.Names.IGNORE_Z_VALUE.getPreferredName(), |
| 240 | + XContentMapValues.nodeBooleanValue(fieldNode, |
| 241 | + name + "." + GeoPointFieldMapper.Names.IGNORE_Z_VALUE.getPreferredName())); |
225 | 242 | iterator.remove();
|
226 | 243 | }
|
227 | 244 | }
|
228 |
| - final Builder builder; |
229 |
| - if (parsedDeprecatedParams || parserContext.indexVersionCreated().before(Version.V_6_6_0)) { |
230 |
| - // Legacy index-based shape |
231 |
| - builder = new LegacyGeoShapeFieldMapper.Builder(name, deprecatedParameters); |
232 |
| - } else { |
233 |
| - // BKD-based shape |
234 |
| - builder = new GeoShapeFieldMapper.Builder(name); |
| 245 | + if (parsedDeprecatedParameters == false) { |
| 246 | + params.remove(DEPRECATED_PARAMETERS_KEY); |
235 | 247 | }
|
| 248 | + Builder builder = newBuilder(name, params); |
236 | 249 |
|
237 |
| - if (coerce != null) { |
238 |
| - builder.coerce(coerce); |
| 250 | + if (params.containsKey(Names.COERCE.getPreferredName())) { |
| 251 | + builder.coerce((Boolean)params.get(Names.COERCE.getPreferredName())); |
239 | 252 | }
|
240 | 253 |
|
241 |
| - if (ignoreZ != null) { |
242 |
| - builder.ignoreZValue(ignoreZ); |
| 254 | + if (params.containsKey(GeoPointFieldMapper.Names.IGNORE_Z_VALUE.getPreferredName())) { |
| 255 | + builder.ignoreZValue((Boolean)params.get(GeoPointFieldMapper.Names.IGNORE_Z_VALUE.getPreferredName())); |
243 | 256 | }
|
244 | 257 |
|
245 |
| - if (ignoreMalformed != null) { |
246 |
| - builder.ignoreMalformed(ignoreMalformed); |
| 258 | + if (params.containsKey(IGNORE_MALFORMED)) { |
| 259 | + builder.ignoreMalformed((Boolean)params.get(IGNORE_MALFORMED)); |
247 | 260 | }
|
248 | 261 |
|
249 |
| - if (orientation != null) { |
250 |
| - builder.orientation(orientation); |
| 262 | + if (params.containsKey(Names.ORIENTATION.getPreferredName())) { |
| 263 | + builder.orientation((Orientation)params.get(Names.ORIENTATION.getPreferredName())); |
251 | 264 | }
|
252 | 265 |
|
253 | 266 | return builder;
|
@@ -302,7 +315,8 @@ public Query existsQuery(QueryShardContext context) {
|
302 | 315 |
|
303 | 316 | @Override
|
304 | 317 | public Query termQuery(Object value, QueryShardContext context) {
|
305 |
| - throw new QueryShardException(context, "Geo fields do not support exact searching, use dedicated geo queries instead"); |
| 318 | + throw new QueryShardException(context, |
| 319 | + "Geometry fields do not support exact searching, use dedicated geometry queries instead"); |
306 | 320 | }
|
307 | 321 |
|
308 | 322 | public void setGeometryIndexer(Indexer<Parsed, Processed> geometryIndexer) {
|
@@ -361,6 +375,7 @@ protected void doMerge(Mapper mergeWith) {
|
361 | 375 |
|
362 | 376 | @Override
|
363 | 377 | protected void parseCreateField(ParseContext context, List<IndexableField> fields) throws IOException {
|
| 378 | + throw new UnsupportedOperationException("Parsing is implemented in parse(), this method should NEVER be called"); |
364 | 379 | }
|
365 | 380 |
|
366 | 381 | @Override
|
|
0 commit comments