From a9e2433dab3ced5de25b8483d56cf293f110d38e Mon Sep 17 00:00:00 2001 From: Shay Banon Date: Sun, 20 May 2012 21:35:07 +0200 Subject: [PATCH] Mapping: Using _default_ mapping _routing mapping definition fails to apply when introducing type through indexing, closes #1967. --- .../action/bulk/TransportBulkAction.java | 4 +-- .../action/bulk/TransportShardBulkAction.java | 2 +- .../action/delete/TransportDeleteAction.java | 2 +- .../action/index/TransportIndexAction.java | 4 +-- .../cluster/metadata/IndexMetaData.java | 26 +++++++++++++++++++ .../cluster/metadata/MappingMetaData.java | 12 +++++++++ 6 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/elasticsearch/action/bulk/TransportBulkAction.java b/src/main/java/org/elasticsearch/action/bulk/TransportBulkAction.java index c95f9506847..548d30f9535 100644 --- a/src/main/java/org/elasticsearch/action/bulk/TransportBulkAction.java +++ b/src/main/java/org/elasticsearch/action/bulk/TransportBulkAction.java @@ -150,7 +150,7 @@ public class TransportBulkAction extends TransportAction() { diff --git a/src/main/java/org/elasticsearch/action/index/TransportIndexAction.java b/src/main/java/org/elasticsearch/action/index/TransportIndexAction.java index fa1e4af6acb..cd9e6d48280 100644 --- a/src/main/java/org/elasticsearch/action/index/TransportIndexAction.java +++ b/src/main/java/org/elasticsearch/action/index/TransportIndexAction.java @@ -125,7 +125,7 @@ public class TransportIndexAction extends TransportShardReplicationOperationActi request.index(metaData.concreteIndex(request.index())); MappingMetaData mappingMd = null; if (metaData.hasIndex(request.index())) { - mappingMd = metaData.index(request.index()).mapping(request.type()); + mappingMd = metaData.index(request.index()).mappingOrDefault(request.type()); } request.process(metaData, aliasOrIndex, mappingMd, allowIdGeneration); return true; @@ -186,7 +186,7 @@ public class TransportIndexAction extends TransportShardReplicationOperationActi final IndexRequest request = shardRequest.request; // validate, if routing is required, that we got routing - MappingMetaData mappingMd = clusterState.metaData().index(request.index()).mapping(request.type()); + MappingMetaData mappingMd = clusterState.metaData().index(request.index()).mappingOrDefault(request.type()); if (mappingMd != null && mappingMd.routing().required()) { if (request.routing() == null) { throw new RoutingMissingException(request.index(), request.type(), request.id()); diff --git a/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java b/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java index 37806228cb4..a81a1fbbc62 100644 --- a/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java +++ b/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java @@ -40,6 +40,7 @@ import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.rest.RestStatus; import org.elasticsearch.search.warmer.IndexWarmersMetaData; @@ -301,10 +302,27 @@ public class IndexMetaData { return mappings(); } + @Nullable public MappingMetaData mapping(String mappingType) { return mappings.get(mappingType); } + /** + * Sometimes, the default mapping exists and an actual mapping is not created yet (introduced), + * in this case, we want to return the default mapping in case it has some default mapping definitions. + *

+ * Note, once the mapping type is introduced, the default mapping is applied on the actual typed MappingMetaData, + * setting its routing, timestamp, and so on if needed. + */ + @Nullable + public MappingMetaData mappingOrDefault(String mappingType) { + MappingMetaData mapping = mappings.get(mappingType); + if (mapping != null) { + return mapping; + } + return mappings.get(MapperService.DEFAULT_MAPPING); + } + public ImmutableMap customs() { return this.customs; } @@ -503,6 +521,14 @@ public class IndexMetaData { tmpSettings = ImmutableSettings.settingsBuilder().put(settings).putArray("index.aliases").build(); } + // update default mapping on the MappingMetaData + if (mappings.containsKey(MapperService.DEFAULT_MAPPING)) { + MappingMetaData defaultMapping = mappings.get(MapperService.DEFAULT_MAPPING); + for (MappingMetaData mappingMetaData : mappings.map().values()) { + mappingMetaData.updateDefaultMapping(defaultMapping); + } + } + return new IndexMetaData(index, version, state, tmpSettings, mappings.immutableMap(), tmpAliases.immutableMap(), customs.immutableMap()); } diff --git a/src/main/java/org/elasticsearch/cluster/metadata/MappingMetaData.java b/src/main/java/org/elasticsearch/cluster/metadata/MappingMetaData.java index b8d7e26ccc7..df4e68807d4 100644 --- a/src/main/java/org/elasticsearch/cluster/metadata/MappingMetaData.java +++ b/src/main/java/org/elasticsearch/cluster/metadata/MappingMetaData.java @@ -351,6 +351,18 @@ public class MappingMetaData { this.timestamp = timestamp; } + void updateDefaultMapping(MappingMetaData defaultMapping) { + if (id == Id.EMPTY) { + id = defaultMapping.id(); + } + if (routing == Routing.EMPTY) { + routing = defaultMapping.routing(); + } + if (timestamp == Timestamp.EMPTY) { + timestamp = defaultMapping.timestamp(); + } + } + public String type() { return this.type; }