Skip to content

Commit 7c68489

Browse files
committed
Mapping - Support specifying string as number values (for example, for boost), closes #53.
1 parent ae5bcb6 commit 7c68489

File tree

2 files changed

+83
-14
lines changed

2 files changed

+83
-14
lines changed

modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/json/JsonDocumentMapperParser.java

+15-14
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
import static com.google.common.collect.Lists.*;
4242
import static org.elasticsearch.index.mapper.json.JsonMapperBuilders.*;
43+
import static org.elasticsearch.util.json.JacksonNodes.*;
4344

4445
/**
4546
* @author kimchy (Shay Banon)
@@ -151,7 +152,7 @@ private JsonBoostFieldMapper.Builder parseBoostField(ObjectNode boostNode) {
151152
String propName = entry.getKey();
152153
JsonNode propNode = entry.getValue();
153154
if (propName.equals("nullValue")) {
154-
builder.nullValue(propNode.getNumberValue().floatValue());
155+
builder.nullValue(nodeFloatValue(propNode));
155156
}
156157
}
157158
return builder;
@@ -180,7 +181,7 @@ private JsonSourceFieldMapper.Builder parseSourceField(ObjectNode sourceNode) {
180181
String fieldName = entry.getKey();
181182
JsonNode fieldNode = entry.getValue();
182183
// if (fieldName.equals("compressionThreshold")) {
183-
// builder.compressionThreshold(fieldNode.getNumberValue().intValue());
184+
// builder.compressionThreshold(nodeIn...);
184185
// } else if (fieldName.equals("compressionType")) {
185186
// String compressionType = fieldNode.getTextValue();
186187
// if ("zip".equals(compressionType)) {
@@ -204,7 +205,7 @@ private JsonObjectMapper.Builder parseObject(String name, ObjectNode node) {
204205
String fieldName = entry.getKey();
205206
JsonNode fieldNode = entry.getValue();
206207
if (fieldName.equals("dynamic")) {
207-
builder.dynamic(fieldNode.getBooleanValue());
208+
builder.dynamic(nodeBooleanValue(fieldNode));
208209
} else if (fieldName.equals("type")) {
209210
String type = fieldNode.getTextValue();
210211
if (!type.equals("object")) {
@@ -227,7 +228,7 @@ private JsonObjectMapper.Builder parseObject(String name, ObjectNode node) {
227228
builder.dateTimeFormatter(dateTimeFormatters);
228229
}
229230
} else if (fieldName.equals("enabled")) {
230-
builder.enabled(fieldNode.getBooleanValue());
231+
builder.enabled(nodeBooleanValue(fieldNode));
231232
} else if (fieldName.equals("pathType")) {
232233
builder.pathType(parsePathType(name, fieldNode.getValueAsText()));
233234
} else if (fieldName.equals("properties")) {
@@ -362,7 +363,7 @@ private JsonIntegerFieldMapper.Builder parseInteger(String name, ObjectNode inte
362363
String propName = entry.getKey();
363364
JsonNode propNode = entry.getValue();
364365
if (propName.equals("nullValue")) {
365-
builder.nullValue(propNode.getNumberValue().intValue());
366+
builder.nullValue(nodeIntegerValue(propNode));
366367
}
367368
}
368369
return builder;
@@ -376,7 +377,7 @@ private JsonLongFieldMapper.Builder parseLong(String name, ObjectNode longNode)
376377
String propName = entry.getKey();
377378
JsonNode propNode = entry.getValue();
378379
if (propName.equals("nullValue")) {
379-
builder.nullValue(propNode.getNumberValue().longValue());
380+
builder.nullValue(nodeLongValue(propNode));
380381
}
381382
}
382383
return builder;
@@ -390,7 +391,7 @@ private JsonFloatFieldMapper.Builder parseFloat(String name, ObjectNode floatNod
390391
String propName = entry.getKey();
391392
JsonNode propNode = entry.getValue();
392393
if (propName.equals("nullValue")) {
393-
builder.nullValue(propNode.getNumberValue().floatValue());
394+
builder.nullValue(nodeFloatValue(propNode));
394395
}
395396
}
396397
return builder;
@@ -404,7 +405,7 @@ private JsonDoubleFieldMapper.Builder parseDouble(String name, ObjectNode double
404405
String propName = entry.getKey();
405406
JsonNode propNode = entry.getValue();
406407
if (propName.equals("nullValue")) {
407-
builder.nullValue(propNode.getNumberValue().doubleValue());
408+
builder.nullValue(nodeDoubleValue(propNode));
408409
}
409410
}
410411
return builder;
@@ -438,7 +439,7 @@ private JsonBooleanFieldMapper.Builder parseBoolean(String name, ObjectNode bool
438439
String propName = entry.getKey();
439440
JsonNode propNode = entry.getValue();
440441
if (propName.equals("nullValue")) {
441-
builder.nullValue(propNode.getBooleanValue());
442+
builder.nullValue(nodeBooleanValue(propNode));
442443
}
443444
}
444445
return builder;
@@ -451,7 +452,7 @@ private void parseNumberField(JsonNumberFieldMapper.Builder builder, String name
451452
String propName = entry.getKey();
452453
JsonNode propNode = entry.getValue();
453454
if (propName.equals("precisionStep")) {
454-
builder.precisionStep(propNode.getNumberValue().intValue());
455+
builder.precisionStep(nodeIntegerValue(propNode));
455456
}
456457
}
457458
}
@@ -462,19 +463,19 @@ private void parseJsonField(JsonFieldMapper.Builder builder, String name, Object
462463
String propName = entry.getKey();
463464
JsonNode propNode = entry.getValue();
464465
if (propName.equals("indexName")) {
465-
builder.indexName(propNode.getValueAsText());
466+
builder.indexName(propNode.getTextValue());
466467
} else if (propName.equals("store")) {
467468
builder.store(parseStore(name, propNode.getTextValue()));
468469
} else if (propName.equals("index")) {
469470
builder.index(parseIndex(name, propNode.getTextValue()));
470471
} else if (propName.equals("termVector")) {
471472
builder.termVector(parseTermVector(name, propNode.getTextValue()));
472473
} else if (propName.equals("boost")) {
473-
builder.boost(propNode.getNumberValue().floatValue());
474+
builder.boost(nodeFloatValue(propNode));
474475
} else if (propName.equals("omitNorms")) {
475-
builder.omitNorms(propNode.getBooleanValue());
476+
builder.omitNorms(nodeBooleanValue(propNode));
476477
} else if (propName.equals("omitTermFreqAndPositions")) {
477-
builder.omitTermFreqAndPositions(propNode.getBooleanValue());
478+
builder.omitTermFreqAndPositions(nodeBooleanValue(propNode));
478479
} else if (propName.equals("indexAnalyzer")) {
479480
builder.indexAnalyzer(analysisService.analyzer(propNode.getTextValue()));
480481
} else if (propName.equals("searchAnalyzer")) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* Licensed to Elastic Search and Shay Banon under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. Elastic Search licenses this
6+
* file to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.elasticsearch.util.json;
21+
22+
import org.codehaus.jackson.JsonNode;
23+
24+
/**
25+
* @author kimchy (shay.banon)
26+
*/
27+
public class JacksonNodes {
28+
29+
public static float nodeFloatValue(JsonNode node) {
30+
if (node.isNumber()) {
31+
return node.getNumberValue().floatValue();
32+
}
33+
String value = node.getTextValue();
34+
return Float.parseFloat(value);
35+
}
36+
37+
public static double nodeDoubleValue(JsonNode node) {
38+
if (node.isNumber()) {
39+
return node.getNumberValue().doubleValue();
40+
}
41+
String value = node.getTextValue();
42+
return Double.parseDouble(value);
43+
}
44+
45+
public static int nodeIntegerValue(JsonNode node) {
46+
if (node.isNumber()) {
47+
return node.getNumberValue().intValue();
48+
}
49+
String value = node.getTextValue();
50+
return Integer.parseInt(value);
51+
}
52+
53+
public static long nodeLongValue(JsonNode node) {
54+
if (node.isNumber()) {
55+
return node.getNumberValue().longValue();
56+
}
57+
String value = node.getTextValue();
58+
return Long.parseLong(value);
59+
}
60+
61+
public static boolean nodeBooleanValue(JsonNode node) {
62+
if (node.isBoolean()) {
63+
return node.getBooleanValue();
64+
}
65+
String value = node.getTextValue();
66+
return !(value.equals("false") || value.equals("0") || value.equals("off"));
67+
}
68+
}

0 commit comments

Comments
 (0)