@Override protected GetFieldMappingsResponse shardOperation( final GetFieldMappingsIndexRequest request, ShardId shardId) { assert shardId != null; IndexService indexService = indicesService.indexServiceSafe(shardId.getIndex()); Collection<String> typeIntersection; if (request.types().length == 0) { typeIntersection = indexService.mapperService().types(); } else { typeIntersection = indexService .mapperService() .types() .stream() .filter(type -> Regex.simpleMatch(request.types(), type)) .collect(Collectors.toCollection(ArrayList::new)); if (typeIntersection.isEmpty()) { throw new TypeMissingException(shardId.getIndex(), request.types()); } } MapBuilder<String, Map<String, FieldMappingMetaData>> typeMappings = new MapBuilder<>(); for (String type : typeIntersection) { DocumentMapper documentMapper = indexService.mapperService().documentMapper(type); Map<String, FieldMappingMetaData> fieldMapping = findFieldMappingsByType(documentMapper, request); if (!fieldMapping.isEmpty()) { typeMappings.put(type, fieldMapping); } } return new GetFieldMappingsResponse( singletonMap(shardId.getIndexName(), typeMappings.immutableMap())); }
@Override protected GetFieldMappingsResponse shardOperation( final GetFieldMappingsIndexRequest request, ShardId shardId) throws ElasticsearchException { assert shardId != null; IndexService indexService = indicesService.indexServiceSafe(shardId.getIndex()); Collection<String> typeIntersection; if (request.types().length == 0) { typeIntersection = indexService.mapperService().types(); } else { typeIntersection = Collections2.filter( indexService.mapperService().types(), new Predicate<String>() { @Override public boolean apply(String type) { return Regex.simpleMatch(request.types(), type); } }); if (typeIntersection.isEmpty()) { throw new TypeMissingException(shardId.index(), request.types()); } } MapBuilder<String, ImmutableMap<String, FieldMappingMetaData>> typeMappings = new MapBuilder<>(); for (String type : typeIntersection) { DocumentMapper documentMapper = indexService.mapperService().documentMapper(type); ImmutableMap<String, FieldMappingMetaData> fieldMapping = findFieldMappingsByType(documentMapper, request); if (!fieldMapping.isEmpty()) { typeMappings.put(type, fieldMapping); } } return new GetFieldMappingsResponse( ImmutableMap.of(shardId.getIndex(), typeMappings.immutableMap())); }
private Map<String, FieldMappingMetaData> findFieldMappingsByType( DocumentMapper documentMapper, GetFieldMappingsIndexRequest request) { MapBuilder<String, FieldMappingMetaData> fieldMappings = new MapBuilder<>(); final DocumentFieldMappers allFieldMappers = documentMapper.mappers(); for (String field : request.fields()) { if (Regex.isMatchAllPattern(field)) { for (FieldMapper fieldMapper : allFieldMappers) { addFieldMapper( fieldMapper.fieldType().name(), fieldMapper, fieldMappings, request.includeDefaults()); } } else if (Regex.isSimpleMatchPattern(field)) { // go through the field mappers 3 times, to make sure we give preference to the resolve // order: full name, index name, name. // also make sure we only store each mapper once. Collection<FieldMapper> remainingFieldMappers = newLinkedList(allFieldMappers); for (Iterator<FieldMapper> it = remainingFieldMappers.iterator(); it.hasNext(); ) { final FieldMapper fieldMapper = it.next(); if (Regex.simpleMatch(field, fieldMapper.fieldType().name())) { addFieldMapper( fieldMapper.fieldType().name(), fieldMapper, fieldMappings, request.includeDefaults()); it.remove(); } } for (Iterator<FieldMapper> it = remainingFieldMappers.iterator(); it.hasNext(); ) { final FieldMapper fieldMapper = it.next(); if (Regex.simpleMatch(field, fieldMapper.fieldType().name())) { addFieldMapper( fieldMapper.fieldType().name(), fieldMapper, fieldMappings, request.includeDefaults()); it.remove(); } } } else { // not a pattern FieldMapper fieldMapper = allFieldMappers.smartNameFieldMapper(field); if (fieldMapper != null) { addFieldMapper(field, fieldMapper, fieldMappings, request.includeDefaults()); } else if (request.probablySingleFieldRequest()) { fieldMappings.put(field, FieldMappingMetaData.NULL); } } } return fieldMappings.immutableMap(); }
@Override protected ShardsIterator shards(ClusterState state, GetFieldMappingsIndexRequest request) { // Will balance requests between shards return state.routingTable().index(request.index()).randomAllActiveShardsIt(); }
private ImmutableMap<String, FieldMappingMetaData> findFieldMappingsByType( DocumentMapper documentMapper, GetFieldMappingsIndexRequest request) throws ElasticsearchException { MapBuilder<String, FieldMappingMetaData> fieldMappings = new MapBuilder<>(); final List<FieldMapper> allFieldMappers = documentMapper.mappers().mappers(); for (String field : request.fields()) { if (Regex.isMatchAllPattern(field)) { for (FieldMapper fieldMapper : allFieldMappers) { addFieldMapper( fieldMapper.names().fullName(), fieldMapper, fieldMappings, request.includeDefaults()); } } else if (Regex.isSimpleMatchPattern(field)) { // go through the field mappers 3 times, to make sure we give preference to the resolve // order: full name, index name, name. // also make sure we only store each mapper once. boolean[] resolved = new boolean[allFieldMappers.size()]; for (int i = 0; i < allFieldMappers.size(); i++) { FieldMapper fieldMapper = allFieldMappers.get(i); if (Regex.simpleMatch(field, fieldMapper.names().fullName())) { addFieldMapper( fieldMapper.names().fullName(), fieldMapper, fieldMappings, request.includeDefaults()); resolved[i] = true; } } for (int i = 0; i < allFieldMappers.size(); i++) { if (resolved[i]) { continue; } FieldMapper fieldMapper = allFieldMappers.get(i); if (Regex.simpleMatch(field, fieldMapper.names().indexName())) { addFieldMapper( fieldMapper.names().indexName(), fieldMapper, fieldMappings, request.includeDefaults()); resolved[i] = true; } } for (int i = 0; i < allFieldMappers.size(); i++) { if (resolved[i]) { continue; } FieldMapper fieldMapper = allFieldMappers.get(i); if (Regex.simpleMatch(field, fieldMapper.names().name())) { addFieldMapper( fieldMapper.names().name(), fieldMapper, fieldMappings, request.includeDefaults()); resolved[i] = true; } } } else { // not a pattern FieldMapper fieldMapper = documentMapper.mappers().smartNameFieldMapper(field); if (fieldMapper != null) { addFieldMapper(field, fieldMapper, fieldMappings, request.includeDefaults()); } else if (request.probablySingleFieldRequest()) { fieldMappings.put(field, FieldMappingMetaData.NULL); } } } return fieldMappings.immutableMap(); }
@Override protected ClusterBlockException checkRequestBlock( ClusterState state, GetFieldMappingsIndexRequest request) { return state.blocks().indexBlockedException(ClusterBlockLevel.READ, request.index()); }