Allow to disable automatic date detection, closes #1051.

This commit is contained in:
kimchy 2011-07-10 23:24:23 +03:00
parent 882ccf32c8
commit b17c2b09db
3 changed files with 52 additions and 14 deletions

View File

@ -591,6 +591,7 @@ public class ObjectMapper implements Mapper, AllFieldMapper.IncludeInAll {
// check if it fits one of the date formats // check if it fits one of the date formats
boolean resolved = false; boolean resolved = false;
// a safe check since "1" gets parsed as well // a safe check since "1" gets parsed as well
if (context.root().dateDetection()) {
if (text.contains(":") || text.contains("-") || text.contains("/")) { if (text.contains(":") || text.contains("-") || text.contains("/")) {
for (FormatDateTimeFormatter dateTimeFormatter : context.root().dateTimeFormatters()) { for (FormatDateTimeFormatter dateTimeFormatter : context.root().dateTimeFormatters()) {
try { try {
@ -607,6 +608,7 @@ public class ObjectMapper implements Mapper, AllFieldMapper.IncludeInAll {
} }
} }
} }
}
// DON'T do automatic ip detection logic, since it messes up with docs that have hosts and ips // DON'T do automatic ip detection logic, since it messes up with docs that have hosts and ips
// check if its an ip // check if its an ip
// if (!resolved && text.indexOf('.') != -1) { // if (!resolved && text.indexOf('.') != -1) {

View File

@ -50,6 +50,7 @@ public class RootObjectMapper extends ObjectMapper {
DateFieldMapper.Defaults.DATE_TIME_FORMATTER, DateFieldMapper.Defaults.DATE_TIME_FORMATTER,
Joda.forPattern("yyyy/MM/dd HH:mm:ss||yyyy/MM/dd") Joda.forPattern("yyyy/MM/dd HH:mm:ss||yyyy/MM/dd")
}; };
public static final boolean DATE_DETECTION = false;
} }
public static class Builder extends ObjectMapper.Builder<Builder, RootObjectMapper> { public static class Builder extends ObjectMapper.Builder<Builder, RootObjectMapper> {
@ -58,6 +59,8 @@ public class RootObjectMapper extends ObjectMapper {
protected List<FormatDateTimeFormatter> dateTimeFormatters = newArrayList(); protected List<FormatDateTimeFormatter> dateTimeFormatters = newArrayList();
protected boolean dateDetection = Defaults.DATE_DETECTION;
public Builder(String name) { public Builder(String name) {
super(name); super(name);
this.builder = this; this.builder = this;
@ -115,7 +118,8 @@ public class RootObjectMapper extends ObjectMapper {
} }
return new RootObjectMapper(name, enabled, dynamic, pathType, mappers, return new RootObjectMapper(name, enabled, dynamic, pathType, mappers,
dates, dates,
dynamicTemplates.toArray(new DynamicTemplate[dynamicTemplates.size()])); dynamicTemplates.toArray(new DynamicTemplate[dynamicTemplates.size()]),
dateDetection);
} }
} }
@ -161,19 +165,28 @@ public class RootObjectMapper extends ObjectMapper {
Map.Entry<String, Object> entry = tmpl.entrySet().iterator().next(); Map.Entry<String, Object> entry = tmpl.entrySet().iterator().next();
((Builder) builder).add(DynamicTemplate.parse(entry.getKey(), (Map<String, Object>) entry.getValue())); ((Builder) builder).add(DynamicTemplate.parse(entry.getKey(), (Map<String, Object>) entry.getValue()));
} }
} else if (fieldName.equals("date_detection")) {
} }
} }
} }
private final FormatDateTimeFormatter[] dateTimeFormatters; private final FormatDateTimeFormatter[] dateTimeFormatters;
private final boolean dateDetection;
private volatile DynamicTemplate dynamicTemplates[]; private volatile DynamicTemplate dynamicTemplates[];
RootObjectMapper(String name, boolean enabled, Dynamic dynamic, ContentPath.Type pathType, Map<String, Mapper> mappers, RootObjectMapper(String name, boolean enabled, Dynamic dynamic, ContentPath.Type pathType, Map<String, Mapper> mappers,
FormatDateTimeFormatter[] dateTimeFormatters, DynamicTemplate dynamicTemplates[]) { FormatDateTimeFormatter[] dateTimeFormatters, DynamicTemplate dynamicTemplates[], boolean dateDetection) {
super(name, name, enabled, Nested.NO, dynamic, pathType, mappers); super(name, name, enabled, Nested.NO, dynamic, pathType, mappers);
this.dynamicTemplates = dynamicTemplates; this.dynamicTemplates = dynamicTemplates;
this.dateTimeFormatters = dateTimeFormatters; this.dateTimeFormatters = dateTimeFormatters;
this.dateDetection = dateDetection;
}
public boolean dateDetection() {
return this.dateDetection;
} }
public FormatDateTimeFormatter[] dateTimeFormatters() { public FormatDateTimeFormatter[] dateTimeFormatters() {
@ -240,5 +253,9 @@ public class RootObjectMapper extends ObjectMapper {
} }
builder.endArray(); builder.endArray();
} }
if (dateDetection != Defaults.DATE_DETECTION) {
builder.field("date_detection", Defaults.DATE_DETECTION);
}
} }
} }

View File

@ -47,4 +47,23 @@ public class SimpleDateMappingTests {
assertThat(doc.masterDoc().getFieldable("date_field").tokenStreamValue(), notNullValue()); assertThat(doc.masterDoc().getFieldable("date_field").tokenStreamValue(), notNullValue());
} }
@Test public void testDateDetection() throws Exception {
String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
.field("date_detection", false)
.startObject("properties").startObject("date_field").field("type", "date").endObject().endObject()
.endObject().endObject().string();
DocumentMapper defaultMapper = MapperTests.newParser().parse(mapping);
ParsedDocument doc = defaultMapper.parse("type", "1", XContentFactory.jsonBuilder()
.startObject()
.field("date_field", "2010-01-01")
.field("date_field_x", "2010-01-01")
.endObject()
.copiedBytes());
assertThat(doc.masterDoc().get("date_field"), nullValue());
assertThat(doc.masterDoc().get("date_field_x"), equalTo("2010-01-01"));
}
} }