Skip to content

Commit 2d6de97

Browse files
committed
Mapper: Allow to define CamelCase JSON fields in mapping definitions, closes #133.
1 parent cb7e92b commit 2d6de97

12 files changed

+49
-34
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.codehaus.jackson.node.ObjectNode;
2727
import org.elasticsearch.index.mapper.MapperParsingException;
2828
import org.elasticsearch.util.Booleans;
29+
import org.elasticsearch.util.Strings;
2930
import org.elasticsearch.util.json.JsonBuilder;
3031
import org.elasticsearch.util.lucene.Lucene;
3132

@@ -102,9 +103,9 @@ public static class TypeParser implements JsonTypeParser {
102103
parseJsonField(builder, name, booleanNode, parserContext);
103104
for (Iterator<Map.Entry<String, JsonNode>> propsIt = booleanNode.getFields(); propsIt.hasNext();) {
104105
Map.Entry<String, JsonNode> entry = propsIt.next();
105-
String propName = entry.getKey();
106+
String propName = Strings.toUnderscoreCase(entry.getKey());
106107
JsonNode propNode = entry.getValue();
107-
if (propName.equals("nullValue") || propName.equals("null_value")) {
108+
if (propName.equals("null_value")) {
108109
builder.nullValue(nodeBooleanValue(propNode));
109110
}
110111
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.elasticsearch.index.analysis.NumericDateAnalyzer;
3131
import org.elasticsearch.index.mapper.MapperParsingException;
3232
import org.elasticsearch.util.Numbers;
33+
import org.elasticsearch.util.Strings;
3334
import org.elasticsearch.util.joda.FormatDateTimeFormatter;
3435
import org.elasticsearch.util.joda.Joda;
3536
import org.elasticsearch.util.json.JsonBuilder;
@@ -90,9 +91,9 @@ public static class TypeParser implements JsonTypeParser {
9091
parseNumberField(builder, name, dateNode, parserContext);
9192
for (Iterator<Map.Entry<String, JsonNode>> propsIt = dateNode.getFields(); propsIt.hasNext();) {
9293
Map.Entry<String, JsonNode> entry = propsIt.next();
93-
String propName = entry.getKey();
94+
String propName = Strings.toUnderscoreCase(entry.getKey());
9495
JsonNode propNode = entry.getValue();
95-
if (propName.equals("nullValue") || propName.equals("null_value")) {
96+
if (propName.equals("null_value")) {
9697
builder.nullValue(propNode.getValueAsText());
9798
} else if (propName.equals("format")) {
9899
builder.dateTimeFormatter(parseDateTimeFormatter(propName, propNode));

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.elasticsearch.index.mapper.DocumentMapperParser;
2929
import org.elasticsearch.index.mapper.MapperParsingException;
3030
import org.elasticsearch.util.MapBuilder;
31+
import org.elasticsearch.util.Strings;
3132
import org.elasticsearch.util.io.FastStringReader;
3233
import org.elasticsearch.util.json.Jackson;
3334

@@ -117,7 +118,7 @@ public void putTypeParser(String type, JsonTypeParser typeParser) {
117118

118119
for (Iterator<Map.Entry<String, JsonNode>> fieldsIt = rootObj.getFields(); fieldsIt.hasNext();) {
119120
Map.Entry<String, JsonNode> entry = fieldsIt.next();
120-
String fieldName = entry.getKey();
121+
String fieldName = Strings.toUnderscoreCase(entry.getKey());
121122
JsonNode fieldNode = entry.getValue();
122123

123124
if (JsonSourceFieldMapper.JSON_TYPE.equals(fieldName) || "sourceField".equals(fieldName)) {
@@ -178,7 +179,7 @@ private JsonBoostFieldMapper.Builder parseBoostField(ObjectNode boostNode, JsonT
178179
parseNumberField(builder, name, boostNode, parserContext);
179180
for (Iterator<Map.Entry<String, JsonNode>> propsIt = boostNode.getFields(); propsIt.hasNext();) {
180181
Map.Entry<String, JsonNode> entry = propsIt.next();
181-
String propName = entry.getKey();
182+
String propName = Strings.toUnderscoreCase(entry.getKey());
182183
JsonNode propNode = entry.getValue();
183184
if (propName.equals("null_value")) {
184185
builder.nullValue(nodeFloatValue(propNode));
@@ -208,7 +209,7 @@ private JsonAllFieldMapper.Builder parseAllField(ObjectNode allNode, JsonTypePar
208209
parseJsonField(builder, builder.name, allNode, parserContext);
209210
for (Iterator<Map.Entry<String, JsonNode>> fieldsIt = allNode.getFields(); fieldsIt.hasNext();) {
210211
Map.Entry<String, JsonNode> entry = fieldsIt.next();
211-
String fieldName = entry.getKey();
212+
String fieldName = Strings.toUnderscoreCase(entry.getKey());
212213
JsonNode fieldNode = entry.getValue();
213214
if (fieldName.equals("enabled")) {
214215
builder.enabled(nodeBooleanValue(fieldNode));
@@ -222,7 +223,7 @@ private JsonSourceFieldMapper.Builder parseSourceField(ObjectNode sourceNode, Js
222223
JsonSourceFieldMapper.Builder builder = source();
223224
for (Iterator<Map.Entry<String, JsonNode>> fieldsIt = sourceNode.getFields(); fieldsIt.hasNext();) {
224225
Map.Entry<String, JsonNode> entry = fieldsIt.next();
225-
String fieldName = entry.getKey();
226+
String fieldName = Strings.toUnderscoreCase(entry.getKey());
226227
JsonNode fieldNode = entry.getValue();
227228
if (fieldName.equals("enabled")) {
228229
builder.enabled(nodeBooleanValue(fieldNode));

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.elasticsearch.index.analysis.NumericFloatAnalyzer;
3131
import org.elasticsearch.index.mapper.MapperParsingException;
3232
import org.elasticsearch.util.Numbers;
33+
import org.elasticsearch.util.Strings;
3334
import org.elasticsearch.util.json.JsonBuilder;
3435

3536
import java.io.IOException;
@@ -80,9 +81,9 @@ public static class TypeParser implements JsonTypeParser {
8081
parseNumberField(builder, name, floatNode, parserContext);
8182
for (Iterator<Map.Entry<String, JsonNode>> propsIt = floatNode.getFields(); propsIt.hasNext();) {
8283
Map.Entry<String, JsonNode> entry = propsIt.next();
83-
String propName = entry.getKey();
84+
String propName = Strings.toUnderscoreCase(entry.getKey());
8485
JsonNode propNode = entry.getValue();
85-
if (propName.equals("nullValue") || propName.equals("null_value")) {
86+
if (propName.equals("null_value")) {
8687
builder.nullValue(nodeFloatValue(propNode));
8788
}
8889
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.elasticsearch.index.analysis.NumericIntegerAnalyzer;
3131
import org.elasticsearch.index.mapper.MapperParsingException;
3232
import org.elasticsearch.util.Numbers;
33+
import org.elasticsearch.util.Strings;
3334
import org.elasticsearch.util.json.JsonBuilder;
3435

3536
import java.io.IOException;
@@ -80,9 +81,9 @@ public static class TypeParser implements JsonTypeParser {
8081
parseNumberField(builder, name, integerNode, parserContext);
8182
for (Iterator<Map.Entry<String, JsonNode>> propsIt = integerNode.getFields(); propsIt.hasNext();) {
8283
Map.Entry<String, JsonNode> entry = propsIt.next();
83-
String propName = entry.getKey();
84+
String propName = Strings.toUnderscoreCase(entry.getKey());
8485
JsonNode propNode = entry.getValue();
85-
if (propName.equals("nullValue")) {
86+
if (propName.equals("null_value")) {
8687
builder.nullValue(nodeIntegerValue(propNode));
8788
}
8889
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.elasticsearch.index.analysis.NumericLongAnalyzer;
3131
import org.elasticsearch.index.mapper.MapperParsingException;
3232
import org.elasticsearch.util.Numbers;
33+
import org.elasticsearch.util.Strings;
3334
import org.elasticsearch.util.json.JsonBuilder;
3435

3536
import java.io.IOException;
@@ -80,9 +81,9 @@ public static class TypeParser implements JsonTypeParser {
8081
parseNumberField(builder, name, longNode, parserContext);
8182
for (Iterator<Map.Entry<String, JsonNode>> propsIt = longNode.getFields(); propsIt.hasNext();) {
8283
Map.Entry<String, JsonNode> entry = propsIt.next();
83-
String propName = entry.getKey();
84+
String propName = Strings.toUnderscoreCase(entry.getKey());
8485
JsonNode propNode = entry.getValue();
85-
if (propName.equals("nullValue")) {
86+
if (propName.equals("null_value")) {
8687
builder.nullValue(nodeLongValue(propNode));
8788
}
8889
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.elasticsearch.index.mapper.FieldMapperListener;
2727
import org.elasticsearch.index.mapper.MapperParsingException;
2828
import org.elasticsearch.index.mapper.MergeMappingException;
29+
import org.elasticsearch.util.Strings;
2930
import org.elasticsearch.util.json.JsonBuilder;
3031

3132
import java.io.IOException;
@@ -106,7 +107,7 @@ public static class TypeParser implements JsonTypeParser {
106107
JsonMultiFieldMapper.Builder builder = multiField(name);
107108
for (Iterator<Map.Entry<String, JsonNode>> fieldsIt = multiFieldNode.getFields(); fieldsIt.hasNext();) {
108109
Map.Entry<String, JsonNode> entry = fieldsIt.next();
109-
String fieldName = entry.getKey();
110+
String fieldName = Strings.toUnderscoreCase(entry.getKey());
110111
JsonNode fieldNode = entry.getValue();
111112
if (fieldName.equals("path")) {
112113
builder.pathType(parsePathType(name, fieldNode.getValueAsText()));

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.codehaus.jackson.node.ObjectNode;
2828
import org.elasticsearch.ElasticSearchIllegalStateException;
2929
import org.elasticsearch.index.mapper.*;
30+
import org.elasticsearch.util.Strings;
3031
import org.elasticsearch.util.concurrent.ThreadSafe;
3132
import org.elasticsearch.util.joda.FormatDateTimeFormatter;
3233
import org.elasticsearch.util.json.JsonBuilder;
@@ -160,7 +161,7 @@ public static class TypeParser implements JsonTypeParser {
160161
JsonObjectMapper.Builder builder = object(name);
161162
for (Iterator<Entry<String, JsonNode>> fieldsIt = objectNode.getFields(); fieldsIt.hasNext();) {
162163
Map.Entry<String, JsonNode> entry = fieldsIt.next();
163-
String fieldName = entry.getKey();
164+
String fieldName = Strings.toUnderscoreCase(entry.getKey());
164165
JsonNode fieldNode = entry.getValue();
165166
if (fieldName.equals("dynamic")) {
166167
builder.dynamic(nodeBooleanValue(fieldNode));
@@ -169,7 +170,7 @@ public static class TypeParser implements JsonTypeParser {
169170
if (!type.equals("object")) {
170171
throw new MapperParsingException("Trying to parse an object but has a different type [" + type + "] for [" + name + "]");
171172
}
172-
} else if (fieldName.equals("dateFormats") || fieldName.equals("date_formats")) {
173+
} else if (fieldName.equals("date_formats")) {
173174
List<FormatDateTimeFormatter> dateTimeFormatters = newArrayList();
174175
if (fieldNode.isArray()) {
175176
for (JsonNode node1 : (ArrayNode) fieldNode) {
@@ -191,7 +192,7 @@ public static class TypeParser implements JsonTypeParser {
191192
builder.pathType(parsePathType(name, fieldNode.getValueAsText()));
192193
} else if (fieldName.equals("properties")) {
193194
parseProperties(builder, (ObjectNode) fieldNode, parserContext);
194-
} else if (fieldName.equals("includeInAll") || fieldName.equals("include_in_all")) {
195+
} else if (fieldName.equals("include_in_all")) {
195196
builder.includeInAll(nodeBooleanValue(fieldNode));
196197
}
197198
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.elasticsearch.index.analysis.NumericIntegerAnalyzer;
3131
import org.elasticsearch.index.mapper.MapperParsingException;
3232
import org.elasticsearch.util.Numbers;
33+
import org.elasticsearch.util.Strings;
3334
import org.elasticsearch.util.json.JsonBuilder;
3435

3536
import java.io.IOException;
@@ -80,9 +81,9 @@ public static class TypeParser implements JsonTypeParser {
8081
parseNumberField(builder, name, shortNode, parserContext);
8182
for (Iterator<Map.Entry<String, JsonNode>> propsIt = shortNode.getFields(); propsIt.hasNext();) {
8283
Map.Entry<String, JsonNode> entry = propsIt.next();
83-
String propName = entry.getKey();
84+
String propName = Strings.toUnderscoreCase(entry.getKey());
8485
JsonNode propNode = entry.getValue();
85-
if (propName.equals("nullValue") || propName.equals("null_value")) {
86+
if (propName.equals("null_value")) {
8687
builder.nullValue(nodeShortValue(propNode));
8788
}
8889
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.codehaus.jackson.node.ObjectNode;
2727
import org.elasticsearch.index.analysis.NamedAnalyzer;
2828
import org.elasticsearch.index.mapper.MapperParsingException;
29+
import org.elasticsearch.util.Strings;
2930
import org.elasticsearch.util.json.JsonBuilder;
3031

3132
import java.io.IOException;
@@ -82,9 +83,9 @@ public static class TypeParser implements JsonTypeParser {
8283
parseJsonField(builder, name, stringNode, parserContext);
8384
for (Iterator<Map.Entry<String, JsonNode>> propsIt = stringNode.getFields(); propsIt.hasNext();) {
8485
Map.Entry<String, JsonNode> entry = propsIt.next();
85-
String propName = entry.getKey();
86+
String propName = Strings.toUnderscoreCase(entry.getKey());
8687
JsonNode propNode = entry.getValue();
87-
if (propName.equals("nullValue")) {
88+
if (propName.equals("null_value")) {
8889
builder.nullValue(propNode.getValueAsText());
8990
}
9091
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.codehaus.jackson.node.ObjectNode;
2525
import org.elasticsearch.index.analysis.AnalysisService;
2626
import org.elasticsearch.index.mapper.MapperParsingException;
27+
import org.elasticsearch.util.Strings;
2728

2829
/**
2930
* @author kimchy (shay.banon)
@@ -53,7 +54,7 @@ public ObjectNode rootNode() {
5354
}
5455

5556
public JsonTypeParser typeParser(String type) {
56-
return typeParsers.get(type);
57+
return typeParsers.get(Strings.toUnderscoreCase(type));
5758
}
5859
}
5960

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

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.codehaus.jackson.JsonNode;
2424
import org.codehaus.jackson.node.ObjectNode;
2525
import org.elasticsearch.index.mapper.MapperParsingException;
26+
import org.elasticsearch.util.Strings;
2627
import org.elasticsearch.util.joda.FormatDateTimeFormatter;
2728
import org.elasticsearch.util.joda.Joda;
2829

@@ -40,9 +41,9 @@ public static void parseNumberField(JsonNumberFieldMapper.Builder builder, Strin
4041
parseJsonField(builder, name, numberNode, parserContext);
4142
for (Iterator<Map.Entry<String, JsonNode>> propsIt = numberNode.getFields(); propsIt.hasNext();) {
4243
Map.Entry<String, JsonNode> entry = propsIt.next();
43-
String propName = entry.getKey();
44+
String propName = Strings.toUnderscoreCase(entry.getKey());
4445
JsonNode propNode = entry.getValue();
45-
if (propName.equals("precisionStep") || propName.equals("precision_step")) {
46+
if (propName.equals("precision_step")) {
4647
builder.precisionStep(nodeIntegerValue(propNode));
4748
}
4849
}
@@ -51,30 +52,30 @@ public static void parseNumberField(JsonNumberFieldMapper.Builder builder, Strin
5152
public static void parseJsonField(JsonFieldMapper.Builder builder, String name, ObjectNode fieldNode, JsonTypeParser.ParserContext parserContext) {
5253
for (Iterator<Map.Entry<String, JsonNode>> propsIt = fieldNode.getFields(); propsIt.hasNext();) {
5354
Map.Entry<String, JsonNode> entry = propsIt.next();
54-
String propName = entry.getKey();
55+
String propName = Strings.toUnderscoreCase(entry.getKey());
5556
JsonNode propNode = entry.getValue();
56-
if (propName.equals("indexName") || propName.equals("index_name")) {
57+
if (propName.equals("index_name")) {
5758
builder.indexName(propNode.getTextValue());
5859
} else if (propName.equals("store")) {
5960
builder.store(parseStore(name, propNode.getTextValue()));
6061
} else if (propName.equals("index")) {
6162
builder.index(parseIndex(name, propNode.getTextValue()));
62-
} else if (propName.equals("termVector") || propName.equals("term_vector")) {
63+
} else if (propName.equals("term_vector")) {
6364
builder.termVector(parseTermVector(name, propNode.getTextValue()));
6465
} else if (propName.equals("boost")) {
6566
builder.boost(nodeFloatValue(propNode));
66-
} else if (propName.equals("omitNorms") || propName.equals("omit_norms")) {
67+
} else if (propName.equals("omit_norms")) {
6768
builder.omitNorms(nodeBooleanValue(propNode));
68-
} else if (propName.equals("omitTermFreqAndPositions") || propName.equals("omit_term_freq_and_positions")) {
69+
} else if (propName.equals("omit_term_freq_and_positions")) {
6970
builder.omitTermFreqAndPositions(nodeBooleanValue(propNode));
70-
} else if (propName.equals("indexAnalyzer") || propName.equals("index_analyzer")) {
71+
} else if (propName.equals("index_analyzer")) {
7172
builder.indexAnalyzer(parserContext.analysisService().analyzer(propNode.getTextValue()));
72-
} else if (propName.equals("searchAnalyzer") || propName.equals("search_analyzer")) {
73+
} else if (propName.equals("search_analyzer")) {
7374
builder.searchAnalyzer(parserContext.analysisService().analyzer(propNode.getTextValue()));
7475
} else if (propName.equals("analyzer")) {
7576
builder.indexAnalyzer(parserContext.analysisService().analyzer(propNode.getTextValue()));
7677
builder.searchAnalyzer(parserContext.analysisService().analyzer(propNode.getTextValue()));
77-
} else if (propName.equals("includeInAll") || propName.equals("include_in_all")) {
78+
} else if (propName.equals("include_in_all")) {
7879
builder.includeInAll(nodeBooleanValue(propNode));
7980
}
8081
}
@@ -90,6 +91,7 @@ public static FormatDateTimeFormatter parseDateTimeFormatter(String fieldName, J
9091
}
9192

9293
public static Field.TermVector parseTermVector(String fieldName, String termVector) throws MapperParsingException {
94+
termVector = Strings.toUnderscoreCase(termVector);
9395
if ("no".equals(termVector)) {
9496
return Field.TermVector.NO;
9597
} else if ("yes".equals(termVector)) {
@@ -106,6 +108,7 @@ public static Field.TermVector parseTermVector(String fieldName, String termVect
106108
}
107109

108110
public static Field.Index parseIndex(String fieldName, String index) throws MapperParsingException {
111+
index = Strings.toUnderscoreCase(index);
109112
if ("no".equals(index)) {
110113
return Field.Index.NO;
111114
} else if ("not_analyzed".equals(index)) {
@@ -128,7 +131,8 @@ public static Field.Store parseStore(String fieldName, String store) throws Mapp
128131
}
129132

130133
public static JsonPath.Type parsePathType(String name, String path) throws MapperParsingException {
131-
if ("justName".equals(path) || "just_name".equals(path)) {
134+
path = Strings.toUnderscoreCase(path);
135+
if ("just_name".equals(path)) {
132136
return JsonPath.Type.JUST_NAME;
133137
} else if ("full".equals(path)) {
134138
return JsonPath.Type.FULL;

0 commit comments

Comments
 (0)