dynamic tempaltes are now named (change to the mapping definition) to allow for simpler merging

This commit is contained in:
kimchy 2010-10-14 12:56:50 +02:00
parent ad01f19db8
commit 8d533e8a99
4 changed files with 65 additions and 38 deletions

View File

@ -47,6 +47,23 @@ public class DynamicTemplate {
}
}
public static DynamicTemplate parse(String name, Map<String, Object> conf) throws MapperParsingException {
if (!conf.containsKey("match")) {
throw new MapperParsingException("template must have match set");
}
String match = conf.get("match").toString();
String unmatch = conf.containsKey("unmatch") ? conf.get("unmatch").toString() : null;
String matchMappingType = conf.containsKey("match_mapping_type") ? conf.get("match_mapping_type").toString() : null;
if (!conf.containsKey("mapping")) {
throw new MapperParsingException("template must have mapping set");
}
Map<String, Object> mapping = (Map<String, Object>) conf.get("mapping");
String matchType = conf.containsKey("match_pattern") ? conf.get("match_pattern").toString() : "simple";
return new DynamicTemplate(name, conf, match, unmatch, matchMappingType, MatchType.fromString(matchType), mapping);
}
private final String name;
private final Map<String, Object> conf;
private final String match;
@ -59,22 +76,8 @@ public class DynamicTemplate {
private final Map<String, Object> mapping;
public static DynamicTemplate parse(Map<String, Object> conf) throws MapperParsingException {
if (!conf.containsKey("match")) {
throw new MapperParsingException("template must have match set");
}
String match = conf.get("match").toString();
String unmatch = conf.containsKey("unmatch") ? conf.get("unmatch").toString() : null;
String matchMappingType = conf.containsKey("match_mapping_type") ? conf.get("match_mapping_type").toString() : null;
if (!conf.containsKey("mapping")) {
throw new MapperParsingException("template must have mapping set");
}
Map<String, Object> mapping = (Map<String, Object>) conf.get("mapping");
String matchType = conf.containsKey("match_pattern") ? conf.get("match_pattern").toString() : "simple";
return new DynamicTemplate(conf, match, unmatch, matchMappingType, MatchType.fromString(matchType), mapping);
}
public DynamicTemplate(Map<String, Object> conf, String match, String unmatch, String matchMappingType, MatchType matchType, Map<String, Object> mapping) {
public DynamicTemplate(String name, Map<String, Object> conf, String match, String unmatch, String matchMappingType, MatchType matchType, Map<String, Object> mapping) {
this.name = name;
this.conf = conf;
this.match = match;
this.unmatch = unmatch;
@ -83,6 +86,10 @@ public class DynamicTemplate {
this.mapping = mapping;
}
public String name() {
return this.name;
}
public Map<String, Object> conf() {
return this.conf;
}

View File

@ -22,6 +22,7 @@ package org.elasticsearch.index.mapper.xcontent;
import org.elasticsearch.common.collect.Lists;
import org.elasticsearch.common.joda.FormatDateTimeFormatter;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.index.mapper.MapperParsingException;
import java.io.IOException;
import java.util.Arrays;
@ -72,15 +73,21 @@ public class RootObjectMapper extends ObjectMapper {
if (fieldName.equals("dynamic_templates")) {
// "dynamic_templates" : [
// {
// "template_1" : {
// "match" : "*_test",
// "match_mapping_type" : "string",
// "mapping" : { "type" : "string", "store" : "yes" }
// }
// }
// ]
List tmplNodes = (List) fieldNode;
for (Object tmplNode : tmplNodes) {
Map<String, Object> tmpl = (Map<String, Object>) tmplNode;
((Builder) builder).add(DynamicTemplate.parse(tmpl));
if (tmpl.size() != 1) {
throw new MapperParsingException("A dynamic template must be defined with a name");
}
Map.Entry<String, Object> entry = tmpl.entrySet().iterator().next();
((Builder) builder).add(DynamicTemplate.parse(entry.getKey(), (Map<String, Object>) entry.getValue()));
}
}
}
@ -118,11 +125,15 @@ public class RootObjectMapper extends ObjectMapper {
// merge them
List<DynamicTemplate> mergedTemplates = Lists.newArrayList(Arrays.asList(this.dynamicTemplates));
for (DynamicTemplate template : mergeWithObject.dynamicTemplates) {
int index = mergedTemplates.indexOf(template);
if (index == -1) {
boolean replaced = false;
for (int i = 0; i < mergedTemplates.size(); i++) {
if (mergedTemplates.get(i).name().equals(template.name())) {
mergedTemplates.set(i, template);
replaced = true;
}
}
if (!replaced) {
mergedTemplates.add(template);
} else {
mergedTemplates.set(index, template);
}
}
this.dynamicTemplates = mergedTemplates.toArray(new DynamicTemplate[mergedTemplates.size()]);
@ -133,7 +144,10 @@ public class RootObjectMapper extends ObjectMapper {
if (dynamicTemplates != null && dynamicTemplates.length > 0) {
builder.startArray("dynamic_templates");
for (DynamicTemplate dynamicTemplate : dynamicTemplates) {
builder.startObject();
builder.field(dynamicTemplate.name());
builder.map(dynamicTemplate.conf());
builder.endObject();
}
builder.endArray();
}

View File

@ -2,11 +2,13 @@
"person" : {
"dynamic_templates" : [
{
"template_1" : {
"match" : "*",
"mapping" : {
"store" : "yes"
}
}
}
]
}
}

View File

@ -2,6 +2,7 @@
"person" : {
"dynamic_templates" : [
{
"tempalte_1" : {
"match" : "multi*",
"mapping" : {
"type" : "multi_field",
@ -10,8 +11,10 @@
"org" : {"type": "{dynamic_type}", "index" : "not_analyzed", "store" : "yes"}
}
}
}
},
{
"template_2" : {
"match" : "*",
"match_mapping_type" : "string",
"mapping" : {
@ -19,6 +22,7 @@
"index" : "not_analyzed"
}
}
}
]
}
}