From cff0ec39726a3b0d16d2157d991ed082451bddb2 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Thu, 8 Jan 2015 09:08:14 -0800 Subject: [PATCH] Mappings: Remove type level default analyzers closes #8874 --- dev-tools/create-bwc-index.py | 54 ++++-- .../elasticsearch/index/engine/Engine.java | 34 ++-- .../index/mapper/DocumentFieldMappers.java | 7 +- .../index/mapper/DocumentMapper.java | 80 +-------- .../index/mapper/DocumentMapperParser.java | 43 +---- .../index/mapper/MapperService.java | 6 - .../elasticsearch/index/shard/IndexShard.java | 4 +- .../engine/internal/InternalEngineTests.java | 163 +++++++++--------- .../mapper/all/SimpleAllMapperTests.java | 3 - .../mapper/date/SimpleDateMappingTests.java | 10 +- .../mapper/lucene/DoubleIndexingDocTest.java | 4 +- .../lucene/StoredNumericValuesTest.java | 2 +- .../index/mapper/size/SizeMappingTests.java | 4 +- .../timestamp/TimestampMappingTests.java | 2 +- .../index/mapper/ttl/TTLMappingTests.java | 2 +- .../elasticsearch/bwcompat/index-1.4.2.zip | Bin 30430 -> 40533 bytes .../org/elasticsearch/bwcompat/repo-1.4.2.zip | Bin 14402 -> 36410 bytes 17 files changed, 157 insertions(+), 261 deletions(-) diff --git a/dev-tools/create-bwc-index.py b/dev-tools/create-bwc-index.py index 5fc218a9ff4bf..a8f2b5b25a4b5 100644 --- a/dev-tools/create-bwc-index.py +++ b/dev-tools/create-bwc-index.py @@ -131,16 +131,32 @@ def create_client(http_port, timeout=30): time.sleep(1) assert False, 'Timed out waiting for node for %s seconds' % timeout -def generate_index(client): +def generate_index(client, version): client.indices.delete(index='test', ignore=404) num_shards = random.randint(1, 10) num_replicas = random.randint(0, 1) logging.info('Create single shard test index') + + mappings = {} + if not version.startswith('2.'): + # TODO: we need better "before/onOr/after" logic in python + + # backcompat test for legacy type level analyzer settings, see #8874 + mappings['analyzer_type1'] = { + 'analyzer': 'standard', + } + mappings['analyzer_type2'] = { + 'index_analyzer': 'standard', + 'search_analyzer': 'keyword', + 'search_quote_analyzer': 'english', + } + client.indices.create(index='test', body={ 'settings': { 'number_of_shards': 1, 'number_of_replicas': 0 - } + }, + 'mappings': mappings }) health = client.cluster.health(wait_for_status='green', wait_for_relocating_shards=0) assert health['timed_out'] == False, 'cluster health timed out %s' % health @@ -152,32 +168,32 @@ def generate_index(client): def snapshot_index(client, cfg): # Add bogus persistent settings to make sure they can be restored - client.cluster.put_settings(body = { + client.cluster.put_settings(body={ 'persistent': { - 'cluster.routing.allocation.exclude.version_attr' : cfg.version + 'cluster.routing.allocation.exclude.version_attr': cfg.version } }) - client.indices.put_template(name = 'template_' + cfg.version.lower(), order = 0, body = { - "template" : "te*", - "settings" : { + client.indices.put_template(name='template_' + cfg.version.lower(), order=0, body={ + "template": "te*", + "settings": { "number_of_shards" : 1 }, - "mappings" : { - "type1" : { - "_source" : { "enabled" : False } + "mappings": { + "type1": { + "_source": { "enabled" : False } } }, - "aliases" : { - "alias1" : {}, - "alias2" : { - "filter" : { - "term" : {"version" : cfg.version } + "aliases": { + "alias1": {}, + "alias2": { + "filter": { + "term": {"version" : cfg.version } }, - "routing" : "kimchy" + "routing": "kimchy" }, - "{index}-alias" : {} + "{index}-alias": {} } - }); + }) client.snapshot.create_repository(repository='test_repo', body={ 'type': 'fs', 'settings': { @@ -243,7 +259,7 @@ def main(): try: node = start_node(cfg.version, cfg.release_dir, cfg.data_dir, cfg.tcp_port, cfg.http_port) client = create_client(cfg.http_port) - generate_index(client) + generate_index(client, cfg.version) if cfg.snapshot_supported: snapshot_index(client, cfg) finally: diff --git a/src/main/java/org/elasticsearch/index/engine/Engine.java b/src/main/java/org/elasticsearch/index/engine/Engine.java index ef0bad5ca34c4..340effd5e24d4 100644 --- a/src/main/java/org/elasticsearch/index/engine/Engine.java +++ b/src/main/java/org/elasticsearch/index/engine/Engine.java @@ -286,6 +286,7 @@ static enum Origin { static abstract class IndexingOperation implements Operation { private final DocumentMapper docMapper; + private final Analyzer analyzer; private final Term uid; private final ParsedDocument doc; private long version; @@ -296,8 +297,9 @@ static abstract class IndexingOperation implements Operation { private final long startTime; private long endTime; - public IndexingOperation(DocumentMapper docMapper, Term uid, ParsedDocument doc, long version, VersionType versionType, Origin origin, long startTime, boolean canHaveDuplicates) { + public IndexingOperation(DocumentMapper docMapper, Analyzer analyzer, Term uid, ParsedDocument doc, long version, VersionType versionType, Origin origin, long startTime, boolean canHaveDuplicates) { this.docMapper = docMapper; + this.analyzer = analyzer; this.uid = uid; this.doc = doc; this.version = version; @@ -307,8 +309,8 @@ public IndexingOperation(DocumentMapper docMapper, Term uid, ParsedDocument doc, this.canHaveDuplicates = canHaveDuplicates; } - public IndexingOperation(DocumentMapper docMapper, Term uid, ParsedDocument doc) { - this(docMapper, uid, doc, Versions.MATCH_ANY, VersionType.INTERNAL, Origin.PRIMARY, System.nanoTime(), true); + public IndexingOperation(DocumentMapper docMapper, Analyzer analyzer, Term uid, ParsedDocument doc) { + this(docMapper, analyzer, uid, doc, Versions.MATCH_ANY, VersionType.INTERNAL, Origin.PRIMARY, System.nanoTime(), true); } public DocumentMapper docMapper() { @@ -374,7 +376,7 @@ public List docs() { } public Analyzer analyzer() { - return docMapper.mappers().indexAnalyzer(); + return this.analyzer; } public BytesReference source() { @@ -403,17 +405,17 @@ public long endTime() { static final class Create extends IndexingOperation { private final boolean autoGeneratedId; - public Create(DocumentMapper docMapper, Term uid, ParsedDocument doc, long version, VersionType versionType, Origin origin, long startTime, boolean canHaveDuplicates, boolean autoGeneratedId) { - super(docMapper, uid, doc, version, versionType, origin, startTime, canHaveDuplicates); + public Create(DocumentMapper docMapper, Analyzer analyzer, Term uid, ParsedDocument doc, long version, VersionType versionType, Origin origin, long startTime, boolean canHaveDuplicates, boolean autoGeneratedId) { + super(docMapper, analyzer, uid, doc, version, versionType, origin, startTime, canHaveDuplicates); this.autoGeneratedId = autoGeneratedId; } - public Create(DocumentMapper docMapper, Term uid, ParsedDocument doc, long version, VersionType versionType, Origin origin, long startTime) { - this(docMapper, uid, doc, version, versionType, origin, startTime, true, false); + public Create(DocumentMapper docMapper, Analyzer analyzer, Term uid, ParsedDocument doc, long version, VersionType versionType, Origin origin, long startTime) { + this(docMapper, analyzer, uid, doc, version, versionType, origin, startTime, true, false); } - public Create(DocumentMapper docMapper, Term uid, ParsedDocument doc) { - super(docMapper, uid, doc); + public Create(DocumentMapper docMapper,Analyzer analyzer, Term uid, ParsedDocument doc) { + super(docMapper, analyzer, uid, doc); autoGeneratedId = false; } @@ -431,16 +433,16 @@ public boolean autoGeneratedId() { static final class Index extends IndexingOperation { private boolean created; - public Index(DocumentMapper docMapper, Term uid, ParsedDocument doc, long version, VersionType versionType, Origin origin, long startTime, boolean canHaveDuplicates) { - super(docMapper, uid, doc, version, versionType, origin, startTime, canHaveDuplicates); + public Index(DocumentMapper docMapper, Analyzer analyzer, Term uid, ParsedDocument doc, long version, VersionType versionType, Origin origin, long startTime, boolean canHaveDuplicates) { + super(docMapper, analyzer, uid, doc, version, versionType, origin, startTime, canHaveDuplicates); } - public Index(DocumentMapper docMapper, Term uid, ParsedDocument doc, long version, VersionType versionType, Origin origin, long startTime) { - super(docMapper, uid, doc, version, versionType, origin, startTime, true); + public Index(DocumentMapper docMapper, Analyzer analyzer, Term uid, ParsedDocument doc, long version, VersionType versionType, Origin origin, long startTime) { + super(docMapper, analyzer, uid, doc, version, versionType, origin, startTime, true); } - public Index(DocumentMapper docMapper, Term uid, ParsedDocument doc) { - super(docMapper, uid, doc); + public Index(DocumentMapper docMapper, Analyzer analyzer, Term uid, ParsedDocument doc) { + super(docMapper, analyzer, uid, doc); } @Override diff --git a/src/main/java/org/elasticsearch/index/mapper/DocumentFieldMappers.java b/src/main/java/org/elasticsearch/index/mapper/DocumentFieldMappers.java index a65485f54600f..b265ecebd1e78 100644 --- a/src/main/java/org/elasticsearch/index/mapper/DocumentFieldMappers.java +++ b/src/main/java/org/elasticsearch/index/mapper/DocumentFieldMappers.java @@ -24,6 +24,7 @@ import com.google.common.collect.ForwardingSet; import com.google.common.collect.Maps; import org.apache.lucene.analysis.Analyzer; +import org.elasticsearch.index.analysis.AnalysisService; import org.elasticsearch.index.analysis.FieldNameAnalyzer; import java.util.Collection; @@ -42,8 +43,10 @@ public final class DocumentFieldMappers extends ForwardingSet> { private final FieldNameAnalyzer searchAnalyzer; private final FieldNameAnalyzer searchQuoteAnalyzer; - public DocumentFieldMappers(DocumentMapper docMapper) { - this(new FieldMappersLookup(), new FieldNameAnalyzer(docMapper.indexAnalyzer()), new FieldNameAnalyzer(docMapper.searchAnalyzer()), new FieldNameAnalyzer(docMapper.searchQuotedAnalyzer())); + public DocumentFieldMappers(AnalysisService analysisService) { + this(new FieldMappersLookup(), new FieldNameAnalyzer(analysisService.defaultIndexAnalyzer()), + new FieldNameAnalyzer(analysisService.defaultSearchAnalyzer()), + new FieldNameAnalyzer(analysisService.defaultSearchQuoteAnalyzer())); } private DocumentFieldMappers(FieldMappersLookup fieldMappers, FieldNameAnalyzer indexAnalyzer, FieldNameAnalyzer searchAnalyzer, FieldNameAnalyzer searchQuoteAnalyzer) { diff --git a/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java b/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java index 39a5feb13f041..119e1d0a2a96a 100644 --- a/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java +++ b/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java @@ -166,12 +166,6 @@ public static class Builder { private Map, RootMapper> rootMappers = new LinkedHashMap<>(); - private NamedAnalyzer indexAnalyzer; - - private NamedAnalyzer searchAnalyzer; - - private NamedAnalyzer searchQuoteAnalyzer; - private List sourceTransforms; private final String index; @@ -228,36 +222,6 @@ public Builder put(RootMapper.Builder mapper) { return this; } - public Builder indexAnalyzer(NamedAnalyzer indexAnalyzer) { - this.indexAnalyzer = indexAnalyzer; - return this; - } - - public boolean hasIndexAnalyzer() { - return indexAnalyzer != null; - } - - public Builder searchAnalyzer(NamedAnalyzer searchAnalyzer) { - this.searchAnalyzer = searchAnalyzer; - if (this.searchQuoteAnalyzer == null) { - this.searchQuoteAnalyzer = searchAnalyzer; - } - return this; - } - - public Builder searchQuoteAnalyzer(NamedAnalyzer searchQuoteAnalyzer) { - this.searchQuoteAnalyzer = searchQuoteAnalyzer; - return this; - } - - public boolean hasSearchAnalyzer() { - return searchAnalyzer != null; - } - - public boolean hasSearchQuoteAnalyzer() { - return searchQuoteAnalyzer != null; - } - public Builder transform(ScriptService scriptService, String script, ScriptType scriptType, String language, Map parameters) { if (sourceTransforms == null) { sourceTransforms = new ArrayList<>(); @@ -268,8 +232,7 @@ public Builder transform(ScriptService scriptService, String script, ScriptType public DocumentMapper build(DocumentMapperParser docMapperParser) { Preconditions.checkNotNull(rootObjectMapper, "Mapper builder must have the root object mapper set"); - return new DocumentMapper(index, indexSettings, docMapperParser, rootObjectMapper, meta, - indexAnalyzer, searchAnalyzer, searchQuoteAnalyzer, rootMappers, sourceTransforms); + return new DocumentMapper(index, indexSettings, docMapperParser, rootObjectMapper, meta, rootMappers, sourceTransforms); } } @@ -300,11 +263,6 @@ protected ParseContext.InternalParseContext initialValue() { private final RootMapper[] rootMappersOrdered; private final RootMapper[] rootMappersNotIncludedInObject; - private final NamedAnalyzer indexAnalyzer; - - private final NamedAnalyzer searchAnalyzer; - private final NamedAnalyzer searchQuoteAnalyzer; - private volatile DocumentFieldMappers fieldMappers; private volatile ImmutableMap objectMappers = ImmutableMap.of(); @@ -324,7 +282,6 @@ protected ParseContext.InternalParseContext initialValue() { public DocumentMapper(String index, @Nullable Settings indexSettings, DocumentMapperParser docMapperParser, RootObjectMapper rootObjectMapper, ImmutableMap meta, - NamedAnalyzer indexAnalyzer, NamedAnalyzer searchAnalyzer, NamedAnalyzer searchQuoteAnalyzer, Map, RootMapper> rootMappers, List sourceTransforms) { this.index = index; this.indexSettings = indexSettings; @@ -345,10 +302,6 @@ public DocumentMapper(String index, @Nullable Settings indexSettings, DocumentMa } this.rootMappersNotIncludedInObject = rootMappersNotIncludedInObjectLst.toArray(new RootMapper[rootMappersNotIncludedInObjectLst.size()]); - this.indexAnalyzer = indexAnalyzer; - this.searchAnalyzer = searchAnalyzer; - this.searchQuoteAnalyzer = searchQuoteAnalyzer != null ? searchQuoteAnalyzer : searchAnalyzer; - this.typeFilter = typeMapper().termFilter(type, null); if (rootMapper(ParentFieldMapper.class).active()) { @@ -370,7 +323,7 @@ public DocumentMapper(String index, @Nullable Settings indexSettings, DocumentMa // now traverse and get all the statically defined ones rootObjectMapper.traverse(fieldMappersAgg); - this.fieldMappers = new DocumentFieldMappers(this).copyAndAllAll(fieldMappersAgg.mappers); + this.fieldMappers = new DocumentFieldMappers(docMapperParser.analysisService).copyAndAllAll(fieldMappersAgg.mappers); final Map objectMappers = Maps.newHashMap(); rootObjectMapper.traverse(new ObjectMapperListener() { @@ -470,18 +423,6 @@ public BoostFieldMapper boostFieldMapper() { return rootMapper(BoostFieldMapper.class); } - public Analyzer indexAnalyzer() { - return this.indexAnalyzer; - } - - public Analyzer searchAnalyzer() { - return this.searchAnalyzer; - } - - public Analyzer searchQuotedAnalyzer() { - return this.searchQuoteAnalyzer; - } - public Filter typeFilter() { return this.typeFilter; } @@ -765,23 +706,6 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws rootObjectMapper.toXContent(builder, params, new ToXContent() { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - if (indexAnalyzer != null && searchAnalyzer != null && indexAnalyzer.name().equals(searchAnalyzer.name()) && !indexAnalyzer.name().startsWith("_")) { - if (!indexAnalyzer.name().equals("default")) { - // same analyzers, output it once - builder.field("analyzer", indexAnalyzer.name()); - } - } else { - if (indexAnalyzer != null && !indexAnalyzer.name().startsWith("_")) { - if (!indexAnalyzer.name().equals("default")) { - builder.field("index_analyzer", indexAnalyzer.name()); - } - } - if (searchAnalyzer != null && !searchAnalyzer.name().startsWith("_")) { - if (!searchAnalyzer.name().equals("default")) { - builder.field("search_analyzer", searchAnalyzer.name()); - } - } - } if (sourceTransforms != null) { if (sourceTransforms.size() == 1) { builder.field("transform"); diff --git a/src/main/java/org/elasticsearch/index/mapper/DocumentMapperParser.java b/src/main/java/org/elasticsearch/index/mapper/DocumentMapperParser.java index a105e0aca2ee7..3e7b4b7d4c86b 100644 --- a/src/main/java/org/elasticsearch/index/mapper/DocumentMapperParser.java +++ b/src/main/java/org/elasticsearch/index/mapper/DocumentMapperParser.java @@ -79,6 +79,8 @@ import org.elasticsearch.script.ScriptService; import org.elasticsearch.script.ScriptService.ScriptType; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -244,36 +246,7 @@ private DocumentMapper parse(String type, Map mapping, String de String fieldName = Strings.toUnderscoreCase(entry.getKey()); Object fieldNode = entry.getValue(); - if ("index_analyzer".equals(fieldName)) { - iterator.remove(); - NamedAnalyzer analyzer = analysisService.analyzer(fieldNode.toString()); - if (analyzer == null) { - throw new MapperParsingException("Analyzer [" + fieldNode.toString() + "] not found for index_analyzer setting on root type [" + type + "]"); - } - docBuilder.indexAnalyzer(analyzer); - } else if ("search_analyzer".equals(fieldName)) { - iterator.remove(); - NamedAnalyzer analyzer = analysisService.analyzer(fieldNode.toString()); - if (analyzer == null) { - throw new MapperParsingException("Analyzer [" + fieldNode.toString() + "] not found for search_analyzer setting on root type [" + type + "]"); - } - docBuilder.searchAnalyzer(analyzer); - } else if ("search_quote_analyzer".equals(fieldName)) { - iterator.remove(); - NamedAnalyzer analyzer = analysisService.analyzer(fieldNode.toString()); - if (analyzer == null) { - throw new MapperParsingException("Analyzer [" + fieldNode.toString() + "] not found for search_analyzer setting on root type [" + type + "]"); - } - docBuilder.searchQuoteAnalyzer(analyzer); - } else if ("analyzer".equals(fieldName)) { - iterator.remove(); - NamedAnalyzer analyzer = analysisService.analyzer(fieldNode.toString()); - if (analyzer == null) { - throw new MapperParsingException("Analyzer [" + fieldNode.toString() + "] not found for analyzer setting on root type [" + type + "]"); - } - docBuilder.indexAnalyzer(analyzer); - docBuilder.searchAnalyzer(analyzer); - } else if ("transform".equals(fieldName)) { + if ("transform".equals(fieldName)) { iterator.remove(); if (fieldNode instanceof Map) { parseTransform(docBuilder, (Map) fieldNode, parserContext.indexVersionCreated()); @@ -307,16 +280,6 @@ private DocumentMapper parse(String type, Map mapping, String de checkNoRemainingFields(mapping, parserContext.indexVersionCreated(), "Root mapping definition has unsupported parameters: "); - if (!docBuilder.hasIndexAnalyzer()) { - docBuilder.indexAnalyzer(analysisService.defaultIndexAnalyzer()); - } - if (!docBuilder.hasSearchAnalyzer()) { - docBuilder.searchAnalyzer(analysisService.defaultSearchAnalyzer()); - } - if (!docBuilder.hasSearchQuoteAnalyzer()) { - docBuilder.searchAnalyzer(analysisService.defaultSearchQuoteAnalyzer()); - } - DocumentMapper documentMapper = docBuilder.build(this); // update the source with the generated one documentMapper.refreshSource(); diff --git a/src/main/java/org/elasticsearch/index/mapper/MapperService.java b/src/main/java/org/elasticsearch/index/mapper/MapperService.java index d25d82cf22246..6c1bd8b31ad3a 100755 --- a/src/main/java/org/elasticsearch/index/mapper/MapperService.java +++ b/src/main/java/org/elasticsearch/index/mapper/MapperService.java @@ -1040,9 +1040,6 @@ public Analyzer searchAnalyzer() { return analyzer; } } - if (docMapper != null && docMapper.searchAnalyzer() != null) { - return docMapper.searchAnalyzer(); - } return mapperService.searchAnalyzer(); } @@ -1053,9 +1050,6 @@ public Analyzer searchQuoteAnalyzer() { return analyzer; } } - if (docMapper != null && docMapper.searchQuotedAnalyzer() != null) { - return docMapper.searchQuotedAnalyzer(); - } return mapperService.searchQuoteAnalyzer(); } } diff --git a/src/main/java/org/elasticsearch/index/shard/IndexShard.java b/src/main/java/org/elasticsearch/index/shard/IndexShard.java index 256ca8225bbb6..79c5ecbf7708b 100644 --- a/src/main/java/org/elasticsearch/index/shard/IndexShard.java +++ b/src/main/java/org/elasticsearch/index/shard/IndexShard.java @@ -400,7 +400,7 @@ public Engine.Create prepareCreate(SourceToParse source, long version, VersionTy long startTime = System.nanoTime(); Tuple docMapper = mapperService.documentMapperWithAutoCreate(source.type()); ParsedDocument doc = docMapper.v1().parse(source).setMappingsModified(docMapper); - return new Engine.Create(docMapper.v1(), docMapper.v1().uidMapper().term(doc.uid().stringValue()), doc, version, versionType, origin, startTime, state != IndexShardState.STARTED || canHaveDuplicates, autoGeneratedId); + return new Engine.Create(docMapper.v1(), docMapper.v1().mappers().indexAnalyzer(), docMapper.v1().uidMapper().term(doc.uid().stringValue()), doc, version, versionType, origin, startTime, state != IndexShardState.STARTED || canHaveDuplicates, autoGeneratedId); } public ParsedDocument create(Engine.Create create) throws ElasticsearchException { @@ -424,7 +424,7 @@ public Engine.Index prepareIndex(SourceToParse source, long version, VersionType long startTime = System.nanoTime(); Tuple docMapper = mapperService.documentMapperWithAutoCreate(source.type()); ParsedDocument doc = docMapper.v1().parse(source).setMappingsModified(docMapper); - return new Engine.Index(docMapper.v1(), docMapper.v1().uidMapper().term(doc.uid().stringValue()), doc, version, versionType, origin, startTime, state != IndexShardState.STARTED || canHaveDuplicates); + return new Engine.Index(docMapper.v1(), docMapper.v1().mappers().indexAnalyzer(), docMapper.v1().uidMapper().term(doc.uid().stringValue()), doc, version, versionType, origin, startTime, state != IndexShardState.STARTED || canHaveDuplicates); } public ParsedDocument index(Engine.Index index) throws ElasticsearchException { diff --git a/src/test/java/org/elasticsearch/index/engine/internal/InternalEngineTests.java b/src/test/java/org/elasticsearch/index/engine/internal/InternalEngineTests.java index 0dd590cec5620..266794cf4c74f 100644 --- a/src/test/java/org/elasticsearch/index/engine/internal/InternalEngineTests.java +++ b/src/test/java/org/elasticsearch/index/engine/internal/InternalEngineTests.java @@ -101,10 +101,7 @@ public class InternalEngineTests extends ElasticsearchLuceneTestCase { protected final ShardId shardId = new ShardId(new Index("index"), 1); - protected final DocumentMapper fakeType = new DocumentMapper.Builder("type", - ImmutableSettings.settingsBuilder().put("index.version.created", Version.CURRENT).build(), - new RootObjectMapper.Builder("")). - indexAnalyzer(Lucene.STANDARD_ANALYZER).build(null); + protected final Analyzer analyzer = Lucene.STANDARD_ANALYZER; protected ThreadPool threadPool; @@ -256,10 +253,10 @@ public void testSegments() throws Exception { // create a doc and refresh ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocumentWithTextField(), B_1, false); - engine.create(new Engine.Create(fakeType, newUid("1"), doc)); + engine.create(new Engine.Create(null, analyzer, newUid("1"), doc)); ParsedDocument doc2 = testParsedDocument("2", "2", "test", null, -1, -1, testDocumentWithTextField(), B_2, false); - engine.create(new Engine.Create(fakeType, newUid("2"), doc2)); + engine.create(new Engine.Create(null, analyzer, newUid("2"), doc2)); engine.refresh("test", false); segments = engine.segments(false); @@ -292,7 +289,7 @@ public void testSegments() throws Exception { engineSettingsService.refreshSettings(ImmutableSettings.builder().put(EngineConfig.INDEX_COMPOUND_ON_FLUSH, false).build()); ParsedDocument doc3 = testParsedDocument("3", "3", "test", null, -1, -1, testDocumentWithTextField(), B_3, false); - engine.create(new Engine.Create(fakeType, newUid("3"), doc3)); + engine.create(new Engine.Create(null, analyzer, newUid("3"), doc3)); engine.refresh("test", false); segments = engine.segments(false); @@ -339,7 +336,7 @@ public void testSegments() throws Exception { engineSettingsService.refreshSettings(ImmutableSettings.builder().put(EngineConfig.INDEX_COMPOUND_ON_FLUSH, true).build()); ParsedDocument doc4 = testParsedDocument("4", "4", "test", null, -1, -1, testDocumentWithTextField(), B_3, false); - engine.create(new Engine.Create(fakeType, newUid("4"), doc4)); + engine.create(new Engine.Create(null, analyzer, newUid("4"), doc4)); engine.refresh("test", false); segments = engine.segments(false); @@ -370,7 +367,7 @@ public void testVerboseSegments() throws Exception { assertThat(segments.isEmpty(), equalTo(true)); ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocumentWithTextField(), B_1, false); - engine.create(new Engine.Create(fakeType, newUid("1"), doc)); + engine.create(new Engine.Create(null, analyzer, newUid("1"), doc)); engine.refresh("test", false); segments = engine.segments(true); @@ -378,10 +375,10 @@ public void testVerboseSegments() throws Exception { assertThat(segments.get(0).ramTree, notNullValue()); ParsedDocument doc2 = testParsedDocument("2", "2", "test", null, -1, -1, testDocumentWithTextField(), B_2, false); - engine.create(new Engine.Create(fakeType, newUid("2"), doc2)); + engine.create(new Engine.Create(null, analyzer, newUid("2"), doc2)); engine.refresh("test", false); ParsedDocument doc3 = testParsedDocument("3", "3", "test", null, -1, -1, testDocumentWithTextField(), B_3, false); - engine.create(new Engine.Create(fakeType, newUid("3"), doc3)); + engine.create(new Engine.Create(null, analyzer, newUid("3"), doc3)); engine.refresh("test", false); segments = engine.segments(true); @@ -421,11 +418,11 @@ public void afterMerge(OnGoingMerge merge) { final Engine engine = createEngine(engineSettingsService, store, createTranslog(), mergeSchedulerProvider); ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Index index = new Engine.Index(fakeType, newUid("1"), doc); + Engine.Index index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); assertThat(engine.segments(false).size(), equalTo(1)); - index = new Engine.Index(fakeType, newUid("2"), doc); + index = new Engine.Index(null, analyzer, newUid("2"), doc); engine.index(index); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); List segments = engine.segments(false); @@ -433,7 +430,7 @@ public void afterMerge(OnGoingMerge merge) { for (Segment segment : segments) { assertThat(segment.getMergeId(), nullValue()); } - index = new Engine.Index(fakeType, newUid("3"), doc); + index = new Engine.Index(null, analyzer, newUid("3"), doc); engine.index(index); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); segments = engine.segments(false); @@ -453,7 +450,7 @@ public void afterMerge(OnGoingMerge merge) { waitForMerge.get().countDown(); - index = new Engine.Index(fakeType, newUid("4"), doc); + index = new Engine.Index(null, analyzer, newUid("4"), doc); engine.index(index); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); final long gen1 = store.readLastCommittedSegmentsInfo().getGeneration(); @@ -503,7 +500,7 @@ public void testSimpleOperations() throws Exception { Document document = testDocumentWithTextField(); document.add(new Field(SourceFieldMapper.NAME, B_1.toBytes(), SourceFieldMapper.Defaults.FIELD_TYPE)); ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, document, B_1, false); - engine.create(new Engine.Create(fakeType, newUid("1"), doc)); + engine.create(new Engine.Create(null, analyzer, newUid("1"), doc)); // its not there... searchResult = engine.acquireSearcher("test"); @@ -542,7 +539,7 @@ public void testSimpleOperations() throws Exception { document.add(new TextField("value", "test1", Field.Store.YES)); document.add(new Field(SourceFieldMapper.NAME, B_2.toBytes(), SourceFieldMapper.Defaults.FIELD_TYPE)); doc = testParsedDocument("1", "1", "test", null, -1, -1, document, B_2, false); - engine.index(new Engine.Index(fakeType, newUid("1"), doc)); + engine.index(new Engine.Index(null, analyzer, newUid("1"), doc)); // its not updated yet... searchResult = engine.acquireSearcher("test"); @@ -595,7 +592,7 @@ public void testSimpleOperations() throws Exception { document = testDocumentWithTextField(); document.add(new Field(SourceFieldMapper.NAME, B_1.toBytes(), SourceFieldMapper.Defaults.FIELD_TYPE)); doc = testParsedDocument("1", "1", "test", null, -1, -1, document, B_1, false); - engine.create(new Engine.Create(fakeType, newUid("1"), doc)); + engine.create(new Engine.Create(null, analyzer, newUid("1"), doc)); // its not there... searchResult = engine.acquireSearcher("test"); @@ -629,7 +626,7 @@ public void testSimpleOperations() throws Exception { document = testDocument(); document.add(new TextField("value", "test1", Field.Store.YES)); doc = testParsedDocument("1", "1", "test", null, -1, -1, document, B_1, false); - engine.index(new Engine.Index(fakeType, newUid("1"), doc)); + engine.index(new Engine.Index(null, analyzer, newUid("1"), doc)); // its not updated yet... searchResult = engine.acquireSearcher("test"); @@ -658,7 +655,7 @@ public void testSearchResultRelease() throws Exception { // create a document ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocumentWithTextField(), B_1, false); - engine.create(new Engine.Create(fakeType, newUid("1"), doc)); + engine.create(new Engine.Create(null, analyzer, newUid("1"), doc)); // its not there... searchResult = engine.acquireSearcher("test"); @@ -691,7 +688,7 @@ public void testSearchResultRelease() throws Exception { @Test public void testFailEngineOnCorruption() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocumentWithTextField(), B_1, false); - engine.create(new Engine.Create(fakeType, newUid("1"), doc)); + engine.create(new Engine.Create(null, analyzer, newUid("1"), doc)); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); final boolean failEngine = defaultSettings.getAsBoolean(EngineConfig.INDEX_FAIL_ON_CORRUPTION_SETTING, false); final int failInPhase = randomIntBetween(1, 3); @@ -729,7 +726,7 @@ public void phase3(Translog.Snapshot snapshot) throws EngineException { searchResult.close(); ParsedDocument doc2 = testParsedDocument("2", "2", "test", null, -1, -1, testDocumentWithTextField(), B_2, false); - engine.create(new Engine.Create(fakeType, newUid("2"), doc2)); + engine.create(new Engine.Create(null, analyzer, newUid("2"), doc2)); engine.refresh("foo", false); searchResult = engine.acquireSearcher("test"); @@ -746,7 +743,7 @@ public void phase3(Translog.Snapshot snapshot) throws EngineException { @Test public void testSimpleRecover() throws Exception { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocumentWithTextField(), B_1, false); - engine.create(new Engine.Create(fakeType, newUid("1"), doc)); + engine.create(new Engine.Create(null, analyzer, newUid("1"), doc)); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); engine.recover(new Engine.RecoveryHandler() { @@ -791,10 +788,10 @@ public void phase3(Translog.Snapshot snapshot) throws EngineException { @Test public void testRecoverWithOperationsBetweenPhase1AndPhase2() throws Exception { ParsedDocument doc1 = testParsedDocument("1", "1", "test", null, -1, -1, testDocumentWithTextField(), B_1, false); - engine.create(new Engine.Create(fakeType, newUid("1"), doc1)); + engine.create(new Engine.Create(null, analyzer, newUid("1"), doc1)); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); ParsedDocument doc2 = testParsedDocument("2", "2", "test", null, -1, -1, testDocumentWithTextField(), B_2, false); - engine.create(new Engine.Create(fakeType, newUid("2"), doc2)); + engine.create(new Engine.Create(null, analyzer, newUid("2"), doc2)); engine.recover(new Engine.RecoveryHandler() { @Override @@ -822,10 +819,10 @@ public void phase3(Translog.Snapshot snapshot) throws EngineException { @Test public void testRecoverWithOperationsBetweenPhase1AndPhase2AndPhase3() throws Exception { ParsedDocument doc1 = testParsedDocument("1", "1", "test", null, -1, -1, testDocumentWithTextField(), B_1, false); - engine.create(new Engine.Create(fakeType, newUid("1"), doc1)); + engine.create(new Engine.Create(null, analyzer, newUid("1"), doc1)); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); ParsedDocument doc2 = testParsedDocument("2", "2", "test", null, -1, -1, testDocumentWithTextField(), B_2, false); - engine.create(new Engine.Create(fakeType, newUid("2"), doc2)); + engine.create(new Engine.Create(null, analyzer, newUid("2"), doc2)); engine.recover(new Engine.RecoveryHandler() { @Override @@ -841,7 +838,7 @@ public void phase2(Translog.Snapshot snapshot) throws EngineException { // add for phase3 ParsedDocument doc3 = testParsedDocument("3", "3", "test", null, -1, -1, testDocumentWithTextField(), B_3, false); - engine.create(new Engine.Create(fakeType, newUid("3"), doc3)); + engine.create(new Engine.Create(null, analyzer, newUid("3"), doc3)); } @Override @@ -860,11 +857,11 @@ public void phase3(Translog.Snapshot snapshot) throws EngineException { @Test public void testVersioningNewCreate() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Create create = new Engine.Create(fakeType, newUid("1"), doc); + Engine.Create create = new Engine.Create(null, analyzer, newUid("1"), doc); engine.create(create); assertThat(create.version(), equalTo(1l)); - create = new Engine.Create(fakeType, newUid("1"), doc, create.version(), create.versionType().versionTypeForReplicationAndRecovery(), REPLICA, 0); + create = new Engine.Create(null, analyzer, newUid("1"), doc, create.version(), create.versionType().versionTypeForReplicationAndRecovery(), REPLICA, 0); replicaEngine.create(create); assertThat(create.version(), equalTo(1l)); } @@ -872,11 +869,11 @@ public void testVersioningNewCreate() { @Test public void testExternalVersioningNewCreate() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Create create = new Engine.Create(fakeType, newUid("1"), doc, 12, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, 0); + Engine.Create create = new Engine.Create(null, analyzer, newUid("1"), doc, 12, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, 0); engine.create(create); assertThat(create.version(), equalTo(12l)); - create = new Engine.Create(fakeType, newUid("1"), doc, create.version(), create.versionType().versionTypeForReplicationAndRecovery(), REPLICA, 0); + create = new Engine.Create(null, analyzer, newUid("1"), doc, create.version(), create.versionType().versionTypeForReplicationAndRecovery(), REPLICA, 0); replicaEngine.create(create); assertThat(create.version(), equalTo(12l)); } @@ -884,11 +881,11 @@ public void testExternalVersioningNewCreate() { @Test public void testVersioningNewIndex() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Index index = new Engine.Index(fakeType, newUid("1"), doc); + Engine.Index index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertThat(index.version(), equalTo(1l)); - index = new Engine.Index(fakeType, newUid("1"), doc, index.version(), index.versionType().versionTypeForReplicationAndRecovery(), REPLICA, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, index.version(), index.versionType().versionTypeForReplicationAndRecovery(), REPLICA, 0); replicaEngine.index(index); assertThat(index.version(), equalTo(1l)); } @@ -896,11 +893,11 @@ public void testVersioningNewIndex() { @Test public void testExternalVersioningNewIndex() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Index index = new Engine.Index(fakeType, newUid("1"), doc, 12, VersionType.EXTERNAL, PRIMARY, 0); + Engine.Index index = new Engine.Index(null, analyzer, newUid("1"), doc, 12, VersionType.EXTERNAL, PRIMARY, 0); engine.index(index); assertThat(index.version(), equalTo(12l)); - index = new Engine.Index(fakeType, newUid("1"), doc, index.version(), index.versionType().versionTypeForReplicationAndRecovery(), REPLICA, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, index.version(), index.versionType().versionTypeForReplicationAndRecovery(), REPLICA, 0); replicaEngine.index(index); assertThat(index.version(), equalTo(12l)); } @@ -908,15 +905,15 @@ public void testExternalVersioningNewIndex() { @Test public void testVersioningIndexConflict() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Index index = new Engine.Index(fakeType, newUid("1"), doc); + Engine.Index index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertThat(index.version(), equalTo(1l)); - index = new Engine.Index(fakeType, newUid("1"), doc); + index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertThat(index.version(), equalTo(2l)); - index = new Engine.Index(fakeType, newUid("1"), doc, 1l, VersionType.INTERNAL, Engine.Operation.Origin.PRIMARY, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, 1l, VersionType.INTERNAL, Engine.Operation.Origin.PRIMARY, 0); try { engine.index(index); fail(); @@ -925,7 +922,7 @@ public void testVersioningIndexConflict() { } // future versions should not work as well - index = new Engine.Index(fakeType, newUid("1"), doc, 3l, VersionType.INTERNAL, PRIMARY, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, 3l, VersionType.INTERNAL, PRIMARY, 0); try { engine.index(index); fail(); @@ -937,15 +934,15 @@ public void testVersioningIndexConflict() { @Test public void testExternalVersioningIndexConflict() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Index index = new Engine.Index(fakeType, newUid("1"), doc, 12, VersionType.EXTERNAL, PRIMARY, 0); + Engine.Index index = new Engine.Index(null, analyzer, newUid("1"), doc, 12, VersionType.EXTERNAL, PRIMARY, 0); engine.index(index); assertThat(index.version(), equalTo(12l)); - index = new Engine.Index(fakeType, newUid("1"), doc, 14, VersionType.EXTERNAL, PRIMARY, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, 14, VersionType.EXTERNAL, PRIMARY, 0); engine.index(index); assertThat(index.version(), equalTo(14l)); - index = new Engine.Index(fakeType, newUid("1"), doc, 13, VersionType.EXTERNAL, PRIMARY, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, 13, VersionType.EXTERNAL, PRIMARY, 0); try { engine.index(index); fail(); @@ -957,17 +954,17 @@ public void testExternalVersioningIndexConflict() { @Test public void testVersioningIndexConflictWithFlush() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Index index = new Engine.Index(fakeType, newUid("1"), doc); + Engine.Index index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertThat(index.version(), equalTo(1l)); - index = new Engine.Index(fakeType, newUid("1"), doc); + index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertThat(index.version(), equalTo(2l)); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); - index = new Engine.Index(fakeType, newUid("1"), doc, 1l, VersionType.INTERNAL, PRIMARY, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, 1l, VersionType.INTERNAL, PRIMARY, 0); try { engine.index(index); fail(); @@ -976,7 +973,7 @@ public void testVersioningIndexConflictWithFlush() { } // future versions should not work as well - index = new Engine.Index(fakeType, newUid("1"), doc, 3l, VersionType.INTERNAL, PRIMARY, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, 3l, VersionType.INTERNAL, PRIMARY, 0); try { engine.index(index); fail(); @@ -988,17 +985,17 @@ public void testVersioningIndexConflictWithFlush() { @Test public void testExternalVersioningIndexConflictWithFlush() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Index index = new Engine.Index(fakeType, newUid("1"), doc, 12, VersionType.EXTERNAL, PRIMARY, 0); + Engine.Index index = new Engine.Index(null, analyzer, newUid("1"), doc, 12, VersionType.EXTERNAL, PRIMARY, 0); engine.index(index); assertThat(index.version(), equalTo(12l)); - index = new Engine.Index(fakeType, newUid("1"), doc, 14, VersionType.EXTERNAL, PRIMARY, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, 14, VersionType.EXTERNAL, PRIMARY, 0); engine.index(index); assertThat(index.version(), equalTo(14l)); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); - index = new Engine.Index(fakeType, newUid("1"), doc, 13, VersionType.EXTERNAL, PRIMARY, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, 13, VersionType.EXTERNAL, PRIMARY, 0); try { engine.index(index); fail(); @@ -1010,11 +1007,11 @@ public void testExternalVersioningIndexConflictWithFlush() { @Test public void testVersioningDeleteConflict() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Index index = new Engine.Index(fakeType, newUid("1"), doc); + Engine.Index index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertThat(index.version(), equalTo(1l)); - index = new Engine.Index(fakeType, newUid("1"), doc); + index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertThat(index.version(), equalTo(2l)); @@ -1041,7 +1038,7 @@ public void testVersioningDeleteConflict() { assertThat(delete.version(), equalTo(3l)); // now check if we can index to a delete doc with version - index = new Engine.Index(fakeType, newUid("1"), doc, 2l, VersionType.INTERNAL, PRIMARY, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, 2l, VersionType.INTERNAL, PRIMARY, 0); try { engine.index(index); fail(); @@ -1050,7 +1047,7 @@ public void testVersioningDeleteConflict() { } // we shouldn't be able to create as well - Engine.Create create = new Engine.Create(fakeType, newUid("1"), doc, 2l, VersionType.INTERNAL, PRIMARY, 0); + Engine.Create create = new Engine.Create(null, analyzer, newUid("1"), doc, 2l, VersionType.INTERNAL, PRIMARY, 0); try { engine.create(create); } catch (VersionConflictEngineException e) { @@ -1061,11 +1058,11 @@ public void testVersioningDeleteConflict() { @Test public void testVersioningDeleteConflictWithFlush() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Index index = new Engine.Index(fakeType, newUid("1"), doc); + Engine.Index index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertThat(index.version(), equalTo(1l)); - index = new Engine.Index(fakeType, newUid("1"), doc); + index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertThat(index.version(), equalTo(2l)); @@ -1098,7 +1095,7 @@ public void testVersioningDeleteConflictWithFlush() { engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); // now check if we can index to a delete doc with version - index = new Engine.Index(fakeType, newUid("1"), doc, 2l, VersionType.INTERNAL, PRIMARY, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, 2l, VersionType.INTERNAL, PRIMARY, 0); try { engine.index(index); fail(); @@ -1107,7 +1104,7 @@ public void testVersioningDeleteConflictWithFlush() { } // we shouldn't be able to create as well - Engine.Create create = new Engine.Create(fakeType, newUid("1"), doc, 2l, VersionType.INTERNAL, PRIMARY, 0); + Engine.Create create = new Engine.Create(null, analyzer, newUid("1"), doc, 2l, VersionType.INTERNAL, PRIMARY, 0); try { engine.create(create); } catch (VersionConflictEngineException e) { @@ -1118,11 +1115,11 @@ public void testVersioningDeleteConflictWithFlush() { @Test public void testVersioningCreateExistsException() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Create create = new Engine.Create(fakeType, newUid("1"), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, 0); + Engine.Create create = new Engine.Create(null, analyzer, newUid("1"), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, 0); engine.create(create); assertThat(create.version(), equalTo(1l)); - create = new Engine.Create(fakeType, newUid("1"), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, 0); + create = new Engine.Create(null, analyzer, newUid("1"), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, 0); try { engine.create(create); fail(); @@ -1134,13 +1131,13 @@ public void testVersioningCreateExistsException() { @Test public void testVersioningCreateExistsExceptionWithFlush() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Create create = new Engine.Create(fakeType, newUid("1"), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, 0); + Engine.Create create = new Engine.Create(null, analyzer, newUid("1"), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, 0); engine.create(create); assertThat(create.version(), equalTo(1l)); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); - create = new Engine.Create(fakeType, newUid("1"), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, 0); + create = new Engine.Create(null, analyzer, newUid("1"), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, 0); try { engine.create(create); fail(); @@ -1152,21 +1149,21 @@ public void testVersioningCreateExistsExceptionWithFlush() { @Test public void testVersioningReplicaConflict1() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Index index = new Engine.Index(fakeType, newUid("1"), doc); + Engine.Index index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertThat(index.version(), equalTo(1l)); - index = new Engine.Index(fakeType, newUid("1"), doc); + index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertThat(index.version(), equalTo(2l)); // apply the second index to the replica, should work fine - index = new Engine.Index(fakeType, newUid("1"), doc, index.version(), VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, index.version(), VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0); replicaEngine.index(index); assertThat(index.version(), equalTo(2l)); // now, the old one should not work - index = new Engine.Index(fakeType, newUid("1"), doc, 1l, VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, 1l, VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0); try { replicaEngine.index(index); fail(); @@ -1176,7 +1173,7 @@ public void testVersioningReplicaConflict1() { // second version on replica should fail as well try { - index = new Engine.Index(fakeType, newUid("1"), doc, 2l + index = new Engine.Index(null, analyzer, newUid("1"), doc, 2l , VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0); replicaEngine.index(index); assertThat(index.version(), equalTo(2l)); @@ -1188,18 +1185,18 @@ public void testVersioningReplicaConflict1() { @Test public void testVersioningReplicaConflict2() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Index index = new Engine.Index(fakeType, newUid("1"), doc); + Engine.Index index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertThat(index.version(), equalTo(1l)); // apply the first index to the replica, should work fine - index = new Engine.Index(fakeType, newUid("1"), doc, 1l + index = new Engine.Index(null, analyzer, newUid("1"), doc, 1l , VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0); replicaEngine.index(index); assertThat(index.version(), equalTo(1l)); // index it again - index = new Engine.Index(fakeType, newUid("1"), doc); + index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertThat(index.version(), equalTo(2l)); @@ -1226,7 +1223,7 @@ public void testVersioningReplicaConflict2() { // now do the second index on the replica, it should fail try { - index = new Engine.Index(fakeType, newUid("1"), doc, 2l, VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0); + index = new Engine.Index(null, analyzer, newUid("1"), doc, 2l, VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0); replicaEngine.index(index); fail("excepted VersionConflictEngineException to be thrown"); } catch (VersionConflictEngineException e) { @@ -1238,17 +1235,17 @@ public void testVersioningReplicaConflict2() { @Test public void testBasicCreatedFlag() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Index index = new Engine.Index(fakeType, newUid("1"), doc); + Engine.Index index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertTrue(index.created()); - index = new Engine.Index(fakeType, newUid("1"), doc); + index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertFalse(index.created()); engine.delete(new Engine.Delete(null, "1", newUid("1"))); - index = new Engine.Index(fakeType, newUid("1"), doc); + index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertTrue(index.created()); } @@ -1256,7 +1253,7 @@ public void testBasicCreatedFlag() { @Test public void testCreatedFlagAfterFlush() { ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, false); - Engine.Index index = new Engine.Index(fakeType, newUid("1"), doc); + Engine.Index index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertTrue(index.created()); @@ -1264,7 +1261,7 @@ public void testCreatedFlagAfterFlush() { engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); - index = new Engine.Index(fakeType, newUid("1"), doc); + index = new Engine.Index(null, analyzer, newUid("1"), doc); engine.index(index); assertTrue(index.created()); } @@ -1312,13 +1309,13 @@ public void testIndexWriterInfoStream() { try { // First, with DEBUG, which should NOT log IndexWriter output: ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocumentWithTextField(), B_1, false); - engine.create(new Engine.Create(fakeType, newUid("1"), doc)); + engine.create(new Engine.Create(null, analyzer, newUid("1"), doc)); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); assertFalse(mockAppender.sawIndexWriterMessage); // Again, with TRACE, which should log IndexWriter output: rootLogger.setLevel(Level.TRACE); - engine.create(new Engine.Create(fakeType, newUid("2"), doc)); + engine.create(new Engine.Create(null, analyzer, newUid("2"), doc)); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); assertTrue(mockAppender.sawIndexWriterMessage); @@ -1347,14 +1344,14 @@ public void testIndexWriterIFDInfoStream() { try { // First, with DEBUG, which should NOT log IndexWriter output: ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocumentWithTextField(), B_1, false); - engine.create(new Engine.Create(fakeType, newUid("1"), doc)); + engine.create(new Engine.Create(null, analyzer, newUid("1"), doc)); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); assertFalse(mockAppender.sawIndexWriterMessage); assertFalse(mockAppender.sawIndexWriterIFDMessage); // Again, with TRACE, which should only log IndexWriter IFD output: iwIFDLogger.setLevel(Level.TRACE); - engine.create(new Engine.Create(fakeType, newUid("2"), doc)); + engine.create(new Engine.Create(null, analyzer, newUid("2"), doc)); engine.flush(Engine.FlushType.COMMIT_TRANSLOG, false, false); assertFalse(mockAppender.sawIndexWriterMessage); assertTrue(mockAppender.sawIndexWriterIFDMessage); @@ -1384,7 +1381,7 @@ public void testEnableGcDeletes() throws Exception { document.add(new TextField("value", "test1", Field.Store.YES)); ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, document, B_2, false); - engine.index(new Engine.Index(fakeType, newUid("1"), doc, 1, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime(), false)); + engine.index(new Engine.Index(null, analyzer, newUid("1"), doc, 1, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime(), false)); // Delete document we just added: engine.delete(new Engine.Delete("test", "1", newUid("1"), 10, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime(), false)); @@ -1409,7 +1406,7 @@ public void testEnableGcDeletes() throws Exception { // Try to index uid=1 with a too-old version, should fail: try { - engine.index(new Engine.Index(fakeType, newUid("1"), doc, 2, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime())); + engine.index(new Engine.Index(null, analyzer, newUid("1"), doc, 2, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime())); fail("did not hit expected exception"); } catch (VersionConflictEngineException vcee) { // expected @@ -1421,7 +1418,7 @@ public void testEnableGcDeletes() throws Exception { // Try to index uid=2 with a too-old version, should fail: try { - engine.index(new Engine.Index(fakeType, newUid("2"), doc, 2, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime())); + engine.index(new Engine.Index(null, analyzer, newUid("2"), doc, 2, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime())); fail("did not hit expected exception"); } catch (VersionConflictEngineException vcee) { // expected diff --git a/src/test/java/org/elasticsearch/index/mapper/all/SimpleAllMapperTests.java b/src/test/java/org/elasticsearch/index/mapper/all/SimpleAllMapperTests.java index 8dcda8e57d81d..6efd811763829 100644 --- a/src/test/java/org/elasticsearch/index/mapper/all/SimpleAllMapperTests.java +++ b/src/test/java/org/elasticsearch/index/mapper/all/SimpleAllMapperTests.java @@ -419,9 +419,6 @@ public void testRootMappersStillWorking() { rootTypes.put(SourceFieldMapper.NAME, "{\"enabled\" : true}"); rootTypes.put(TypeFieldMapper.NAME, "{\"store\" : true}"); rootTypes.put("include_in_all", "true"); - rootTypes.put("index_analyzer", "\"standard\""); - rootTypes.put("search_analyzer", "\"standard\""); - rootTypes.put("analyzer", "\"standard\""); rootTypes.put("dynamic_date_formats", "[\"yyyy-MM-dd\", \"dd-MM-yyyy\"]"); rootTypes.put("numeric_detection", "true"); rootTypes.put("dynamic_templates", "[]"); diff --git a/src/test/java/org/elasticsearch/index/mapper/date/SimpleDateMappingTests.java b/src/test/java/org/elasticsearch/index/mapper/date/SimpleDateMappingTests.java index bc6abd8653ffc..552bb8bf7e286 100644 --- a/src/test/java/org/elasticsearch/index/mapper/date/SimpleDateMappingTests.java +++ b/src/test/java/org/elasticsearch/index/mapper/date/SimpleDateMappingTests.java @@ -148,10 +148,10 @@ private DocumentMapper mapper(String mapping) throws IOException { } private void assertNumericTokensEqual(ParsedDocument doc, DocumentMapper defaultMapper, String fieldA, String fieldB) throws IOException { - assertThat(doc.rootDoc().getField(fieldA).tokenStream(defaultMapper.indexAnalyzer(), null), notNullValue()); - assertThat(doc.rootDoc().getField(fieldB).tokenStream(defaultMapper.indexAnalyzer(), null), notNullValue()); + assertThat(doc.rootDoc().getField(fieldA).tokenStream(defaultMapper.mappers().indexAnalyzer(), null), notNullValue()); + assertThat(doc.rootDoc().getField(fieldB).tokenStream(defaultMapper.mappers().indexAnalyzer(), null), notNullValue()); - TokenStream tokenStream = doc.rootDoc().getField(fieldA).tokenStream(defaultMapper.indexAnalyzer(), null); + TokenStream tokenStream = doc.rootDoc().getField(fieldA).tokenStream(defaultMapper.mappers().indexAnalyzer(), null); tokenStream.reset(); NumericTermAttribute nta = tokenStream.addAttribute(NumericTermAttribute.class); List values = new ArrayList<>(); @@ -159,7 +159,7 @@ private void assertNumericTokensEqual(ParsedDocument doc, DocumentMapper default values.add(nta.getRawValue()); } - tokenStream = doc.rootDoc().getField(fieldB).tokenStream(defaultMapper.indexAnalyzer(), null); + tokenStream = doc.rootDoc().getField(fieldB).tokenStream(defaultMapper.mappers().indexAnalyzer(), null); tokenStream.reset(); nta = tokenStream.addAttribute(NumericTermAttribute.class); int pos = 0; @@ -184,7 +184,7 @@ public void testTimestampAsDate() throws Exception { .endObject() .bytes()); - assertThat(doc.rootDoc().getField("date_field").tokenStream(defaultMapper.indexAnalyzer(), null), notNullValue()); + assertThat(doc.rootDoc().getField("date_field").tokenStream(defaultMapper.mappers().indexAnalyzer(), null), notNullValue()); } @Test diff --git a/src/test/java/org/elasticsearch/index/mapper/lucene/DoubleIndexingDocTest.java b/src/test/java/org/elasticsearch/index/mapper/lucene/DoubleIndexingDocTest.java index b6ed2fcdc6c87..40ed00f3e8e2d 100644 --- a/src/test/java/org/elasticsearch/index/mapper/lucene/DoubleIndexingDocTest.java +++ b/src/test/java/org/elasticsearch/index/mapper/lucene/DoubleIndexingDocTest.java @@ -58,8 +58,8 @@ public void testDoubleIndexingSameDoc() throws Exception { .endObject() .bytes()); - writer.addDocument(doc.rootDoc(), mapper.indexAnalyzer()); - writer.addDocument(doc.rootDoc(), mapper.indexAnalyzer()); + writer.addDocument(doc.rootDoc(), mapper.mappers().indexAnalyzer()); + writer.addDocument(doc.rootDoc(), mapper.mappers().indexAnalyzer()); IndexReader reader = DirectoryReader.open(writer, true); IndexSearcher searcher = new IndexSearcher(reader); diff --git a/src/test/java/org/elasticsearch/index/mapper/lucene/StoredNumericValuesTest.java b/src/test/java/org/elasticsearch/index/mapper/lucene/StoredNumericValuesTest.java index c2e8ea59c500f..54c5177633673 100644 --- a/src/test/java/org/elasticsearch/index/mapper/lucene/StoredNumericValuesTest.java +++ b/src/test/java/org/elasticsearch/index/mapper/lucene/StoredNumericValuesTest.java @@ -73,7 +73,7 @@ public void testBytesAndNumericRepresentation() throws Exception { .endObject() .bytes()); - writer.addDocument(doc.rootDoc(), mapper.indexAnalyzer()); + writer.addDocument(doc.rootDoc(), mapper.mappers().indexAnalyzer()); // Indexing a doc in the old way FieldType fieldType = new FieldType(); diff --git a/src/test/java/org/elasticsearch/index/mapper/size/SizeMappingTests.java b/src/test/java/org/elasticsearch/index/mapper/size/SizeMappingTests.java index 87f2ca801217e..7e69ee38c6024 100644 --- a/src/test/java/org/elasticsearch/index/mapper/size/SizeMappingTests.java +++ b/src/test/java/org/elasticsearch/index/mapper/size/SizeMappingTests.java @@ -47,7 +47,7 @@ public void testSizeEnabled() throws Exception { ParsedDocument doc = docMapper.parse(SourceToParse.source(source).type("type").id("1")); assertThat(doc.rootDoc().getField("_size").fieldType().stored(), equalTo(false)); - assertThat(doc.rootDoc().getField("_size").tokenStream(docMapper.indexAnalyzer(), null), notNullValue()); + assertThat(doc.rootDoc().getField("_size").tokenStream(docMapper.mappers().indexAnalyzer(), null), notNullValue()); } @Test @@ -65,7 +65,7 @@ public void testSizeEnabledAndStored() throws Exception { ParsedDocument doc = docMapper.parse(SourceToParse.source(source).type("type").id("1")); assertThat(doc.rootDoc().getField("_size").fieldType().stored(), equalTo(true)); - assertThat(doc.rootDoc().getField("_size").tokenStream(docMapper.indexAnalyzer(), null), notNullValue()); + assertThat(doc.rootDoc().getField("_size").tokenStream(docMapper.mappers().indexAnalyzer(), null), notNullValue()); } @Test diff --git a/src/test/java/org/elasticsearch/index/mapper/timestamp/TimestampMappingTests.java b/src/test/java/org/elasticsearch/index/mapper/timestamp/TimestampMappingTests.java index b16582486df00..8a0e007535138 100644 --- a/src/test/java/org/elasticsearch/index/mapper/timestamp/TimestampMappingTests.java +++ b/src/test/java/org/elasticsearch/index/mapper/timestamp/TimestampMappingTests.java @@ -85,7 +85,7 @@ public void testEnabled() throws Exception { assertThat(doc.rootDoc().getField("_timestamp").fieldType().stored(), equalTo(true)); assertNotSame(IndexOptions.NONE, doc.rootDoc().getField("_timestamp").fieldType().indexOptions()); - assertThat(doc.rootDoc().getField("_timestamp").tokenStream(docMapper.indexAnalyzer(), null), notNullValue()); + assertThat(doc.rootDoc().getField("_timestamp").tokenStream(docMapper.mappers().indexAnalyzer(), null), notNullValue()); } @Test diff --git a/src/test/java/org/elasticsearch/index/mapper/ttl/TTLMappingTests.java b/src/test/java/org/elasticsearch/index/mapper/ttl/TTLMappingTests.java index 0c2f9d88eba96..591e68d48be48 100644 --- a/src/test/java/org/elasticsearch/index/mapper/ttl/TTLMappingTests.java +++ b/src/test/java/org/elasticsearch/index/mapper/ttl/TTLMappingTests.java @@ -69,7 +69,7 @@ public void testEnabled() throws Exception { assertThat(doc.rootDoc().getField("_ttl").fieldType().stored(), equalTo(true)); assertNotSame(IndexOptions.NONE, doc.rootDoc().getField("_ttl").fieldType().indexOptions()); - assertThat(doc.rootDoc().getField("_ttl").tokenStream(docMapper.indexAnalyzer(), null), notNullValue()); + assertThat(doc.rootDoc().getField("_ttl").tokenStream(docMapper.mappers().indexAnalyzer(), null), notNullValue()); } @Test diff --git a/src/test/resources/org/elasticsearch/bwcompat/index-1.4.2.zip b/src/test/resources/org/elasticsearch/bwcompat/index-1.4.2.zip index 08e82ff400f3eeee6c5d4770fe4293fb510c839a..7d5e543485765a7387bedb1224aa418c19cbf1b6 100644 GIT binary patch literal 40533 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 F{s&OCcdq~d literal 30430 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 literal 14402 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