summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buildSrc/src/main/resources/checkstyle_suppressions.xml4
-rw-r--r--core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/create/CreateSnapshotRequest.java6
-rw-r--r--core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/restore/RestoreSnapshotRequest.java8
-rw-r--r--core/src/main/java/org/elasticsearch/action/admin/indices/flush/TransportShardFlushAction.java4
-rw-r--r--core/src/main/java/org/elasticsearch/action/admin/indices/refresh/TransportShardRefreshAction.java4
-rw-r--r--core/src/main/java/org/elasticsearch/action/get/MultiGetRequest.java3
-rw-r--r--core/src/main/java/org/elasticsearch/action/get/TransportGetAction.java2
-rw-r--r--core/src/main/java/org/elasticsearch/action/support/AutoCreateIndex.java2
-rw-r--r--core/src/main/java/org/elasticsearch/action/support/IndicesOptions.java8
-rw-r--r--core/src/main/java/org/elasticsearch/action/support/replication/TransportReplicationAction.java6
-rw-r--r--core/src/main/java/org/elasticsearch/cluster/InternalClusterInfoService.java3
-rw-r--r--core/src/main/java/org/elasticsearch/cluster/metadata/AutoExpandReplicas.java2
-rw-r--r--core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java13
-rw-r--r--core/src/main/java/org/elasticsearch/cluster/metadata/MappingMetaData.java13
-rw-r--r--core/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java2
-rw-r--r--core/src/main/java/org/elasticsearch/cluster/routing/IndexRoutingTable.java2
-rw-r--r--core/src/main/java/org/elasticsearch/cluster/routing/RoutingNodes.java4
-rw-r--r--core/src/main/java/org/elasticsearch/common/Booleans.java177
-rw-r--r--core/src/main/java/org/elasticsearch/common/TriFunction.java42
-rw-r--r--core/src/main/java/org/elasticsearch/common/settings/Setting.java6
-rw-r--r--core/src/main/java/org/elasticsearch/common/settings/Settings.java29
-rw-r--r--core/src/main/java/org/elasticsearch/common/xcontent/XContent.java2
-rw-r--r--core/src/main/java/org/elasticsearch/common/xcontent/XContentParser.java20
-rw-r--r--core/src/main/java/org/elasticsearch/common/xcontent/support/AbstractXContentParser.java29
-rw-r--r--core/src/main/java/org/elasticsearch/common/xcontent/support/XContentMapValues.java43
-rw-r--r--core/src/main/java/org/elasticsearch/gateway/PrimaryShardAllocator.java8
-rw-r--r--core/src/main/java/org/elasticsearch/index/IndexModule.java7
-rw-r--r--core/src/main/java/org/elasticsearch/index/IndexService.java10
-rw-r--r--core/src/main/java/org/elasticsearch/index/IndexSettings.java13
-rw-r--r--core/src/main/java/org/elasticsearch/index/MergePolicyConfig.java3
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/ASCIIFoldingTokenFilterFactory.java3
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/Analysis.java17
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/ArabicAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/ArmenianAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/BasqueAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/BrazilianAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/BulgarianAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/CJKBigramFilterFactory.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/CatalanAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/CjkAnalyzerProvider.java3
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/CommonGramsTokenFilterFactory.java4
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/CzechAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/DanishAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/DutchAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/ElisionTokenFilterFactory.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/EnglishAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/FingerprintAnalyzerProvider.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/FinnishAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/FrenchAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/GalicianAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/GermanAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/GreekAnalyzerProvider.java5
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/HindiAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/HungarianAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/HunspellTokenFilterFactory.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/IndonesianAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/IrishAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/ItalianAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/KeepWordFilterFactory.java4
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/KeywordMarkerTokenFilterFactory.java4
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/LatvianAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/LimitTokenCountFilterFactory.java5
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/LithuanianAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/NorwegianAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/PathHierarchyTokenizerFactory.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/PatternAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/PatternCaptureGroupTokenFilterFactory.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/PatternReplaceTokenFilterFactory.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/PersianAnalyzerProvider.java5
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/PortugueseAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/RomanianAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/RussianAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/ShingleTokenFilterFactory.java4
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/SnowballAnalyzerProvider.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/SoraniAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/SpanishAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/StandardAnalyzerProvider.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/StandardHtmlStripAnalyzerProvider.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/StopAnalyzerProvider.java3
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/StopTokenFilterFactory.java5
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/SwedishAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/SynonymTokenFilterFactory.java4
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/ThaiAnalyzerProvider.java5
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/TurkishAnalyzerProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/UniqueTokenFilterFactory.java3
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/WordDelimiterTokenFilterFactory.java4
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/compound/AbstractCompoundWordTokenFilterFactory.java5
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/AllFieldMapper.java7
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/BaseGeoPointFieldMapper.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java18
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/FieldNamesFieldMapper.java4
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/GeoShapeFieldMapper.java9
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java4
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java4
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java18
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/ParentFieldMapper.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/RangeFieldMapper.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java4
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/RoutingFieldMapper.java4
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java4
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/SourceFieldMapper.java4
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java4
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/TypeParsers.java131
-rw-r--r--core/src/main/java/org/elasticsearch/index/shard/IndexShard.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/similarity/BM25SimilarityProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/similarity/ClassicSimilarityProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/similarity/DFISimilarityProvider.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/similarity/DFRSimilarityProvider.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/similarity/IBSimilarityProvider.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/similarity/LMDirichletSimilarityProvider.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/similarity/LMJelinekMercerSimilarityProvider.java2
-rw-r--r--core/src/main/java/org/elasticsearch/index/similarity/SimilarityService.java45
-rw-r--r--core/src/main/java/org/elasticsearch/index/store/FsDirectoryService.java3
-rw-r--r--core/src/main/java/org/elasticsearch/rest/RestRequest.java8
-rw-r--r--core/src/main/java/org/elasticsearch/rest/action/cat/RestShardsAction.java2
-rw-r--r--core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java4
-rw-r--r--core/src/main/java/org/elasticsearch/search/fetch/subphase/FetchSourceContext.java4
-rw-r--r--core/src/test/java/org/elasticsearch/action/get/MultiGetRequestTests.java67
-rw-r--r--core/src/test/java/org/elasticsearch/action/support/IndicesOptionsTests.java3
-rw-r--r--core/src/test/java/org/elasticsearch/bwcompat/RestoreBackwardsCompatIT.java11
-rw-r--r--core/src/test/java/org/elasticsearch/cluster/SimpleClusterStateIT.java33
-rw-r--r--core/src/test/java/org/elasticsearch/common/BooleansTests.java118
-rw-r--r--core/src/test/java/org/elasticsearch/common/settings/SettingTests.java2
-rw-r--r--core/src/test/java/org/elasticsearch/common/settings/SettingsModuleTests.java2
-rw-r--r--core/src/test/java/org/elasticsearch/common/settings/SettingsTests.java64
-rw-r--r--core/src/test/java/org/elasticsearch/common/xcontent/XContentParserTests.java91
-rw-r--r--core/src/test/java/org/elasticsearch/index/IndexModuleTests.java4
-rw-r--r--core/src/test/java/org/elasticsearch/index/IndexServiceTests.java40
-rw-r--r--core/src/test/java/org/elasticsearch/index/IndexingSlowLogTests.java2
-rw-r--r--core/src/test/java/org/elasticsearch/index/mapper/BooleanFieldMapperTests.java82
-rw-r--r--core/src/test/java/org/elasticsearch/index/mapper/FieldTypeTestCase.java10
-rw-r--r--core/src/test/java/org/elasticsearch/index/mapper/UpdateMappingTests.java30
-rw-r--r--core/src/test/java/org/elasticsearch/index/query/HasChildQueryBuilderTests.java6
-rw-r--r--core/src/test/java/org/elasticsearch/indices/analysis/AnalysisModuleTests.java4
-rw-r--r--core/src/test/java/org/elasticsearch/indices/template/SimpleIndexTemplateIT.java33
-rw-r--r--core/src/test/java/org/elasticsearch/rest/BaseRestHandlerTests.java4
-rw-r--r--core/src/test/java/org/elasticsearch/rest/action/cat/RestTableTests.java2
-rw-r--r--core/src/test/java/org/elasticsearch/script/ScriptContextTests.java2
-rw-r--r--core/src/test/java/org/elasticsearch/snapshots/SharedClusterSnapshotRestoreIT.java46
-rw-r--r--core/src/test/resources/indices/bwc/index-5.1.1.zipbin421094 -> 232549 bytes
-rw-r--r--core/src/test/resources/indices/bwc/repo-5.1.1.zipbin204156 -> 204921 bytes
-rw-r--r--dev-tools/create_bwc_index.py78
-rw-r--r--docs/reference/analysis/tokenfilters/pattern-capture-tokenfilter.asciidoc4
-rw-r--r--docs/reference/api-conventions.asciidoc5
-rw-r--r--docs/reference/cat/health.asciidoc2
-rw-r--r--docs/reference/mapping/types/boolean.asciidoc10
-rw-r--r--docs/reference/migration/migrate_6_0/mappings.asciidoc8
-rw-r--r--docs/reference/migration/migrate_6_0/rest.asciidoc7
-rw-r--r--docs/reference/migration/migrate_6_0/settings.asciidoc7
-rw-r--r--plugins/analysis-icu/src/main/java/org/elasticsearch/index/analysis/IcuCollationTokenFilterFactory.java7
-rw-r--r--plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/JapaneseStopTokenFilterFactory.java5
-rw-r--r--plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiAnalyzerProvider.java3
-rw-r--r--plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiIterationMarkCharFilterFactory.java6
-rw-r--r--plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiReadingFormFilterFactory.java2
-rw-r--r--plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiTokenizerFactory.java3
-rw-r--r--plugins/analysis-phonetic/src/main/java/org/elasticsearch/index/analysis/PhoneticTokenFilterFactory.java2
-rw-r--r--plugins/analysis-ukrainian/src/main/java/org/elasticsearch/index/analysis/UkrainianAnalyzerProvider.java8
-rw-r--r--plugins/mapper-size/src/main/java/org/elasticsearch/index/mapper/size/SizeFieldMapper.java7
-rw-r--r--rest-api-spec/src/main/resources/rest-api-spec/test/cat.health/10_basic.yaml2
-rw-r--r--rest-api-spec/src/main/resources/rest-api-spec/test/exists/60_realtime_refresh.yaml8
-rw-r--r--rest-api-spec/src/main/resources/rest-api-spec/test/get/60_realtime_refresh.yaml8
-rw-r--r--rest-api-spec/src/main/resources/rest-api-spec/test/get_source/60_realtime_refresh.yaml8
-rw-r--r--rest-api-spec/src/main/resources/rest-api-spec/test/mget/60_realtime_refresh.yaml8
-rw-r--r--rest-api-spec/src/main/resources/rest-api-spec/test/termvectors/20_issue7121.yaml2
-rw-r--r--rest-api-spec/src/main/resources/rest-api-spec/test/termvectors/30_realtime.yaml4
-rw-r--r--rest-api-spec/src/main/resources/rest-api-spec/test/update/22_doc_as_upsert.yaml4
169 files changed, 1346 insertions, 601 deletions
diff --git a/buildSrc/src/main/resources/checkstyle_suppressions.xml b/buildSrc/src/main/resources/checkstyle_suppressions.xml
index 6fc4a8275a..61e9a205d3 100644
--- a/buildSrc/src/main/resources/checkstyle_suppressions.xml
+++ b/buildSrc/src/main/resources/checkstyle_suppressions.xml
@@ -255,7 +255,6 @@
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]cluster[/\\]routing[/\\]allocation[/\\]decider[/\\]AllocationDeciders.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]cluster[/\\]service[/\\]InternalClusterService.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]common[/\\]Base64.java" checks="LineLength" />
- <suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]common[/\\]Booleans.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]common[/\\]Numbers.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]common[/\\]blobstore[/\\]fs[/\\]FsBlobStore.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]common[/\\]blobstore[/\\]url[/\\]URLBlobStore.java" checks="LineLength" />
@@ -562,8 +561,6 @@
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]ingest[/\\]SimulatePipelineResponseTests.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]ingest[/\\]WriteableIngestDocumentTests.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]search[/\\]SearchRequestBuilderTests.java" checks="LineLength" />
- <suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]support[/\\]IndicesOptionsTests.java" checks="LineLength" />
- <suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]support[/\\]IndicesOptionsTests.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]support[/\\]TransportActionFilterChainTests.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]support[/\\]WaitActiveShardCountIT.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]support[/\\]broadcast[/\\]node[/\\]TransportBroadcastByNodeActionTests.java" checks="LineLength" />
@@ -652,7 +649,6 @@
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]cluster[/\\]settings[/\\]ClusterSettingsIT.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]cluster[/\\]shards[/\\]ClusterSearchShardsIT.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]cluster[/\\]structure[/\\]RoutingIteratorTests.java" checks="LineLength" />
- <suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]common[/\\]BooleansTests.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]common[/\\]blobstore[/\\]FsBlobStoreContainerTests.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]common[/\\]blobstore[/\\]FsBlobStoreTests.java" checks="LineLength" />
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]common[/\\]breaker[/\\]MemoryCircuitBreakerTests.java" checks="LineLength" />
diff --git a/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/create/CreateSnapshotRequest.java b/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/create/CreateSnapshotRequest.java
index 9cbc1b6563..ae715050e8 100644
--- a/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/create/CreateSnapshotRequest.java
+++ b/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/create/CreateSnapshotRequest.java
@@ -42,7 +42,7 @@ import static org.elasticsearch.common.Strings.EMPTY_ARRAY;
import static org.elasticsearch.common.settings.Settings.readSettingsFromStream;
import static org.elasticsearch.common.settings.Settings.writeSettingsToStream;
import static org.elasticsearch.common.settings.Settings.Builder.EMPTY_SETTINGS;
-import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
+import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeBooleanValue;
/**
* Create snapshot request
@@ -366,14 +366,14 @@ public class CreateSnapshotRequest extends MasterNodeRequest<CreateSnapshotReque
throw new IllegalArgumentException("malformed indices section, should be an array of strings");
}
} else if (name.equals("partial")) {
- partial(lenientNodeBooleanValue(entry.getValue()));
+ partial(nodeBooleanValue(entry.getValue(), "partial"));
} else if (name.equals("settings")) {
if (!(entry.getValue() instanceof Map)) {
throw new IllegalArgumentException("malformed settings section, should indices an inner object");
}
settings((Map<String, Object>) entry.getValue());
} else if (name.equals("include_global_state")) {
- includeGlobalState = lenientNodeBooleanValue(entry.getValue());
+ includeGlobalState = nodeBooleanValue(entry.getValue(), "include_global_state");
}
}
indicesOptions(IndicesOptions.fromMap((Map<String, Object>) source, IndicesOptions.lenientExpandOpen()));
diff --git a/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/restore/RestoreSnapshotRequest.java b/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/restore/RestoreSnapshotRequest.java
index 641525f00e..a7bbd02ee5 100644
--- a/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/restore/RestoreSnapshotRequest.java
+++ b/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/restore/RestoreSnapshotRequest.java
@@ -40,7 +40,7 @@ import static org.elasticsearch.action.ValidateActions.addValidationError;
import static org.elasticsearch.common.settings.Settings.readSettingsFromStream;
import static org.elasticsearch.common.settings.Settings.writeSettingsToStream;
import static org.elasticsearch.common.settings.Settings.Builder.EMPTY_SETTINGS;
-import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
+import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeBooleanValue;
/**
* Restore snapshot request
@@ -481,16 +481,16 @@ public class RestoreSnapshotRequest extends MasterNodeRequest<RestoreSnapshotReq
throw new IllegalArgumentException("malformed indices section, should be an array of strings");
}
} else if (name.equals("partial")) {
- partial(lenientNodeBooleanValue(entry.getValue()));
+ partial(nodeBooleanValue(entry.getValue(), "partial"));
} else if (name.equals("settings")) {
if (!(entry.getValue() instanceof Map)) {
throw new IllegalArgumentException("malformed settings section");
}
settings((Map<String, Object>) entry.getValue());
} else if (name.equals("include_global_state")) {
- includeGlobalState = lenientNodeBooleanValue(entry.getValue());
+ includeGlobalState = nodeBooleanValue(entry.getValue(), "include_global_state");
} else if (name.equals("include_aliases")) {
- includeAliases = lenientNodeBooleanValue(entry.getValue());
+ includeAliases = nodeBooleanValue(entry.getValue(), "include_aliases");
} else if (name.equals("rename_pattern")) {
if (entry.getValue() instanceof String) {
renamePattern((String) entry.getValue());
diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/flush/TransportShardFlushAction.java b/core/src/main/java/org/elasticsearch/action/admin/indices/flush/TransportShardFlushAction.java
index b04bb86a63..026946334a 100644
--- a/core/src/main/java/org/elasticsearch/action/admin/indices/flush/TransportShardFlushAction.java
+++ b/core/src/main/java/org/elasticsearch/action/admin/indices/flush/TransportShardFlushAction.java
@@ -23,7 +23,7 @@ import org.elasticsearch.action.support.ActionFilters;
import org.elasticsearch.action.support.replication.ReplicationResponse;
import org.elasticsearch.action.support.replication.TransportReplicationAction;
import org.elasticsearch.cluster.action.shard.ShardStateAction;
-import org.elasticsearch.cluster.block.ClusterBlockLevel;
+import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.inject.Inject;
@@ -65,7 +65,7 @@ public class TransportShardFlushAction extends TransportReplicationAction<ShardF
}
@Override
- protected boolean shouldExecuteReplication(Settings settings) {
+ protected boolean shouldExecuteReplication(IndexMetaData indexMetaData) {
return true;
}
}
diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/refresh/TransportShardRefreshAction.java b/core/src/main/java/org/elasticsearch/action/admin/indices/refresh/TransportShardRefreshAction.java
index d8e9d8c0b9..d1d8b4078b 100644
--- a/core/src/main/java/org/elasticsearch/action/admin/indices/refresh/TransportShardRefreshAction.java
+++ b/core/src/main/java/org/elasticsearch/action/admin/indices/refresh/TransportShardRefreshAction.java
@@ -24,7 +24,7 @@ import org.elasticsearch.action.support.replication.BasicReplicationRequest;
import org.elasticsearch.action.support.replication.ReplicationResponse;
import org.elasticsearch.action.support.replication.TransportReplicationAction;
import org.elasticsearch.cluster.action.shard.ShardStateAction;
-import org.elasticsearch.cluster.block.ClusterBlockLevel;
+import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.inject.Inject;
@@ -68,7 +68,7 @@ public class TransportShardRefreshAction
}
@Override
- protected boolean shouldExecuteReplication(Settings settings) {
+ protected boolean shouldExecuteReplication(IndexMetaData indexMetaData) {
return true;
}
}
diff --git a/core/src/main/java/org/elasticsearch/action/get/MultiGetRequest.java b/core/src/main/java/org/elasticsearch/action/get/MultiGetRequest.java
index 5407184ded..d4627391b1 100644
--- a/core/src/main/java/org/elasticsearch/action/get/MultiGetRequest.java
+++ b/core/src/main/java/org/elasticsearch/action/get/MultiGetRequest.java
@@ -379,7 +379,8 @@ public class MultiGetRequest extends ActionRequest implements Iterable<MultiGetR
} else if ("_version_type".equals(currentFieldName) || "_versionType".equals(currentFieldName) || "version_type".equals(currentFieldName) || "versionType".equals(currentFieldName)) {
versionType = VersionType.fromString(parser.text());
} else if ("_source".equals(currentFieldName)) {
- if (parser.isBooleanValue()) {
+ // check lenient to avoid interpreting the value as string but parse strict in order to provoke an error early on.
+ if (parser.isBooleanValueLenient()) {
fetchSourceContext = new FetchSourceContext(parser.booleanValue(), fetchSourceContext.includes(),
fetchSourceContext.excludes());
} else if (token == XContentParser.Token.VALUE_STRING) {
diff --git a/core/src/main/java/org/elasticsearch/action/get/TransportGetAction.java b/core/src/main/java/org/elasticsearch/action/get/TransportGetAction.java
index 6b9de7ecf6..ee835fa06b 100644
--- a/core/src/main/java/org/elasticsearch/action/get/TransportGetAction.java
+++ b/core/src/main/java/org/elasticsearch/action/get/TransportGetAction.java
@@ -71,7 +71,7 @@ public class TransportGetAction extends TransportSingleShardAction<GetRequest, G
if (request.request().realtime && // if the realtime flag is set
request.request().preference() == null && // the preference flag is not already set
indexMeta != null && // and we have the index
- IndexMetaData.isIndexUsingShadowReplicas(indexMeta.getSettings())) { // and the index uses shadow replicas
+ indexMeta.isIndexUsingShadowReplicas()) { // and the index uses shadow replicas
// set the preference for the request to use "_primary" automatically
request.request().preference(Preference.PRIMARY.type());
}
diff --git a/core/src/main/java/org/elasticsearch/action/support/AutoCreateIndex.java b/core/src/main/java/org/elasticsearch/action/support/AutoCreateIndex.java
index ff576a7567..2e442e2cc1 100644
--- a/core/src/main/java/org/elasticsearch/action/support/AutoCreateIndex.java
+++ b/core/src/main/java/org/elasticsearch/action/support/AutoCreateIndex.java
@@ -115,7 +115,7 @@ public final class AutoCreateIndex {
boolean autoCreateIndex;
List<Tuple<String, Boolean>> expressions = new ArrayList<>();
try {
- autoCreateIndex = Booleans.parseBooleanExact(value);
+ autoCreateIndex = Booleans.parseBoolean(value);
} catch (IllegalArgumentException ex) {
try {
String[] patterns = Strings.commaDelimitedListToStringArray(value);
diff --git a/core/src/main/java/org/elasticsearch/action/support/IndicesOptions.java b/core/src/main/java/org/elasticsearch/action/support/IndicesOptions.java
index 2bc49f7e9f..b82bfcc717 100644
--- a/core/src/main/java/org/elasticsearch/action/support/IndicesOptions.java
+++ b/core/src/main/java/org/elasticsearch/action/support/IndicesOptions.java
@@ -26,7 +26,7 @@ import org.elasticsearch.rest.RestRequest;
import java.io.IOException;
import java.util.Map;
-import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
+import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeBooleanValue;
import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeStringArrayValue;
/**
@@ -195,8 +195,8 @@ public class IndicesOptions {
//note that allowAliasesToMultipleIndices is not exposed, always true (only for internal use)
return fromOptions(
- lenientNodeBooleanValue(ignoreUnavailableString, defaultSettings.ignoreUnavailable()),
- lenientNodeBooleanValue(allowNoIndicesString, defaultSettings.allowNoIndices()),
+ nodeBooleanValue(ignoreUnavailableString, "ignore_unavailable", defaultSettings.ignoreUnavailable()),
+ nodeBooleanValue(allowNoIndicesString, "allow_no_indices", defaultSettings.allowNoIndices()),
expandWildcardsOpen,
expandWildcardsClosed,
defaultSettings.allowAliasesToMultipleIndices(),
@@ -279,7 +279,7 @@ public class IndicesOptions {
", allow_no_indices=" + allowNoIndices() +
", expand_wildcards_open=" + expandWildcardsOpen() +
", expand_wildcards_closed=" + expandWildcardsClosed() +
- ", allow_alisases_to_multiple_indices=" + allowAliasesToMultipleIndices() +
+ ", allow_aliases_to_multiple_indices=" + allowAliasesToMultipleIndices() +
", forbid_closed_indices=" + forbidClosedIndices() +
']';
}
diff --git a/core/src/main/java/org/elasticsearch/action/support/replication/TransportReplicationAction.java b/core/src/main/java/org/elasticsearch/action/support/replication/TransportReplicationAction.java
index ee97612d93..c616107203 100644
--- a/core/src/main/java/org/elasticsearch/action/support/replication/TransportReplicationAction.java
+++ b/core/src/main/java/org/elasticsearch/action/support/replication/TransportReplicationAction.java
@@ -315,7 +315,7 @@ public abstract class TransportReplicationAction<
} else {
setPhase(replicationTask, "primary");
final IndexMetaData indexMetaData = clusterService.state().getMetaData().index(request.shardId().getIndex());
- final boolean executeOnReplicas = (indexMetaData == null) || shouldExecuteReplication(indexMetaData.getSettings());
+ final boolean executeOnReplicas = (indexMetaData == null) || shouldExecuteReplication(indexMetaData);
final ActionListener<Response> listener = createResponseListener(primaryShardReference);
createReplicatedOperation(request,
ActionListener.wrap(result -> result.respond(listener), listener::onFailure),
@@ -910,8 +910,8 @@ public abstract class TransportReplicationAction<
* Indicated whether this operation should be replicated to shadow replicas or not. If this method returns true the replication phase
* will be skipped. For example writes such as index and delete don't need to be replicated on shadow replicas but refresh and flush do.
*/
- protected boolean shouldExecuteReplication(Settings settings) {
- return IndexMetaData.isIndexUsingShadowReplicas(settings) == false;
+ protected boolean shouldExecuteReplication(IndexMetaData indexMetaData) {
+ return indexMetaData.isIndexUsingShadowReplicas() == false;
}
class ShardReference implements Releasable {
diff --git a/core/src/main/java/org/elasticsearch/cluster/InternalClusterInfoService.java b/core/src/main/java/org/elasticsearch/cluster/InternalClusterInfoService.java
index b8ac2a5eb5..a9392d3c01 100644
--- a/core/src/main/java/org/elasticsearch/cluster/InternalClusterInfoService.java
+++ b/core/src/main/java/org/elasticsearch/cluster/InternalClusterInfoService.java
@@ -377,14 +377,13 @@ public class InternalClusterInfoService extends AbstractComponent
MetaData meta = state.getMetaData();
for (ShardStats s : stats) {
IndexMetaData indexMeta = meta.index(s.getShardRouting().index());
- Settings indexSettings = indexMeta == null ? null : indexMeta.getSettings();
newShardRoutingToDataPath.put(s.getShardRouting(), s.getDataPath());
long size = s.getStats().getStore().sizeInBytes();
String sid = ClusterInfo.shardIdentifierFromRouting(s.getShardRouting());
if (logger.isTraceEnabled()) {
logger.trace("shard: {} size: {}", sid, size);
}
- if (indexSettings != null && IndexMetaData.isIndexUsingShadowReplicas(indexSettings)) {
+ if (indexMeta != null && indexMeta.isIndexUsingShadowReplicas()) {
// Shards on a shared filesystem should be considered of size 0
if (logger.isTraceEnabled()) {
logger.trace("shard: {} is using shadow replicas and will be treated as size 0", sid);
diff --git a/core/src/main/java/org/elasticsearch/cluster/metadata/AutoExpandReplicas.java b/core/src/main/java/org/elasticsearch/cluster/metadata/AutoExpandReplicas.java
index 4b4a8e54d7..fa30abe5a7 100644
--- a/core/src/main/java/org/elasticsearch/cluster/metadata/AutoExpandReplicas.java
+++ b/core/src/main/java/org/elasticsearch/cluster/metadata/AutoExpandReplicas.java
@@ -33,7 +33,7 @@ final class AutoExpandReplicas {
public static final Setting<AutoExpandReplicas> SETTING = new Setting<>(IndexMetaData.SETTING_AUTO_EXPAND_REPLICAS, "false", (value) -> {
final int min;
final int max;
- if (Booleans.parseBoolean(value, true) == false) {
+ if (Booleans.isFalse(value)) {
return new AutoExpandReplicas(0, 0, false);
}
final int dash = value.indexOf('-');
diff --git a/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java b/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java
index ba5ce1067b..6865983e18 100644
--- a/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java
+++ b/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java
@@ -1263,9 +1263,10 @@ public class IndexMetaData implements Diffable<IndexMetaData>, ToXContent {
* is the returned value from
* {@link #isIndexUsingShadowReplicas(org.elasticsearch.common.settings.Settings)}.
*/
- public static boolean isOnSharedFilesystem(Settings settings) {
+ public boolean isOnSharedFilesystem(Settings settings) {
// don't use the setting directly, not to trigger verbose deprecation logging
- return settings.getAsBoolean(SETTING_SHARED_FILESYSTEM, isIndexUsingShadowReplicas(settings));
+ return settings.getAsBooleanLenientForPreEs6Indices(
+ this.indexCreatedVersion, SETTING_SHARED_FILESYSTEM, isIndexUsingShadowReplicas(settings));
}
/**
@@ -1273,9 +1274,13 @@ public class IndexMetaData implements Diffable<IndexMetaData>, ToXContent {
* with these settings uses shadow replicas. Otherwise <code>false</code>. The default
* setting for this is <code>false</code>.
*/
- public static boolean isIndexUsingShadowReplicas(Settings settings) {
+ public boolean isIndexUsingShadowReplicas() {
+ return isIndexUsingShadowReplicas(this.settings);
+ }
+
+ public boolean isIndexUsingShadowReplicas(Settings settings) {
// don't use the setting directly, not to trigger verbose deprecation logging
- return settings.getAsBoolean(SETTING_SHADOW_REPLICAS, false);
+ return settings.getAsBooleanLenientForPreEs6Indices(this.indexCreatedVersion, SETTING_SHADOW_REPLICAS, false);
}
/**
diff --git a/core/src/main/java/org/elasticsearch/cluster/metadata/MappingMetaData.java b/core/src/main/java/org/elasticsearch/cluster/metadata/MappingMetaData.java
index c9a0c61755..08d5211e12 100644
--- a/core/src/main/java/org/elasticsearch/cluster/metadata/MappingMetaData.java
+++ b/core/src/main/java/org/elasticsearch/cluster/metadata/MappingMetaData.java
@@ -34,7 +34,7 @@ import org.elasticsearch.index.mapper.DocumentMapper;
import java.io.IOException;
import java.util.Map;
-import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
+import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeBooleanValue;
/**
* Mapping configuration for a type.
@@ -95,10 +95,6 @@ public class MappingMetaData extends AbstractDiffable<MappingMetaData> {
initMappers((Map<String, Object>) mappingMap.get(this.type));
}
- public MappingMetaData(Map<String, Object> mapping) throws IOException {
- this(mapping.keySet().iterator().next(), mapping);
- }
-
public MappingMetaData(String type, Map<String, Object> mapping) throws IOException {
this.type = type;
XContentBuilder mappingBuilder = XContentFactory.jsonBuilder().map(mapping);
@@ -127,7 +123,12 @@ public class MappingMetaData extends AbstractDiffable<MappingMetaData> {
String fieldName = entry.getKey();
Object fieldNode = entry.getValue();
if (fieldName.equals("required")) {
- required = lenientNodeBooleanValue(fieldNode);
+ try {
+ required = nodeBooleanValue(fieldNode);
+ } catch (IllegalArgumentException ex) {
+ throw new IllegalArgumentException("Failed to create mapping for type [" + this.type() + "]. " +
+ "Illegal value in field [_routing.required].", ex);
+ }
}
}
this.routing = new Routing(required);
diff --git a/core/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java b/core/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java
index 64f96c8e26..7015695948 100644
--- a/core/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java
+++ b/core/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java
@@ -428,7 +428,7 @@ public class MetaDataCreateIndexService extends AbstractComponent {
.put(indexMetaData, false)
.build();
- String maybeShadowIndicator = IndexMetaData.isIndexUsingShadowReplicas(indexMetaData.getSettings()) ? "s" : "";
+ String maybeShadowIndicator = indexMetaData.isIndexUsingShadowReplicas() ? "s" : "";
logger.info("[{}] creating index, cause [{}], templates {}, shards [{}]/[{}{}], mappings {}",
request.index(), request.cause(), templateNames, indexMetaData.getNumberOfShards(),
indexMetaData.getNumberOfReplicas(), maybeShadowIndicator, mappings.keySet());
diff --git a/core/src/main/java/org/elasticsearch/cluster/routing/IndexRoutingTable.java b/core/src/main/java/org/elasticsearch/cluster/routing/IndexRoutingTable.java
index 1d137d30db..53590550d8 100644
--- a/core/src/main/java/org/elasticsearch/cluster/routing/IndexRoutingTable.java
+++ b/core/src/main/java/org/elasticsearch/cluster/routing/IndexRoutingTable.java
@@ -140,7 +140,7 @@ public class IndexRoutingTable extends AbstractDiffable<IndexRoutingTable> imple
}
if (indexMetaData.getCreationVersion().onOrAfter(Version.V_5_0_0_alpha1) &&
- IndexMetaData.isIndexUsingShadowReplicas(indexMetaData.getSettings()) == false && // see #20650
+ indexMetaData.isIndexUsingShadowReplicas() == false && // see #20650
shardRouting.primary() && shardRouting.initializing() && shardRouting.relocating() == false &&
RecoverySource.isInitialRecovery(shardRouting.recoverySource().getType()) == false &&
inSyncAllocationIds.contains(shardRouting.allocationId().getId()) == false)
diff --git a/core/src/main/java/org/elasticsearch/cluster/routing/RoutingNodes.java b/core/src/main/java/org/elasticsearch/cluster/routing/RoutingNodes.java
index 6b0b132471..45d567b657 100644
--- a/core/src/main/java/org/elasticsearch/cluster/routing/RoutingNodes.java
+++ b/core/src/main/java/org/elasticsearch/cluster/routing/RoutingNodes.java
@@ -540,7 +540,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
if (failedShard.primary()) {
// promote active replica to primary if active replica exists (only the case for shadow replicas)
ShardRouting activeReplica = activeReplica(failedShard.shardId());
- assert activeReplica == null || IndexMetaData.isIndexUsingShadowReplicas(indexMetaData.getSettings()) :
+ assert activeReplica == null || indexMetaData.isIndexUsingShadowReplicas() :
"initializing primary [" + failedShard + "] with active replicas [" + activeReplica + "] only expected when " +
"using shadow replicas";
if (activeReplica == null) {
@@ -599,7 +599,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
assert activeReplica.started() : "replica relocation should have been cancelled: " + activeReplica;
ShardRouting primarySwappedCandidate = promoteActiveReplicaShardToPrimary(activeReplica);
routingChangesObserver.replicaPromoted(activeReplica);
- if (IndexMetaData.isIndexUsingShadowReplicas(indexMetaData.getSettings())) {
+ if (indexMetaData.isIndexUsingShadowReplicas()) {
ShardRouting initializedShard = reinitShadowPrimary(primarySwappedCandidate);
routingChangesObserver.startedPrimaryReinitialized(primarySwappedCandidate, initializedShard);
}
diff --git a/core/src/main/java/org/elasticsearch/common/Booleans.java b/core/src/main/java/org/elasticsearch/common/Booleans.java
index 9ec1ac968a..025174c477 100644
--- a/core/src/main/java/org/elasticsearch/common/Booleans.java
+++ b/core/src/main/java/org/elasticsearch/common/Booleans.java
@@ -19,34 +19,28 @@
package org.elasticsearch.common;
-public class Booleans {
+public final class Booleans {
+ private Booleans() {
+ throw new AssertionError("No instances intended");
+ }
/**
- * Returns <code>false</code> if text is in <tt>false</tt>, <tt>0</tt>, <tt>off</tt>, <tt>no</tt>; else, true
+ * Parses a char[] representation of a boolean value to <code>boolean</code>.
+ *
+ * @return <code>true</code> iff the sequence of chars is "true", <code>false</code> iff the sequence of chars is "false" or the
+ * provided default value iff either text is <code>null</code> or length == 0.
+ * @throws IllegalArgumentException if the string cannot be parsed to boolean.
*/
public static boolean parseBoolean(char[] text, int offset, int length, boolean defaultValue) {
- // TODO: the leniency here is very dangerous: a simple typo will be misinterpreted and the user won't know.
- // We should remove it and cutover to https://github.com/rmuir/booleanparser
if (text == null || length == 0) {
return defaultValue;
+ } else {
+ return parseBoolean(new String(text, offset, length));
}
- if (length == 1) {
- return text[offset] != '0';
- }
- if (length == 2) {
- return !(text[offset] == 'n' && text[offset + 1] == 'o');
- }
- if (length == 3) {
- return !(text[offset] == 'o' && text[offset + 1] == 'f' && text[offset + 2] == 'f');
- }
- if (length == 5) {
- return !(text[offset] == 'f' && text[offset + 1] == 'a' && text[offset + 2] == 'l' && text[offset + 3] == 's' && text[offset + 4] == 'e');
- }
- return true;
}
/**
- * returns true if the a sequence of chars is one of "true","false","on","off","yes","no","0","1"
+ * returns true iff the sequence of chars is one of "true","false".
*
* @param text sequence to check
* @param offset offset to start
@@ -56,55 +50,70 @@ public class Booleans {
if (text == null || length == 0) {
return false;
}
- if (length == 1) {
- return text[offset] == '0' || text[offset] == '1';
- }
- if (length == 2) {
- return (text[offset] == 'n' && text[offset + 1] == 'o') || (text[offset] == 'o' && text[offset + 1] == 'n');
- }
- if (length == 3) {
- return (text[offset] == 'o' && text[offset + 1] == 'f' && text[offset + 2] == 'f') ||
- (text[offset] == 'y' && text[offset + 1] == 'e' && text[offset + 2] == 's');
- }
- if (length == 4) {
- return (text[offset] == 't' && text[offset + 1] == 'r' && text[offset + 2] == 'u' && text[offset + 3] == 'e');
- }
- if (length == 5) {
- return (text[offset] == 'f' && text[offset + 1] == 'a' && text[offset + 2] == 'l' && text[offset + 3] == 's' && text[offset + 4] == 'e');
- }
- return false;
+ return isBoolean(new String(text, offset, length));
+ }
+
+ public static boolean isBoolean(String value) {
+ return isFalse(value) || isTrue(value);
}
- /***
+ /**
+ * Parses a string representation of a boolean value to <code>boolean</code>.
*
- * @return true/false
- * throws exception if string cannot be parsed to boolean
+ * @return <code>true</code> iff the provided value is "true". <code>false</code> iff the provided value is "false".
+ * @throws IllegalArgumentException if the string cannot be parsed to boolean.
*/
- public static Boolean parseBooleanExact(String value) {
- boolean isFalse = isExplicitFalse(value);
- if (isFalse) {
+ public static boolean parseBoolean(String value) {
+ if (isFalse(value)) {
return false;
}
- boolean isTrue = isExplicitTrue(value);
- if (isTrue) {
+ if (isTrue(value)) {
return true;
}
+ throw new IllegalArgumentException("Failed to parse value [" + value + "] as only [true] or [false] are allowed.");
+ }
- throw new IllegalArgumentException("Failed to parse value [" + value + "] cannot be parsed to boolean [ true/1/on/yes OR false/0/off/no ]");
+ /**
+ *
+ * @param value text to parse.
+ * @param defaultValue The default value to return if the provided value is <code>null</code>.
+ * @return see {@link #parseBoolean(String)}
+ */
+ public static boolean parseBoolean(String value, boolean defaultValue) {
+ if (Strings.hasText(value)) {
+ return parseBoolean(value);
+ }
+ return defaultValue;
}
public static Boolean parseBoolean(String value, Boolean defaultValue) {
+ if (Strings.hasText(value)) {
+ return parseBoolean(value);
+ }
+ return defaultValue;
+ }
+
+ /**
+ * Returns <code>false</code> if text is in <tt>false</tt>, <tt>0</tt>, <tt>off</tt>, <tt>no</tt>; else, true
+ *
+ * @deprecated Only kept to provide automatic upgrades for pre 6.0 indices. Use {@link #parseBoolean(String, Boolean)} instead.
+ */
+ @Deprecated
+ public static Boolean parseBooleanLenient(String value, Boolean defaultValue) {
if (value == null) { // only for the null case we do that here!
return defaultValue;
}
- return parseBoolean(value, false);
+ return parseBooleanLenient(value, false);
}
/**
* Returns <code>true</code> iff the value is neither of the following:
* <tt>false</tt>, <tt>0</tt>, <tt>off</tt>, <tt>no</tt>
* otherwise <code>false</code>
+ *
+ * @deprecated Only kept to provide automatic upgrades for pre 6.0 indices. Use {@link #parseBoolean(String, boolean)} instead.
*/
- public static boolean parseBoolean(String value, boolean defaultValue) {
+ @Deprecated
+ public static boolean parseBooleanLenient(String value, boolean defaultValue) {
if (value == null) {
return defaultValue;
}
@@ -112,21 +121,77 @@ public class Booleans {
}
/**
- * Returns <code>true</code> iff the value is either of the following:
- * <tt>false</tt>, <tt>0</tt>, <tt>off</tt>, <tt>no</tt>
- * otherwise <code>false</code>
+ * @return <code>true</code> iff the value is <tt>false</tt>, otherwise <code>false</code>.
*/
- public static boolean isExplicitFalse(String value) {
- return value != null && (value.equals("false") || value.equals("0") || value.equals("off") || value.equals("no"));
+ public static boolean isFalse(String value) {
+ return "false".equals(value);
}
/**
- * Returns <code>true</code> iff the value is either of the following:
- * <tt>true</tt>, <tt>1</tt>, <tt>on</tt>, <tt>yes</tt>
- * otherwise <code>false</code>
+ * @return <code>true</code> iff the value is <tt>true</tt>, otherwise <code>false</code>
+ */
+ public static boolean isTrue(String value) {
+ return "true".equals(value);
+ }
+
+ /**
+ * Returns <code>false</code> if text is in <tt>false</tt>, <tt>0</tt>, <tt>off</tt>, <tt>no</tt>; else, true
+ *
+ * @deprecated Only kept to provide automatic upgrades for pre 6.0 indices. Use {@link #parseBoolean(char[], int, int, boolean)} instead
+ */
+ @Deprecated
+ public static boolean parseBooleanLenient(char[] text, int offset, int length, boolean defaultValue) {
+ if (text == null || length == 0) {
+ return defaultValue;
+ }
+ if (length == 1) {
+ return text[offset] != '0';
+ }
+ if (length == 2) {
+ return !(text[offset] == 'n' && text[offset + 1] == 'o');
+ }
+ if (length == 3) {
+ return !(text[offset] == 'o' && text[offset + 1] == 'f' && text[offset + 2] == 'f');
+ }
+ if (length == 5) {
+ return !(text[offset] == 'f' && text[offset + 1] == 'a' && text[offset + 2] == 'l' && text[offset + 3] == 's' &&
+ text[offset + 4] == 'e');
+ }
+ return true;
+ }
+
+ /**
+ * returns true if the a sequence of chars is one of "true","false","on","off","yes","no","0","1"
+ *
+ * @param text sequence to check
+ * @param offset offset to start
+ * @param length length to check
+ *
+ * @deprecated Only kept to provide automatic upgrades for pre 6.0 indices. Use {@link #isBoolean(char[], int, int)} instead.
*/
- public static boolean isExplicitTrue(String value) {
- return value != null && (value.equals("true") || value.equals("1") || value.equals("on") || value.equals("yes"));
+ @Deprecated
+ public static boolean isBooleanLenient(char[] text, int offset, int length) {
+ if (text == null || length == 0) {
+ return false;
+ }
+ if (length == 1) {
+ return text[offset] == '0' || text[offset] == '1';
+ }
+ if (length == 2) {
+ return (text[offset] == 'n' && text[offset + 1] == 'o') || (text[offset] == 'o' && text[offset + 1] == 'n');
+ }
+ if (length == 3) {
+ return (text[offset] == 'o' && text[offset + 1] == 'f' && text[offset + 2] == 'f') ||
+ (text[offset] == 'y' && text[offset + 1] == 'e' && text[offset + 2] == 's');
+ }
+ if (length == 4) {
+ return (text[offset] == 't' && text[offset + 1] == 'r' && text[offset + 2] == 'u' && text[offset + 3] == 'e');
+ }
+ if (length == 5) {
+ return (text[offset] == 'f' && text[offset + 1] == 'a' && text[offset + 2] == 'l' && text[offset + 3] == 's' &&
+ text[offset + 4] == 'e');
+ }
+ return false;
}
}
diff --git a/core/src/main/java/org/elasticsearch/common/TriFunction.java b/core/src/main/java/org/elasticsearch/common/TriFunction.java
new file mode 100644
index 0000000000..85655863a4
--- /dev/null
+++ b/core/src/main/java/org/elasticsearch/common/TriFunction.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to Elasticsearch under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.elasticsearch.common;
+
+/**
+ * Represents a function that accepts three arguments and produces a result.
+ *
+ * @param <S> the type of the first argument
+ * @param <T> the type of the second argument
+ * @param <U> the type of the third argument
+ * @param <R> the return type
+ */
+@FunctionalInterface
+public interface TriFunction<S, T, U, R> {
+ /**
+ * Applies this function to the given arguments.
+ *
+ * @param s the first function argument
+ * @param t the second function argument
+ * @param u the third function argument
+ * @return the result
+ */
+ R apply(S s, T t, U u);
+}
diff --git a/core/src/main/java/org/elasticsearch/common/settings/Setting.java b/core/src/main/java/org/elasticsearch/common/settings/Setting.java
index 45ebe1b061..74e10bd6e1 100644
--- a/core/src/main/java/org/elasticsearch/common/settings/Setting.java
+++ b/core/src/main/java/org/elasticsearch/common/settings/Setting.java
@@ -668,15 +668,15 @@ public class Setting<T> extends ToXContentToBytes {
}
public static Setting<Boolean> boolSetting(String key, boolean defaultValue, Property... properties) {
- return new Setting<>(key, (s) -> Boolean.toString(defaultValue), Booleans::parseBooleanExact, properties);
+ return new Setting<>(key, (s) -> Boolean.toString(defaultValue), Booleans::parseBoolean, properties);
}
public static Setting<Boolean> boolSetting(String key, Setting<Boolean> fallbackSetting, Property... properties) {
- return new Setting<>(key, fallbackSetting, Booleans::parseBooleanExact, properties);
+ return new Setting<>(key, fallbackSetting, Booleans::parseBoolean, properties);
}
public static Setting<Boolean> boolSetting(String key, Function<Settings, String> defaultValueFn, Property... properties) {
- return new Setting<>(key, defaultValueFn, Booleans::parseBooleanExact, properties);
+ return new Setting<>(key, defaultValueFn, Booleans::parseBoolean, properties);
}
public static Setting<ByteSizeValue> byteSizeSetting(String key, ByteSizeValue value, Property... properties) {
diff --git a/core/src/main/java/org/elasticsearch/common/settings/Settings.java b/core/src/main/java/org/elasticsearch/common/settings/Settings.java
index ef9ff00a1f..e588b28b63 100644
--- a/core/src/main/java/org/elasticsearch/common/settings/Settings.java
+++ b/core/src/main/java/org/elasticsearch/common/settings/Settings.java
@@ -26,6 +26,8 @@ import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.Streams;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
+import org.elasticsearch.common.logging.DeprecationLogger;
+import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.settings.loader.SettingsLoader;
import org.elasticsearch.common.settings.loader.SettingsLoaderFactory;
import org.elasticsearch.common.unit.ByteSizeUnit;
@@ -74,6 +76,7 @@ import static org.elasticsearch.common.unit.TimeValue.parseTimeValue;
* An immutable settings implementation.
*/
public final class Settings implements ToXContent {
+ private static final DeprecationLogger deprecationLogger = new DeprecationLogger(Loggers.getLogger(Settings.class));
public static final Settings EMPTY = new Builder().build();
private static final Pattern ARRAY_PATTERN = Pattern.compile("(.*)\\.\\d+$");
@@ -313,6 +316,32 @@ public final class Settings implements ToXContent {
return Booleans.parseBoolean(get(setting), defaultValue);
}
+ // TODO #22298: Delete this method and update call sites to <code>#getAsBoolean(String, Boolean)</code>.
+ /**
+ * Returns the setting value (as boolean) associated with the setting key. If it does not exist, returns the default value provided.
+ * If the index was created on Elasticsearch below 6.0, booleans will be parsed leniently otherwise they are parsed strictly.
+ *
+ * See {@link Booleans#isBooleanLenient(char[], int, int)} for the definition of a "lenient boolean"
+ * and {@link Booleans#isBoolean(char[], int, int)} for the definition of a "strict boolean".
+ *
+ * @deprecated Only used to provide automatic upgrades for pre 6.0 indices.
+ */
+ @Deprecated
+ public Boolean getAsBooleanLenientForPreEs6Indices(Version indexVersion, String setting, Boolean defaultValue) {
+ if (indexVersion.before(Version.V_6_0_0_alpha1_UNRELEASED)) {
+ //Only emit a warning if the setting's value is not a proper boolean
+ final String value = get(setting, "false");
+ if (Booleans.isBoolean(value) == false) {
+ @SuppressWarnings("deprecation")
+ boolean convertedValue = Booleans.parseBooleanLenient(get(setting), defaultValue);
+ deprecationLogger.deprecated("The value [{}] of setting [{}] is not coerced into boolean anymore. Please change " +
+ "this value to [{}].", value, setting, String.valueOf(convertedValue));
+ return convertedValue;
+ }
+ }
+ return getAsBoolean(setting, defaultValue);
+ }
+
/**
* Returns the setting value (as time) associated with the setting key. If it does not exists,
* returns the default value provided.
diff --git a/core/src/main/java/org/elasticsearch/common/xcontent/XContent.java b/core/src/main/java/org/elasticsearch/common/xcontent/XContent.java
index e7dbeafe5d..879b9e9d72 100644
--- a/core/src/main/java/org/elasticsearch/common/xcontent/XContent.java
+++ b/core/src/main/java/org/elasticsearch/common/xcontent/XContent.java
@@ -52,7 +52,7 @@ public interface XContent {
*/
static boolean isStrictDuplicateDetectionEnabled() {
// Don't allow duplicate keys in JSON content by default but let the user opt out
- return Booleans.parseBooleanExact(System.getProperty("es.xcontent.strict_duplicate_detection", "true"));
+ return Booleans.parseBoolean(System.getProperty("es.xcontent.strict_duplicate_detection", "true"));
}
/**
diff --git a/core/src/main/java/org/elasticsearch/common/xcontent/XContentParser.java b/core/src/main/java/org/elasticsearch/common/xcontent/XContentParser.java
index 7ca7744226..e1f1c4b3f8 100644
--- a/core/src/main/java/org/elasticsearch/common/xcontent/XContentParser.java
+++ b/core/src/main/java/org/elasticsearch/common/xcontent/XContentParser.java
@@ -202,15 +202,31 @@ public interface XContentParser extends Releasable {
double doubleValue() throws IOException;
/**
+ * @return true iff the current value is either boolean (<code>true</code> or <code>false</code>) or one of "false", "true".
+ */
+ boolean isBooleanValue() throws IOException;
+
+ boolean booleanValue() throws IOException;
+
+ // TODO #22298: Remove this method and replace all call sites with #isBooleanValue()
+ /**
* returns true if the current value is boolean in nature.
* values that are considered booleans:
* - boolean value (true/false)
* - numeric integers (=0 is considered as false, !=0 is true)
* - one of the following strings: "true","false","on","off","yes","no","1","0"
+ *
+ * @deprecated Just present for providing backwards compatibility. Use {@link #isBooleanValue()} instead.
*/
- boolean isBooleanValue() throws IOException;
+ @Deprecated
+ boolean isBooleanValueLenient() throws IOException;
- boolean booleanValue() throws IOException;
+ // TODO #22298: Remove this method and replace all call sites with #booleanValue()
+ /**
+ * @deprecated Just present for providing backwards compatibility. Use {@link #booleanValue()} instead.
+ */
+ @Deprecated
+ boolean booleanValueLenient() throws IOException;
/**
* Reads a plain binary value that was written via one of the following methods:
diff --git a/core/src/main/java/org/elasticsearch/common/xcontent/support/AbstractXContentParser.java b/core/src/main/java/org/elasticsearch/common/xcontent/support/AbstractXContentParser.java
index 162e5f7fb7..95fe08d96c 100644
--- a/core/src/main/java/org/elasticsearch/common/xcontent/support/AbstractXContentParser.java
+++ b/core/src/main/java/org/elasticsearch/common/xcontent/support/AbstractXContentParser.java
@@ -77,23 +77,46 @@ public abstract class AbstractXContentParser implements XContentParser {
switch (currentToken()) {
case VALUE_BOOLEAN:
return true;
+ case VALUE_STRING:
+ return Booleans.isBoolean(textCharacters(), textOffset(), textLength());
+ default:
+ return false;
+ }
+ }
+
+ @Override
+ public boolean booleanValue() throws IOException {
+ Token token = currentToken();
+ if (token == Token.VALUE_STRING) {
+ return Booleans.parseBoolean(textCharacters(), textOffset(), textLength(), false /* irrelevant */);
+ }
+ return doBooleanValue();
+ }
+
+ @Override
+ @Deprecated
+ public boolean isBooleanValueLenient() throws IOException {
+ switch (currentToken()) {
+ case VALUE_BOOLEAN:
+ return true;
case VALUE_NUMBER:
NumberType numberType = numberType();
return numberType == NumberType.LONG || numberType == NumberType.INT;
case VALUE_STRING:
- return Booleans.isBoolean(textCharacters(), textOffset(), textLength());
+ return Booleans.isBooleanLenient(textCharacters(), textOffset(), textLength());
default:
return false;
}
}
@Override
- public boolean booleanValue() throws IOException {
+ @Deprecated
+ public boolean booleanValueLenient() throws IOException {
Token token = currentToken();
if (token == Token.VALUE_NUMBER) {
return intValue() != 0;
} else if (token == Token.VALUE_STRING) {
- return Booleans.parseBoolean(textCharacters(), textOffset(), textLength(), false /* irrelevant */);
+ return Booleans.parseBooleanLenient(textCharacters(), textOffset(), textLength(), false /* irrelevant */);
}
return doBooleanValue();
}
diff --git a/core/src/main/java/org/elasticsearch/common/xcontent/support/XContentMapValues.java b/core/src/main/java/org/elasticsearch/common/xcontent/support/XContentMapValues.java
index 09d9dabac7..36eacb81f8 100644
--- a/core/src/main/java/org/elasticsearch/common/xcontent/support/XContentMapValues.java
+++ b/core/src/main/java/org/elasticsearch/common/xcontent/support/XContentMapValues.java
@@ -24,6 +24,7 @@ import org.apache.lucene.util.automaton.Automaton;
import org.apache.lucene.util.automaton.CharacterRunAutomaton;
import org.apache.lucene.util.automaton.Operations;
import org.elasticsearch.ElasticsearchParseException;
+import org.elasticsearch.common.Booleans;
import org.elasticsearch.common.Numbers;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.regex.Regex;
@@ -412,39 +413,29 @@ public class XContentMapValues {
return Long.parseLong(node.toString());
}
- /**
- * This method is very lenient, use {@link #nodeBooleanValue} instead.
- */
- public static boolean lenientNodeBooleanValue(Object node, boolean defaultValue) {
- if (node == null) {
- return defaultValue;
+ public static boolean nodeBooleanValue(Object node, String name, boolean defaultValue) {
+ try {
+ return nodeBooleanValue(node, defaultValue);
+ } catch (IllegalArgumentException ex) {
+ throw new IllegalArgumentException("Could not convert [" + name + "] to boolean", ex);
}
- return lenientNodeBooleanValue(node);
}
- /**
- * This method is very lenient, use {@link #nodeBooleanValue} instead.
- */
- public static boolean lenientNodeBooleanValue(Object node) {
- if (node instanceof Boolean) {
- return (Boolean) node;
- }
- if (node instanceof Number) {
- return ((Number) node).intValue() != 0;
+ public static boolean nodeBooleanValue(Object node, boolean defaultValue) {
+ String nodeValue = node == null ? null : node.toString();
+ return Booleans.parseBoolean(nodeValue, defaultValue);
+ }
+
+ public static boolean nodeBooleanValue(Object node, String name) {
+ try {
+ return nodeBooleanValue(node);
+ } catch (IllegalArgumentException ex) {
+ throw new IllegalArgumentException("Could not convert [" + name + "] to boolean", ex);
}
- String value = node.toString();
- return !(value.equals("false") || value.equals("0") || value.equals("off"));
}
public static boolean nodeBooleanValue(Object node) {
- switch (node.toString()) {
- case "true":
- return true;
- case "false":
- return false;
- default:
- throw new IllegalArgumentException("Can't parse boolean value [" + node + "], expected [true] or [false]");
- }
+ return Booleans.parseBoolean(node.toString());
}
public static TimeValue nodeTimeValue(Object node, TimeValue defaultValue) {
diff --git a/core/src/main/java/org/elasticsearch/gateway/PrimaryShardAllocator.java b/core/src/main/java/org/elasticsearch/gateway/PrimaryShardAllocator.java
index e930f327f0..927397725b 100644
--- a/core/src/main/java/org/elasticsearch/gateway/PrimaryShardAllocator.java
+++ b/core/src/main/java/org/elasticsearch/gateway/PrimaryShardAllocator.java
@@ -477,9 +477,11 @@ public abstract class PrimaryShardAllocator extends BaseGatewayShardAllocator {
*/
private boolean recoverOnAnyNode(IndexMetaData metaData) {
// don't use the setting directly, not to trigger verbose deprecation logging
- return (IndexMetaData.isOnSharedFilesystem(metaData.getSettings()) || IndexMetaData.isOnSharedFilesystem(this.settings))
- && (metaData.getSettings().getAsBoolean(IndexMetaData.SETTING_SHARED_FS_ALLOW_RECOVERY_ON_ANY_NODE, false) ||
- this.settings.getAsBoolean(IndexMetaData.SETTING_SHARED_FS_ALLOW_RECOVERY_ON_ANY_NODE, false));
+ return (metaData.isOnSharedFilesystem(metaData.getSettings()) || metaData.isOnSharedFilesystem(this.settings))
+ && (metaData.getSettings().getAsBooleanLenientForPreEs6Indices(
+ metaData.getCreationVersion(), IndexMetaData.SETTING_SHARED_FS_ALLOW_RECOVERY_ON_ANY_NODE, false) ||
+ this.settings.getAsBooleanLenientForPreEs6Indices
+ (metaData.getCreationVersion(), IndexMetaData.SETTING_SHARED_FS_ALLOW_RECOVERY_ON_ANY_NODE, false));
}
protected abstract FetchResult<NodeGatewayStartedShards> fetchData(ShardRouting shard, RoutingAllocation allocation);
diff --git a/core/src/main/java/org/elasticsearch/index/IndexModule.java b/core/src/main/java/org/elasticsearch/index/IndexModule.java
index 97edd2fd46..25e32dc0de 100644
--- a/core/src/main/java/org/elasticsearch/index/IndexModule.java
+++ b/core/src/main/java/org/elasticsearch/index/IndexModule.java
@@ -23,6 +23,7 @@ import org.apache.lucene.util.SetOnce;
import org.elasticsearch.client.Client;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.Strings;
+import org.elasticsearch.common.TriFunction;
import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.common.settings.Setting.Property;
import org.elasticsearch.common.settings.Settings;
@@ -69,7 +70,7 @@ import java.util.function.Function;
* IndexModule represents the central extension point for index level custom implementations like:
* <ul>
* <li>{@link SimilarityProvider} - New {@link SimilarityProvider} implementations can be registered through
- * {@link #addSimilarity(String, BiFunction)}while existing Providers can be referenced through Settings under the
+ * {@link #addSimilarity(String, TriFunction)}while existing Providers can be referenced through Settings under the
* {@link IndexModule#SIMILARITY_SETTINGS_PREFIX} prefix along with the "type" value. For example, to reference the
* {@link BM25SimilarityProvider}, the configuration <tt>"index.similarity.my_similarity.type : "BM25"</tt> can be used.</li>
* <li>{@link IndexStore} - Custom {@link IndexStore} instances can be registered via {@link #addIndexStore(String, Function)}</li>
@@ -112,7 +113,7 @@ public final class IndexModule {
final SetOnce<EngineFactory> engineFactory = new SetOnce<>();
private SetOnce<IndexSearcherWrapperFactory> indexSearcherWrapper = new SetOnce<>();
private final Set<IndexEventListener> indexEventListeners = new HashSet<>();
- private final Map<String, BiFunction<String, Settings, SimilarityProvider>> similarities = new HashMap<>();
+ private final Map<String, TriFunction<String, Settings, Settings, SimilarityProvider>> similarities = new HashMap<>();
private final Map<String, Function<IndexSettings, IndexStore>> storeTypes = new HashMap<>();
private final SetOnce<BiFunction<IndexSettings, IndicesQueryCache, QueryCache>> forceQueryCacheProvider = new SetOnce<>();
private final List<SearchOperationListener> searchOperationListeners = new ArrayList<>();
@@ -256,7 +257,7 @@ public final class IndexModule {
* @param name Name of the SimilarityProvider
* @param similarity SimilarityProvider to register
*/
- public void addSimilarity(String name, BiFunction<String, Settings, SimilarityProvider> similarity) {
+ public void addSimilarity(String name, TriFunction<String, Settings, Settings, SimilarityProvider> similarity) {
ensureNotFrozen();
if (similarities.containsKey(name) || SimilarityService.BUILT_IN.containsKey(name)) {
throw new IllegalArgumentException("similarity for name: [" + name + " is already registered");
diff --git a/core/src/main/java/org/elasticsearch/index/IndexService.java b/core/src/main/java/org/elasticsearch/index/IndexService.java
index 50fdb5272c..25e2666343 100644
--- a/core/src/main/java/org/elasticsearch/index/IndexService.java
+++ b/core/src/main/java/org/elasticsearch/index/IndexService.java
@@ -343,8 +343,8 @@ public class IndexService extends AbstractIndexComponent implements IndicesClust
logger.debug("creating shard_id {}", shardId);
// if we are on a shared FS we only own the shard (ie. we can safely delete it) if we are the primary.
- final boolean canDeleteShardContent = IndexMetaData.isOnSharedFilesystem(indexSettings) == false ||
- (primary && IndexMetaData.isOnSharedFilesystem(indexSettings));
+ final boolean canDeleteShardContent = this.indexSettings.isOnSharedFilesystem() == false ||
+ (primary && this.indexSettings.isOnSharedFilesystem());
final Engine.Warmer engineWarmer = (searcher) -> {
IndexShard shard = getShardOrNull(shardId.getId());
if (shard != null) {
@@ -353,7 +353,7 @@ public class IndexService extends AbstractIndexComponent implements IndicesClust
};
store = new Store(shardId, this.indexSettings, indexStore.newDirectoryService(path), lock,
new StoreCloseListener(shardId, canDeleteShardContent, () -> eventListener.onStoreClosed(shardId)));
- if (useShadowEngine(primary, indexSettings)) {
+ if (useShadowEngine(primary, this.indexSettings)) {
indexShard = new ShadowIndexShard(routing, this.indexSettings, path, store, indexCache, mapperService, similarityService,
indexFieldData, engineFactory, eventListener, searcherWrapper, threadPool, bigArrays, engineWarmer,
searchOperationListeners);
@@ -381,8 +381,8 @@ public class IndexService extends AbstractIndexComponent implements IndicesClust
}
}
- static boolean useShadowEngine(boolean primary, Settings indexSettings) {
- return primary == false && IndexMetaData.isIndexUsingShadowReplicas(indexSettings);
+ static boolean useShadowEngine(boolean primary, IndexSettings indexSettings) {
+ return primary == false && indexSettings.isShadowReplicaIndex();
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/IndexSettings.java b/core/src/main/java/org/elasticsearch/index/IndexSettings.java
index 25751cfc77..260cb593a8 100644
--- a/core/src/main/java/org/elasticsearch/index/IndexSettings.java
+++ b/core/src/main/java/org/elasticsearch/index/IndexSettings.java
@@ -229,7 +229,7 @@ public final class IndexSettings {
nodeName = Node.NODE_NAME_SETTING.get(settings);
this.indexMetaData = indexMetaData;
numberOfShards = settings.getAsInt(IndexMetaData.SETTING_NUMBER_OF_SHARDS, null);
- isShadowReplicaIndex = IndexMetaData.isIndexUsingShadowReplicas(settings);
+ isShadowReplicaIndex = indexMetaData.isIndexUsingShadowReplicas(settings);
this.defaultField = DEFAULT_FIELD_SETTING.get(settings);
this.queryStringLenient = QUERY_STRING_LENIENT_SETTING.get(settings);
@@ -327,16 +327,7 @@ public final class IndexSettings {
* filesystem.
*/
public boolean isOnSharedFilesystem() {
- return IndexMetaData.isOnSharedFilesystem(getSettings());
- }
-
- /**
- * Returns <code>true</code> iff the given settings indicate that the index associated
- * with these settings uses shadow replicas. Otherwise <code>false</code>. The default
- * setting for this is <code>false</code>.
- */
- public boolean isIndexUsingShadowReplicas() {
- return IndexMetaData.isOnSharedFilesystem(getSettings());
+ return indexMetaData.isOnSharedFilesystem(getSettings());
}
/**
diff --git a/core/src/main/java/org/elasticsearch/index/MergePolicyConfig.java b/core/src/main/java/org/elasticsearch/index/MergePolicyConfig.java
index 0f7305789e..c2625f7615 100644
--- a/core/src/main/java/org/elasticsearch/index/MergePolicyConfig.java
+++ b/core/src/main/java/org/elasticsearch/index/MergePolicyConfig.java
@@ -164,7 +164,8 @@ public final class MergePolicyConfig {
ByteSizeValue maxMergedSegment = indexSettings.getValue(INDEX_MERGE_POLICY_MAX_MERGED_SEGMENT_SETTING);
double segmentsPerTier = indexSettings.getValue(INDEX_MERGE_POLICY_SEGMENTS_PER_TIER_SETTING);
double reclaimDeletesWeight = indexSettings.getValue(INDEX_MERGE_POLICY_RECLAIM_DELETES_WEIGHT_SETTING);
- this.mergesEnabled = indexSettings.getSettings().getAsBoolean(INDEX_MERGE_ENABLED, true);
+ this.mergesEnabled = indexSettings.getSettings()
+ .getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), INDEX_MERGE_ENABLED, true);
if (mergesEnabled == false) {
logger.warn("[{}] is set to false, this should only be used in tests and can cause serious problems in production environments", INDEX_MERGE_ENABLED);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/ASCIIFoldingTokenFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/ASCIIFoldingTokenFilterFactory.java
index 4318ef273d..1486382521 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/ASCIIFoldingTokenFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/ASCIIFoldingTokenFilterFactory.java
@@ -37,7 +37,8 @@ public class ASCIIFoldingTokenFilterFactory extends AbstractTokenFilterFactory i
public ASCIIFoldingTokenFilterFactory(IndexSettings indexSettings, Environment environment, String name, Settings settings) {
super(indexSettings, name, settings);
- preserveOriginal = settings.getAsBoolean(PRESERVE_ORIGINAL.getPreferredName(), DEFAULT_PRESERVE_ORIGINAL);
+ preserveOriginal = settings.getAsBooleanLenientForPreEs6Indices(
+ indexSettings.getIndexVersionCreated(), PRESERVE_ORIGINAL.getPreferredName(), DEFAULT_PRESERVE_ORIGINAL);
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/Analysis.java b/core/src/main/java/org/elasticsearch/index/analysis/Analysis.java
index aded2bb4ee..170e35905d 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/Analysis.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/Analysis.java
@@ -178,12 +178,15 @@ public class Analysis {
return parseWords(env, settings, "common_words", defaultCommonWords, NAMED_STOP_WORDS, ignoreCase);
}
- public static CharArraySet parseArticles(Environment env, Settings settings) {
- return parseWords(env, settings, "articles", null, null, settings.getAsBoolean("articles_case", false));
+ public static CharArraySet parseArticles(Environment env, org.elasticsearch.Version indexCreatedVersion, Settings settings) {
+ boolean articlesCase = settings.getAsBooleanLenientForPreEs6Indices(indexCreatedVersion, "articles_case", false);
+ return parseWords(env, settings, "articles", null, null, articlesCase);
}
- public static CharArraySet parseStopWords(Environment env, Settings settings, CharArraySet defaultStopWords) {
- return parseStopWords(env, settings, defaultStopWords, settings.getAsBoolean("stopwords_case", false));
+ public static CharArraySet parseStopWords(Environment env, org.elasticsearch.Version indexCreatedVersion, Settings settings,
+ CharArraySet defaultStopWords) {
+ boolean stopwordsCase = settings.getAsBooleanLenientForPreEs6Indices(indexCreatedVersion, "stopwords_case", false);
+ return parseStopWords(env, settings, defaultStopWords, stopwordsCase);
}
public static CharArraySet parseStopWords(Environment env, Settings settings, CharArraySet defaultStopWords, boolean ignoreCase) {
@@ -205,12 +208,14 @@ public class Analysis {
return setWords;
}
- public static CharArraySet getWordSet(Environment env, Settings settings, String settingsPrefix) {
+ public static CharArraySet getWordSet(Environment env, org.elasticsearch.Version indexCreatedVersion, Settings settings,
+ String settingsPrefix) {
List<String> wordList = getWordList(env, settings, settingsPrefix);
if (wordList == null) {
return null;
}
- return new CharArraySet(wordList, settings.getAsBoolean(settingsPrefix + "_case", false));
+ boolean ignoreCase = settings.getAsBooleanLenientForPreEs6Indices(indexCreatedVersion, settingsPrefix + "_case", false);
+ return new CharArraySet(wordList, ignoreCase);
}
/**
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/ArabicAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/ArabicAnalyzerProvider.java
index fffa594b9e..10d8f22bde 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/ArabicAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/ArabicAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class ArabicAnalyzerProvider extends AbstractIndexAnalyzerProvider<Arabic
public ArabicAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- arabicAnalyzer = new ArabicAnalyzer(Analysis.parseStopWords(env, settings, ArabicAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ arabicAnalyzer = new ArabicAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, ArabicAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
arabicAnalyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/ArmenianAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/ArmenianAnalyzerProvider.java
index c53d9da867..6c5193bbb7 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/ArmenianAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/ArmenianAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class ArmenianAnalyzerProvider extends AbstractIndexAnalyzerProvider<Arme
public ArmenianAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new ArmenianAnalyzer(Analysis.parseStopWords(env, settings, ArmenianAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new ArmenianAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, ArmenianAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/BasqueAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/BasqueAnalyzerProvider.java
index cd91cb7522..d55e3fdcba 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/BasqueAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/BasqueAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class BasqueAnalyzerProvider extends AbstractIndexAnalyzerProvider<Basque
public BasqueAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new BasqueAnalyzer(Analysis.parseStopWords(env, settings, BasqueAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new BasqueAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, BasqueAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/BrazilianAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/BrazilianAnalyzerProvider.java
index c2640390f2..7ca11542ac 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/BrazilianAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/BrazilianAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class BrazilianAnalyzerProvider extends AbstractIndexAnalyzerProvider<Bra
public BrazilianAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new BrazilianAnalyzer(Analysis.parseStopWords(env, settings, BrazilianAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new BrazilianAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, BrazilianAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/BulgarianAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/BulgarianAnalyzerProvider.java
index b1017a1ee7..f64987d95e 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/BulgarianAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/BulgarianAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class BulgarianAnalyzerProvider extends AbstractIndexAnalyzerProvider<Bul
public BulgarianAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new BulgarianAnalyzer(Analysis.parseStopWords(env, settings, BulgarianAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new BulgarianAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, BulgarianAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/CJKBigramFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/CJKBigramFilterFactory.java
index d7d5139bed..efc5d32868 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/CJKBigramFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/CJKBigramFilterFactory.java
@@ -50,7 +50,7 @@ public final class CJKBigramFilterFactory extends AbstractTokenFilterFactory {
public CJKBigramFilterFactory(IndexSettings indexSettings, Environment environment, String name, Settings settings) {
super(indexSettings, name, settings);
- outputUnigrams = settings.getAsBoolean("output_unigrams", false);
+ outputUnigrams = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "output_unigrams", false);
final String[] asArray = settings.getAsArray("ignored_scripts");
Set<String> scripts = new HashSet<>(Arrays.asList("han", "hiragana", "katakana", "hangul"));
if (asArray != null) {
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/CatalanAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/CatalanAnalyzerProvider.java
index 25328421f9..ff0f9e3230 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/CatalanAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/CatalanAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class CatalanAnalyzerProvider extends AbstractIndexAnalyzerProvider<Catal
public CatalanAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new CatalanAnalyzer(Analysis.parseStopWords(env, settings, CatalanAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new CatalanAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, CatalanAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/CjkAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/CjkAnalyzerProvider.java
index dd7f61f706..a10c539faa 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/CjkAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/CjkAnalyzerProvider.java
@@ -31,7 +31,8 @@ public class CjkAnalyzerProvider extends AbstractIndexAnalyzerProvider<CJKAnalyz
public CjkAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- CharArraySet stopWords = Analysis.parseStopWords(env, settings, CJKAnalyzer.getDefaultStopSet());
+ CharArraySet stopWords = Analysis.parseStopWords(
+ env, indexSettings.getIndexVersionCreated(), settings, CJKAnalyzer.getDefaultStopSet());
analyzer = new CJKAnalyzer(stopWords);
analyzer.setVersion(version);
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/CommonGramsTokenFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/CommonGramsTokenFilterFactory.java
index eb6dae8206..54ffdd1276 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/CommonGramsTokenFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/CommonGramsTokenFilterFactory.java
@@ -37,8 +37,8 @@ public class CommonGramsTokenFilterFactory extends AbstractTokenFilterFactory {
public CommonGramsTokenFilterFactory(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- this.ignoreCase = settings.getAsBoolean("ignore_case", false);
- this.queryMode = settings.getAsBoolean("query_mode", false);
+ this.ignoreCase = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "ignore_case", false);
+ this.queryMode = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "query_mode", false);
this.words = Analysis.parseCommonWords(env, settings, null, ignoreCase);
if (this.words == null) {
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/CzechAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/CzechAnalyzerProvider.java
index f93e9e16e5..27d20beef4 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/CzechAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/CzechAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class CzechAnalyzerProvider extends AbstractIndexAnalyzerProvider<CzechAn
public CzechAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new CzechAnalyzer(Analysis.parseStopWords(env, settings, CzechAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new CzechAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, CzechAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/DanishAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/DanishAnalyzerProvider.java
index 22e4dc07d0..897997992b 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/DanishAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/DanishAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class DanishAnalyzerProvider extends AbstractIndexAnalyzerProvider<Danish
public DanishAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new DanishAnalyzer(Analysis.parseStopWords(env, settings, DanishAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new DanishAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, DanishAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/DutchAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/DutchAnalyzerProvider.java
index c747a9a5a3..eaa69e939c 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/DutchAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/DutchAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class DutchAnalyzerProvider extends AbstractIndexAnalyzerProvider<DutchAn
public DutchAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new DutchAnalyzer(Analysis.parseStopWords(env, settings, DutchAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new DutchAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, DutchAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/ElisionTokenFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/ElisionTokenFilterFactory.java
index 0859824370..401f2caf03 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/ElisionTokenFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/ElisionTokenFilterFactory.java
@@ -32,7 +32,7 @@ public class ElisionTokenFilterFactory extends AbstractTokenFilterFactory implem
public ElisionTokenFilterFactory(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- this.articles = Analysis.parseArticles(env, settings);
+ this.articles = Analysis.parseArticles(env, indexSettings.getIndexVersionCreated(), settings);
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/EnglishAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/EnglishAnalyzerProvider.java
index d124f27db5..952f43296f 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/EnglishAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/EnglishAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class EnglishAnalyzerProvider extends AbstractIndexAnalyzerProvider<Engli
public EnglishAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new EnglishAnalyzer(Analysis.parseStopWords(env, settings, EnglishAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new EnglishAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, EnglishAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/FingerprintAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/FingerprintAnalyzerProvider.java
index 490b90efb7..fa0ce5223f 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/FingerprintAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/FingerprintAnalyzerProvider.java
@@ -45,7 +45,7 @@ public class FingerprintAnalyzerProvider extends AbstractIndexAnalyzerProvider<A
char separator = FingerprintTokenFilterFactory.parseSeparator(settings);
int maxOutputSize = settings.getAsInt(MAX_OUTPUT_SIZE.getPreferredName(),DEFAULT_MAX_OUTPUT_SIZE);
- CharArraySet stopWords = Analysis.parseStopWords(env, settings, DEFAULT_STOP_WORDS);
+ CharArraySet stopWords = Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, DEFAULT_STOP_WORDS);
this.analyzer = new FingerprintAnalyzer(stopWords, separator, maxOutputSize);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/FinnishAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/FinnishAnalyzerProvider.java
index 5f728619f9..b914fab66f 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/FinnishAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/FinnishAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class FinnishAnalyzerProvider extends AbstractIndexAnalyzerProvider<Finni
public FinnishAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new FinnishAnalyzer(Analysis.parseStopWords(env, settings, FinnishAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new FinnishAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, FinnishAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/FrenchAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/FrenchAnalyzerProvider.java
index f312161819..96cdb8ed03 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/FrenchAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/FrenchAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class FrenchAnalyzerProvider extends AbstractIndexAnalyzerProvider<French
public FrenchAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new FrenchAnalyzer(Analysis.parseStopWords(env, settings, FrenchAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new FrenchAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, FrenchAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/GalicianAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/GalicianAnalyzerProvider.java
index 646fa9fa68..1dc6de99a4 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/GalicianAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/GalicianAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class GalicianAnalyzerProvider extends AbstractIndexAnalyzerProvider<Gali
public GalicianAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new GalicianAnalyzer(Analysis.parseStopWords(env, settings, GalicianAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new GalicianAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, GalicianAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/GermanAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/GermanAnalyzerProvider.java
index c11ac7eb9b..52a116acca 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/GermanAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/GermanAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class GermanAnalyzerProvider extends AbstractIndexAnalyzerProvider<German
public GermanAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new GermanAnalyzer(Analysis.parseStopWords(env, settings, GermanAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new GermanAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, GermanAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/GreekAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/GreekAnalyzerProvider.java
index 625acddfad..012fc64c97 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/GreekAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/GreekAnalyzerProvider.java
@@ -30,7 +30,8 @@ public class GreekAnalyzerProvider extends AbstractIndexAnalyzerProvider<GreekAn
public GreekAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new GreekAnalyzer(Analysis.parseStopWords(env, settings, GreekAnalyzer.getDefaultStopSet()));
+ analyzer = new GreekAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, GreekAnalyzer.getDefaultStopSet()));
analyzer.setVersion(version);
}
@@ -38,4 +39,4 @@ public class GreekAnalyzerProvider extends AbstractIndexAnalyzerProvider<GreekAn
public GreekAnalyzer get() {
return this.analyzer;
}
-} \ No newline at end of file
+}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/HindiAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/HindiAnalyzerProvider.java
index 123117abce..43ebe2677a 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/HindiAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/HindiAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class HindiAnalyzerProvider extends AbstractIndexAnalyzerProvider<HindiAn
public HindiAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new HindiAnalyzer(Analysis.parseStopWords(env, settings, HindiAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new HindiAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, HindiAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/HungarianAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/HungarianAnalyzerProvider.java
index 99268ee7ee..81745ba0f2 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/HungarianAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/HungarianAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class HungarianAnalyzerProvider extends AbstractIndexAnalyzerProvider<Hun
public HungarianAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new HungarianAnalyzer(Analysis.parseStopWords(env, settings, HungarianAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new HungarianAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, HungarianAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/HunspellTokenFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/HunspellTokenFilterFactory.java
index 357d4dc240..a1eb3cd3a1 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/HunspellTokenFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/HunspellTokenFilterFactory.java
@@ -33,7 +33,7 @@ public class HunspellTokenFilterFactory extends AbstractTokenFilterFactory {
private final boolean dedup;
private final boolean longestOnly;
- public HunspellTokenFilterFactory(IndexSettings indexSettings, String name, Settings settings, HunspellService hunspellService) {
+ public HunspellTokenFilterFactory(IndexSettings indexSettings, String name, Settings settings, HunspellService hunspellService) {
super(indexSettings, name, settings);
String locale = settings.get("locale", settings.get("language", settings.get("lang", null)));
@@ -46,8 +46,8 @@ public class HunspellTokenFilterFactory extends AbstractTokenFilterFactory {
throw new IllegalArgumentException(String.format(Locale.ROOT, "Unknown hunspell dictionary for locale [%s]", locale));
}
- dedup = settings.getAsBoolean("dedup", true);
- longestOnly = settings.getAsBoolean("longest_only", false);
+ dedup = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "dedup", true);
+ longestOnly = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "longest_only", false);
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/IndonesianAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/IndonesianAnalyzerProvider.java
index 60f40612cd..d563302580 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/IndonesianAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/IndonesianAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class IndonesianAnalyzerProvider extends AbstractIndexAnalyzerProvider<In
public IndonesianAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new IndonesianAnalyzer(Analysis.parseStopWords(env, settings, IndonesianAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new IndonesianAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, IndonesianAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/IrishAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/IrishAnalyzerProvider.java
index 0b27cb73a3..69250df736 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/IrishAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/IrishAnalyzerProvider.java
@@ -34,8 +34,10 @@ public class IrishAnalyzerProvider extends AbstractIndexAnalyzerProvider<IrishAn
public IrishAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new IrishAnalyzer(Analysis.parseStopWords(env, settings, IrishAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new IrishAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, IrishAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/ItalianAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/ItalianAnalyzerProvider.java
index 38f7094bde..7a9ae2d7ab 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/ItalianAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/ItalianAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class ItalianAnalyzerProvider extends AbstractIndexAnalyzerProvider<Itali
public ItalianAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new ItalianAnalyzer(Analysis.parseStopWords(env, settings, ItalianAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new ItalianAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, ItalianAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/KeepWordFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/KeepWordFilterFactory.java
index 334bbab569..631040d233 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/KeepWordFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/KeepWordFilterFactory.java
@@ -50,7 +50,7 @@ public class KeepWordFilterFactory extends AbstractTokenFilterFactory {
private static final String KEEP_WORDS_KEY = "keep_words";
private static final String KEEP_WORDS_PATH_KEY = KEEP_WORDS_KEY + "_path";
private static final String KEEP_WORDS_CASE_KEY = KEEP_WORDS_KEY + "_case"; // for javadoc
-
+
// unsupported ancient option
private static final String ENABLE_POS_INC_KEY = "enable_position_increments";
@@ -68,7 +68,7 @@ public class KeepWordFilterFactory extends AbstractTokenFilterFactory {
if (settings.get(ENABLE_POS_INC_KEY) != null) {
throw new IllegalArgumentException(ENABLE_POS_INC_KEY + " is not supported anymore. Please fix your analysis chain");
}
- this.keepWords = Analysis.getWordSet(env, settings, KEEP_WORDS_KEY);
+ this.keepWords = Analysis.getWordSet(env, indexSettings.getIndexVersionCreated(), settings, KEEP_WORDS_KEY);
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/KeywordMarkerTokenFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/KeywordMarkerTokenFilterFactory.java
index 0805a3bdf8..deafe0e93c 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/KeywordMarkerTokenFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/KeywordMarkerTokenFilterFactory.java
@@ -35,8 +35,8 @@ public class KeywordMarkerTokenFilterFactory extends AbstractTokenFilterFactory
public KeywordMarkerTokenFilterFactory(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- boolean ignoreCase = settings.getAsBoolean("ignore_case", false);
- Set<?> rules = Analysis.getWordSet(env, settings, "keywords");
+ boolean ignoreCase = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "ignore_case", false);
+ Set<?> rules = Analysis.getWordSet(env, indexSettings.getIndexVersionCreated(), settings, "keywords");
if (rules == null) {
throw new IllegalArgumentException("keyword filter requires either `keywords` or `keywords_path` to be configured");
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/LatvianAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/LatvianAnalyzerProvider.java
index a288747ab4..a7731f352b 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/LatvianAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/LatvianAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class LatvianAnalyzerProvider extends AbstractIndexAnalyzerProvider<Latvi
public LatvianAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new LatvianAnalyzer(Analysis.parseStopWords(env, settings, LatvianAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new LatvianAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, LatvianAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/LimitTokenCountFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/LimitTokenCountFilterFactory.java
index ddf6091118..0923e09add 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/LimitTokenCountFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/LimitTokenCountFilterFactory.java
@@ -36,11 +36,12 @@ public class LimitTokenCountFilterFactory extends AbstractTokenFilterFactory {
public LimitTokenCountFilterFactory(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
this.maxTokenCount = settings.getAsInt("max_token_count", DEFAULT_MAX_TOKEN_COUNT);
- this.consumeAllTokens = settings.getAsBoolean("consume_all_tokens", DEFAULT_CONSUME_ALL_TOKENS);
+ this.consumeAllTokens = settings.getAsBooleanLenientForPreEs6Indices(
+ indexSettings.getIndexVersionCreated(), "consume_all_tokens", DEFAULT_CONSUME_ALL_TOKENS);
}
@Override
public TokenStream create(TokenStream tokenStream) {
return new LimitTokenCountFilter(tokenStream, maxTokenCount, consumeAllTokens);
}
-} \ No newline at end of file
+}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/LithuanianAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/LithuanianAnalyzerProvider.java
index 7d180b3e0f..307904b894 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/LithuanianAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/LithuanianAnalyzerProvider.java
@@ -34,8 +34,10 @@ public class LithuanianAnalyzerProvider extends AbstractIndexAnalyzerProvider<Li
public LithuanianAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new LithuanianAnalyzer(Analysis.parseStopWords(env, settings, LithuanianAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new LithuanianAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, LithuanianAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/NorwegianAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/NorwegianAnalyzerProvider.java
index 65a7dff331..ca7d898fb4 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/NorwegianAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/NorwegianAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class NorwegianAnalyzerProvider extends AbstractIndexAnalyzerProvider<Nor
public NorwegianAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new NorwegianAnalyzer(Analysis.parseStopWords(env, settings, NorwegianAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new NorwegianAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, NorwegianAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/PathHierarchyTokenizerFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/PathHierarchyTokenizerFactory.java
index b993024525..0b78620cdb 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/PathHierarchyTokenizerFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/PathHierarchyTokenizerFactory.java
@@ -56,7 +56,7 @@ public class PathHierarchyTokenizerFactory extends AbstractTokenizerFactory {
this.replacement = replacement.charAt(0);
}
this.skip = settings.getAsInt("skip", PathHierarchyTokenizer.DEFAULT_SKIP);
- this.reverse = settings.getAsBoolean("reverse", false);
+ this.reverse = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "reverse", false);
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/PatternAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/PatternAnalyzerProvider.java
index b3bbb872f2..a1ef58bcf3 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/PatternAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/PatternAnalyzerProvider.java
@@ -21,8 +21,6 @@ package org.elasticsearch.index.analysis;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.CharArraySet;
-import org.apache.lucene.analysis.core.StopAnalyzer;
-import org.elasticsearch.Version;
import org.elasticsearch.common.regex.Regex;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.env.Environment;
@@ -38,8 +36,8 @@ public class PatternAnalyzerProvider extends AbstractIndexAnalyzerProvider<Analy
super(indexSettings, name, settings);
final CharArraySet defaultStopwords = CharArraySet.EMPTY_SET;
- boolean lowercase = settings.getAsBoolean("lowercase", true);
- CharArraySet stopWords = Analysis.parseStopWords(env, settings, defaultStopwords);
+ boolean lowercase = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "lowercase", true);
+ CharArraySet stopWords = Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, defaultStopwords);
String sPattern = settings.get("pattern", "\\W+" /*PatternAnalyzer.NON_WORD_PATTERN*/);
if (sPattern == null) {
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/PatternCaptureGroupTokenFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/PatternCaptureGroupTokenFilterFactory.java
index 006fb44736..650db04b7c 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/PatternCaptureGroupTokenFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/PatternCaptureGroupTokenFilterFactory.java
@@ -45,7 +45,7 @@ public class PatternCaptureGroupTokenFilterFactory extends AbstractTokenFilterFa
patterns[i] = Pattern.compile(regexes[i]);
}
- preserveOriginal = settings.getAsBoolean(PRESERVE_ORIG_KEY, true);
+ preserveOriginal = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), PRESERVE_ORIG_KEY, true);
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/PatternReplaceTokenFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/PatternReplaceTokenFilterFactory.java
index a6d22b2be9..09375f1cc6 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/PatternReplaceTokenFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/PatternReplaceTokenFilterFactory.java
@@ -43,7 +43,7 @@ public class PatternReplaceTokenFilterFactory extends AbstractTokenFilterFactory
}
this.pattern = Regex.compile(sPattern, settings.get("flags"));
this.replacement = settings.get("replacement", "");
- this.all = settings.getAsBoolean("all", true);
+ this.all = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "all", true);
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/PersianAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/PersianAnalyzerProvider.java
index 2c5b427e51..ed92e3e0c0 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/PersianAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/PersianAnalyzerProvider.java
@@ -30,7 +30,8 @@ public class PersianAnalyzerProvider extends AbstractIndexAnalyzerProvider<Persi
public PersianAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new PersianAnalyzer(Analysis.parseStopWords(env, settings, PersianAnalyzer.getDefaultStopSet()));
+ analyzer = new PersianAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, PersianAnalyzer.getDefaultStopSet()));
analyzer.setVersion(version);
}
@@ -38,4 +39,4 @@ public class PersianAnalyzerProvider extends AbstractIndexAnalyzerProvider<Persi
public PersianAnalyzer get() {
return this.analyzer;
}
-} \ No newline at end of file
+}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/PortugueseAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/PortugueseAnalyzerProvider.java
index 1d5f0561e2..73dc016fe6 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/PortugueseAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/PortugueseAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class PortugueseAnalyzerProvider extends AbstractIndexAnalyzerProvider<Po
public PortugueseAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new PortugueseAnalyzer(Analysis.parseStopWords(env, settings, PortugueseAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new PortugueseAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, PortugueseAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/RomanianAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/RomanianAnalyzerProvider.java
index 1ba780bf4c..5eeb22f511 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/RomanianAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/RomanianAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class RomanianAnalyzerProvider extends AbstractIndexAnalyzerProvider<Roma
public RomanianAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new RomanianAnalyzer(Analysis.parseStopWords(env, settings, RomanianAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new RomanianAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, RomanianAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/RussianAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/RussianAnalyzerProvider.java
index f7187cfb49..6e57603794 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/RussianAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/RussianAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class RussianAnalyzerProvider extends AbstractIndexAnalyzerProvider<Russi
public RussianAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new RussianAnalyzer(Analysis.parseStopWords(env, settings, RussianAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new RussianAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, RussianAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/ShingleTokenFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/ShingleTokenFilterFactory.java
index 453d7bad89..08d4d3e6a2 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/ShingleTokenFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/ShingleTokenFilterFactory.java
@@ -33,8 +33,8 @@ public class ShingleTokenFilterFactory extends AbstractTokenFilterFactory {
super(indexSettings, name, settings);
Integer maxShingleSize = settings.getAsInt("max_shingle_size", ShingleFilter.DEFAULT_MAX_SHINGLE_SIZE);
Integer minShingleSize = settings.getAsInt("min_shingle_size", ShingleFilter.DEFAULT_MIN_SHINGLE_SIZE);
- Boolean outputUnigrams = settings.getAsBoolean("output_unigrams", true);
- Boolean outputUnigramsIfNoShingles = settings.getAsBoolean("output_unigrams_if_no_shingles", false);
+ Boolean outputUnigrams = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "output_unigrams", true);
+ Boolean outputUnigramsIfNoShingles = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "output_unigrams_if_no_shingles", false);
String tokenSeparator = settings.get("token_separator", ShingleFilter.DEFAULT_TOKEN_SEPARATOR);
String fillerToken = settings.get("filler_token", ShingleFilter.DEFAULT_FILLER_TOKEN);
factory = new Factory("shingle", minShingleSize, maxShingleSize, outputUnigrams, outputUnigramsIfNoShingles, tokenSeparator, fillerToken);
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/SnowballAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/SnowballAnalyzerProvider.java
index 84f1931633..bd3201e3c8 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/SnowballAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/SnowballAnalyzerProvider.java
@@ -65,7 +65,7 @@ public class SnowballAnalyzerProvider extends AbstractIndexAnalyzerProvider<Snow
String language = settings.get("language", settings.get("name", "English"));
CharArraySet defaultStopwords = DEFAULT_LANGUAGE_STOPWORDS.getOrDefault(language, CharArraySet.EMPTY_SET);
- CharArraySet stopWords = Analysis.parseStopWords(env, settings, defaultStopwords);
+ CharArraySet stopWords = Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, defaultStopwords);
analyzer = new SnowballAnalyzer(language, stopWords);
analyzer.setVersion(version);
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/SoraniAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/SoraniAnalyzerProvider.java
index 6b5cf153f3..d3b9fcd3f5 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/SoraniAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/SoraniAnalyzerProvider.java
@@ -34,8 +34,10 @@ public class SoraniAnalyzerProvider extends AbstractIndexAnalyzerProvider<Sorani
public SoraniAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new SoraniAnalyzer(Analysis.parseStopWords(env, settings, SoraniAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new SoraniAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, SoraniAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/SpanishAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/SpanishAnalyzerProvider.java
index 23f1b73446..a32d9a0f3c 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/SpanishAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/SpanishAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class SpanishAnalyzerProvider extends AbstractIndexAnalyzerProvider<Spani
public SpanishAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new SpanishAnalyzer(Analysis.parseStopWords(env, settings, SpanishAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new SpanishAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, SpanishAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/StandardAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/StandardAnalyzerProvider.java
index a4ee6457b5..01a0dc00d5 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/StandardAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/StandardAnalyzerProvider.java
@@ -34,7 +34,7 @@ public class StandardAnalyzerProvider extends AbstractIndexAnalyzerProvider<Stan
public StandardAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
final CharArraySet defaultStopwords = CharArraySet.EMPTY_SET;
- CharArraySet stopWords = Analysis.parseStopWords(env, settings, defaultStopwords);
+ CharArraySet stopWords = Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, defaultStopwords);
int maxTokenLength = settings.getAsInt("max_token_length", StandardAnalyzer.DEFAULT_MAX_TOKEN_LENGTH);
standardAnalyzer = new StandardAnalyzer(stopWords);
standardAnalyzer.setVersion(version);
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/StandardHtmlStripAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/StandardHtmlStripAnalyzerProvider.java
index edc837293f..065c65f1cf 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/StandardHtmlStripAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/StandardHtmlStripAnalyzerProvider.java
@@ -33,7 +33,7 @@ public class StandardHtmlStripAnalyzerProvider extends AbstractIndexAnalyzerProv
public StandardHtmlStripAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
final CharArraySet defaultStopwords = CharArraySet.EMPTY_SET;
- CharArraySet stopWords = Analysis.parseStopWords(env, settings, defaultStopwords);
+ CharArraySet stopWords = Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, defaultStopwords);
analyzer = new StandardHtmlStripAnalyzer(stopWords);
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/StopAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/StopAnalyzerProvider.java
index 8c969238b4..7b7cf3e7c4 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/StopAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/StopAnalyzerProvider.java
@@ -31,7 +31,8 @@ public class StopAnalyzerProvider extends AbstractIndexAnalyzerProvider<StopAnal
public StopAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- CharArraySet stopWords = Analysis.parseStopWords(env, settings, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
+ CharArraySet stopWords = Analysis.parseStopWords(
+ env, indexSettings.getIndexVersionCreated(), settings, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
this.stopAnalyzer = new StopAnalyzer(stopWords);
this.stopAnalyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/StopTokenFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/StopTokenFilterFactory.java
index 86650e8191..d2b321fc4c 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/StopTokenFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/StopTokenFilterFactory.java
@@ -24,7 +24,6 @@ import org.apache.lucene.analysis.StopFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.StopAnalyzer;
import org.apache.lucene.search.suggest.analyzing.SuggestStopFilter;
-import org.apache.lucene.util.Version;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.env.Environment;
import org.elasticsearch.index.IndexSettings;
@@ -41,8 +40,8 @@ public class StopTokenFilterFactory extends AbstractTokenFilterFactory {
public StopTokenFilterFactory(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- this.ignoreCase = settings.getAsBoolean("ignore_case", false);
- this.removeTrailing = settings.getAsBoolean("remove_trailing", true);
+ this.ignoreCase = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "ignore_case", false);
+ this.removeTrailing = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "remove_trailing", true);
this.stopWords = Analysis.parseStopWords(env, settings, StopAnalyzer.ENGLISH_STOP_WORDS_SET, ignoreCase);
if (settings.get("enable_position_increments") != null) {
throw new IllegalArgumentException("enable_position_increments is not supported anymore. Please fix your analysis chain");
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/SwedishAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/SwedishAnalyzerProvider.java
index b77e19efca..066d2eef78 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/SwedishAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/SwedishAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class SwedishAnalyzerProvider extends AbstractIndexAnalyzerProvider<Swedi
public SwedishAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new SwedishAnalyzer(Analysis.parseStopWords(env, settings, SwedishAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new SwedishAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, SwedishAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/SynonymTokenFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/SynonymTokenFilterFactory.java
index d32c66e0df..3fc0d8f896 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/SynonymTokenFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/SynonymTokenFilterFactory.java
@@ -61,8 +61,8 @@ public class SynonymTokenFilterFactory extends AbstractTokenFilterFactory {
throw new IllegalArgumentException("synonym requires either `synonyms` or `synonyms_path` to be configured");
}
- this.ignoreCase = settings.getAsBoolean("ignore_case", false);
- boolean expand = settings.getAsBoolean("expand", true);
+ this.ignoreCase = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "ignore_case", false);
+ boolean expand = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "expand", true);
String tokenizerName = settings.get("tokenizer", "whitespace");
AnalysisModule.AnalysisProvider<TokenizerFactory> tokenizerFactoryFactory =
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/ThaiAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/ThaiAnalyzerProvider.java
index f1a69c62b1..119eb81d74 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/ThaiAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/ThaiAnalyzerProvider.java
@@ -30,7 +30,8 @@ public class ThaiAnalyzerProvider extends AbstractIndexAnalyzerProvider<ThaiAnal
public ThaiAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new ThaiAnalyzer(Analysis.parseStopWords(env, settings, ThaiAnalyzer.getDefaultStopSet()));
+ analyzer = new ThaiAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, ThaiAnalyzer.getDefaultStopSet()));
analyzer.setVersion(version);
}
@@ -38,4 +39,4 @@ public class ThaiAnalyzerProvider extends AbstractIndexAnalyzerProvider<ThaiAnal
public ThaiAnalyzer get() {
return this.analyzer;
}
-} \ No newline at end of file
+}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/TurkishAnalyzerProvider.java b/core/src/main/java/org/elasticsearch/index/analysis/TurkishAnalyzerProvider.java
index 2b2696a362..0eaf49afdc 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/TurkishAnalyzerProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/TurkishAnalyzerProvider.java
@@ -31,8 +31,10 @@ public class TurkishAnalyzerProvider extends AbstractIndexAnalyzerProvider<Turki
public TurkishAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new TurkishAnalyzer(Analysis.parseStopWords(env, settings, TurkishAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new TurkishAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, TurkishAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/UniqueTokenFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/UniqueTokenFilterFactory.java
index 986153a457..584e8401ad 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/UniqueTokenFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/UniqueTokenFilterFactory.java
@@ -31,7 +31,8 @@ public class UniqueTokenFilterFactory extends AbstractTokenFilterFactory {
public UniqueTokenFilterFactory(IndexSettings indexSettings, Environment environment, String name, Settings settings) {
super(indexSettings, name, settings);
- this.onlyOnSamePosition = settings.getAsBoolean("only_on_same_position", false);
+ this.onlyOnSamePosition = settings.getAsBooleanLenientForPreEs6Indices(
+ indexSettings.getIndexVersionCreated(), "only_on_same_position", false);
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/WordDelimiterTokenFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/WordDelimiterTokenFilterFactory.java
index ccc60f4ce7..44084344e4 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/WordDelimiterTokenFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/WordDelimiterTokenFilterFactory.java
@@ -87,7 +87,7 @@ public class WordDelimiterTokenFilterFactory extends AbstractTokenFilterFactory
// If set, causes trailing "'s" to be removed for each subword: "O'Neil's" => "O", "Neil"
flags |= getFlag(STEM_ENGLISH_POSSESSIVE, settings, "stem_english_possessive", true);
// If not null is the set of tokens to protect from being delimited
- Set<?> protectedWords = Analysis.getWordSet(env, settings, "protected_words");
+ Set<?> protectedWords = Analysis.getWordSet(env, indexSettings.getIndexVersionCreated(), settings, "protected_words");
this.protoWords = protectedWords == null ? null : CharArraySet.copy(protectedWords);
this.flags = flags;
}
@@ -101,7 +101,7 @@ public class WordDelimiterTokenFilterFactory extends AbstractTokenFilterFactory
}
public int getFlag(int flag, Settings settings, String key, boolean defaultValue) {
- if (settings.getAsBoolean(key, defaultValue)) {
+ if (settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), key, defaultValue)) {
return flag;
}
return 0;
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/compound/AbstractCompoundWordTokenFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/compound/AbstractCompoundWordTokenFilterFactory.java
index e7147334a7..9be3f38b02 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/compound/AbstractCompoundWordTokenFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/compound/AbstractCompoundWordTokenFilterFactory.java
@@ -44,8 +44,9 @@ public abstract class AbstractCompoundWordTokenFilterFactory extends AbstractTok
minWordSize = settings.getAsInt("min_word_size", CompoundWordTokenFilterBase.DEFAULT_MIN_WORD_SIZE);
minSubwordSize = settings.getAsInt("min_subword_size", CompoundWordTokenFilterBase.DEFAULT_MIN_SUBWORD_SIZE);
maxSubwordSize = settings.getAsInt("max_subword_size", CompoundWordTokenFilterBase.DEFAULT_MAX_SUBWORD_SIZE);
- onlyLongestMatch = settings.getAsBoolean("only_longest_match", false);
- wordList = Analysis.getWordSet(env, settings, "word_list");
+ onlyLongestMatch = settings
+ .getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "only_longest_match", false);
+ wordList = Analysis.getWordSet(env, indexSettings.getIndexVersionCreated(), settings, "word_list");
if (wordList == null) {
throw new IllegalArgumentException("word_list must be provided for [" + name + "], either as a path to a file, or directly");
}
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/AllFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/AllFieldMapper.java
index d77a99cf36..58380ce689 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/AllFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/AllFieldMapper.java
@@ -40,7 +40,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeMapValue;
import static org.elasticsearch.index.mapper.TypeParsers.parseTextField;
@@ -118,7 +117,7 @@ public class AllFieldMapper extends MetadataFieldMapper {
// the AllFieldMapper ctor in the builder since it is not valid. Here we validate
// the doc values settings (old and new) are rejected
Object docValues = node.get("doc_values");
- if (docValues != null && lenientNodeBooleanValue(docValues)) {
+ if (docValues != null && TypeParsers.nodeBooleanValueLenient(name, "doc_values", docValues)) {
throw new MapperParsingException("Field [" + name +
"] is always tokenized and cannot have doc values");
}
@@ -139,8 +138,8 @@ public class AllFieldMapper extends MetadataFieldMapper {
String fieldName = entry.getKey();
Object fieldNode = entry.getValue();
if (fieldName.equals("enabled")) {
- builder.enabled(lenientNodeBooleanValue(fieldNode) ? EnabledAttributeMapper.ENABLED :
- EnabledAttributeMapper.DISABLED);
+ boolean enabled = TypeParsers.nodeBooleanValueLenient(name, "enabled", fieldNode);
+ builder.enabled(enabled ? EnabledAttributeMapper.ENABLED : EnabledAttributeMapper.DISABLED);
iterator.remove();
}
}
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/BaseGeoPointFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/BaseGeoPointFieldMapper.java
index b1023c60f0..f09d841ec9 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/BaseGeoPointFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/BaseGeoPointFieldMapper.java
@@ -125,7 +125,7 @@ public abstract class BaseGeoPointFieldMapper extends FieldMapper implements Arr
Object propNode = entry.getValue();
if (propName.equals(Names.IGNORE_MALFORMED)) {
- builder.ignoreMalformed(XContentMapValues.lenientNodeBooleanValue(propNode));
+ builder.ignoreMalformed(TypeParsers.nodeBooleanValue(name, Names.IGNORE_MALFORMED, propNode, parserContext));
iterator.remove();
}
}
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java
index fc9520beea..7bd8c79ee6 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java
@@ -26,8 +26,10 @@ import org.apache.lucene.index.IndexableField;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.util.BytesRef;
-import org.elasticsearch.common.Booleans;
+import org.elasticsearch.Version;
import org.elasticsearch.common.Nullable;
+import org.elasticsearch.common.logging.DeprecationLogger;
+import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.lucene.Lucene;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
@@ -44,13 +46,13 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
import static org.elasticsearch.index.mapper.TypeParsers.parseField;
/**
* A field mapper for boolean fields.
*/
public class BooleanFieldMapper extends FieldMapper {
+ private static final DeprecationLogger deprecationLogger = new DeprecationLogger(Loggers.getLogger(BooleanFieldMapper.class));
public static final String CONTENT_TYPE = "boolean";
@@ -108,7 +110,7 @@ public class BooleanFieldMapper extends FieldMapper {
if (propNode == null) {
throw new MapperParsingException("Property [null_value] cannot be null.");
}
- builder.nullValue(lenientNodeBooleanValue(propNode));
+ builder.nullValue(TypeParsers.nodeBooleanValue(name, "null_value", propNode, parserContext));
iterator.remove();
}
}
@@ -231,7 +233,15 @@ public class BooleanFieldMapper extends FieldMapper {
value = fieldType().nullValue();
}
} else {
- value = context.parser().booleanValue();
+ if (indexCreatedVersion.onOrAfter(Version.V_6_0_0_alpha1_UNRELEASED)) {
+ value = context.parser().booleanValue();
+ } else {
+ value = context.parser().booleanValueLenient();
+ if (context.parser().isBooleanValueLenient() != context.parser().isBooleanValue()) {
+ String rawValue = context.parser().text();
+ deprecationLogger.deprecated("Expected a boolean for property [{}] but got [{}]", fieldType().name(), rawValue);
+ }
+ }
}
}
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java
index d2833d4bfb..52e5de0a17 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java
@@ -151,7 +151,7 @@ public class DateFieldMapper extends FieldMapper {
builder.nullValue(propNode.toString());
iterator.remove();
} else if (propName.equals("ignore_malformed")) {
- builder.ignoreMalformed(TypeParsers.nodeBooleanValue("ignore_malformed", propNode, parserContext));
+ builder.ignoreMalformed(TypeParsers.nodeBooleanValue(name, "ignore_malformed", propNode, parserContext));
iterator.remove();
} else if (propName.equals("locale")) {
builder.locale(LocaleUtils.parse(propNode.toString()));
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java
index b2152e41b7..0ed093b3a8 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java
@@ -237,7 +237,7 @@ public abstract class FieldMapper extends Mapper implements Cloneable {
}
}
- private final Version indexCreatedVersion;
+ protected final Version indexCreatedVersion;
protected MappedFieldType fieldType;
protected final MappedFieldType defaultFieldType;
protected MultiFields multiFields;
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/FieldNamesFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/FieldNamesFieldMapper.java
index 764586562d..863ce3c514 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/FieldNamesFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/FieldNamesFieldMapper.java
@@ -36,8 +36,6 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
-import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
-
/**
* A mapper that indexes the field names of a document under <code>_field_names</code>. This mapper is typically useful in order
* to have fast <code>exists</code> and <code>missing</code> queries/filters.
@@ -107,7 +105,7 @@ public class FieldNamesFieldMapper extends MetadataFieldMapper {
String fieldName = entry.getKey();
Object fieldNode = entry.getValue();
if (fieldName.equals("enabled")) {
- builder.enabled(lenientNodeBooleanValue(fieldNode));
+ builder.enabled(TypeParsers.nodeBooleanValue(name, "enabled", fieldNode, parserContext));
iterator.remove();
}
}
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/GeoShapeFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/GeoShapeFieldMapper.java
index f1a7330869..c46fe227d6 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/GeoShapeFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/GeoShapeFieldMapper.java
@@ -41,7 +41,6 @@ import org.elasticsearch.common.geo.builders.ShapeBuilder.Orientation;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.DistanceUnit;
import org.elasticsearch.common.xcontent.XContentBuilder;
-import org.elasticsearch.common.xcontent.support.XContentMapValues;
import org.elasticsearch.index.query.QueryShardContext;
import org.elasticsearch.index.query.QueryShardException;
import org.locationtech.spatial4j.shape.Point;
@@ -54,9 +53,6 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
-import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
-
-
/**
* FieldMapper for indexing {@link org.locationtech.spatial4j.shape.Shape}s.
* <p>
@@ -185,11 +181,12 @@ public class GeoShapeFieldMapper extends FieldMapper {
builder.fieldType().setStrategyName(fieldNode.toString());
iterator.remove();
} else if (Names.COERCE.equals(fieldName)) {
- builder.coerce(lenientNodeBooleanValue(fieldNode));
+ builder.coerce(TypeParsers.nodeBooleanValue(fieldName, Names.COERCE, fieldNode, parserContext));
iterator.remove();
} else if (Names.STRATEGY_POINTS_ONLY.equals(fieldName)
&& builder.fieldType().strategyName.equals(SpatialStrategy.TERM.getStrategyName()) == false) {
- builder.fieldType().setPointsOnly(XContentMapValues.lenientNodeBooleanValue(fieldNode));
+ boolean pointsOnly = TypeParsers.nodeBooleanValue(fieldName, Names.STRATEGY_POINTS_ONLY, fieldNode, parserContext);
+ builder.fieldType().setPointsOnly(pointsOnly);
iterator.remove();
}
}
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java
index 0b3b4fd8a4..9f4412c34c 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java
@@ -114,7 +114,7 @@ public class IpFieldMapper extends FieldMapper {
builder.nullValue(InetAddresses.forString(propNode.toString()));
iterator.remove();
} else if (propName.equals("ignore_malformed")) {
- builder.ignoreMalformed(TypeParsers.nodeBooleanValue("ignore_malformed", propNode, parserContext));
+ builder.ignoreMalformed(TypeParsers.nodeBooleanValue(name, "ignore_malformed", propNode, parserContext));
iterator.remove();
} else if (TypeParsers.parseMultiField(builder, name, parserContext, propName, propNode)) {
iterator.remove();
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java
index f4f6266262..8824b84fc9 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java
@@ -136,10 +136,10 @@ public final class KeywordFieldMapper extends FieldMapper {
builder.ignoreAbove(XContentMapValues.nodeIntegerValue(propNode, -1));
iterator.remove();
} else if (propName.equals("norms")) {
- builder.omitNorms(XContentMapValues.nodeBooleanValue(propNode) == false);
+ builder.omitNorms(XContentMapValues.nodeBooleanValue(propNode, "norms") == false);
iterator.remove();
} else if (propName.equals("eager_global_ordinals")) {
- builder.eagerGlobalOrdinals(XContentMapValues.nodeBooleanValue(propNode));
+ builder.eagerGlobalOrdinals(XContentMapValues.nodeBooleanValue(propNode, "eager_global_ordinals"));
iterator.remove();
} else if (propName.equals("normalizer")) {
if (propNode != null) {
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java
index c922cd8b54..e9043b3c75 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java
@@ -150,10 +150,10 @@ public class NumberFieldMapper extends FieldMapper {
builder.nullValue(type.parse(propNode, false));
iterator.remove();
} else if (propName.equals("ignore_malformed")) {
- builder.ignoreMalformed(TypeParsers.nodeBooleanValue("ignore_malformed", propNode, parserContext));
+ builder.ignoreMalformed(TypeParsers.nodeBooleanValue(name,"ignore_malformed", propNode, parserContext));
iterator.remove();
} else if (propName.equals("coerce")) {
- builder.coerce(TypeParsers.nodeBooleanValue("coerce", propNode, parserContext));
+ builder.coerce(TypeParsers.nodeBooleanValue(name, "coerce", propNode, parserContext));
iterator.remove();
}
}
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java
index 60c264e570..9cd6ef3b65 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java
@@ -42,8 +42,6 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
-import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
-
public class ObjectMapper extends Mapper implements Cloneable {
public static final String CONTENT_TYPE = "object";
@@ -167,7 +165,7 @@ public class ObjectMapper extends Mapper implements Cloneable {
@Override
public Mapper.Builder parse(String name, Map<String, Object> node, ParserContext parserContext) throws MapperParsingException {
ObjectMapper.Builder builder = new Builder(name);
- parseNested(name, node, builder);
+ parseNested(name, node, builder, parserContext);
for (Iterator<Map.Entry<String, Object>> iterator = node.entrySet().iterator(); iterator.hasNext();) {
Map.Entry<String, Object> entry = iterator.next();
String fieldName = entry.getKey();
@@ -185,11 +183,12 @@ public class ObjectMapper extends Mapper implements Cloneable {
if (value.equalsIgnoreCase("strict")) {
builder.dynamic(Dynamic.STRICT);
} else {
- builder.dynamic(lenientNodeBooleanValue(fieldNode) ? Dynamic.TRUE : Dynamic.FALSE);
+ boolean dynamic = TypeParsers.nodeBooleanValue(fieldName, "dynamic", fieldNode, parserContext);
+ builder.dynamic(dynamic ? Dynamic.TRUE : Dynamic.FALSE);
}
return true;
} else if (fieldName.equals("enabled")) {
- builder.enabled(lenientNodeBooleanValue(fieldNode));
+ builder.enabled(TypeParsers.nodeBooleanValue(fieldName, "enabled", fieldNode, parserContext));
return true;
} else if (fieldName.equals("properties")) {
if (fieldNode instanceof Collection && ((Collection) fieldNode).isEmpty()) {
@@ -201,13 +200,14 @@ public class ObjectMapper extends Mapper implements Cloneable {
}
return true;
} else if (fieldName.equals("include_in_all")) {
- builder.includeInAll(lenientNodeBooleanValue(fieldNode));
+ builder.includeInAll(TypeParsers.nodeBooleanValue(fieldName, "include_in_all", fieldNode, parserContext));
return true;
}
return false;
}
- protected static void parseNested(String name, Map<String, Object> node, ObjectMapper.Builder builder) {
+ protected static void parseNested(String name, Map<String, Object> node, ObjectMapper.Builder builder,
+ ParserContext parserContext) {
boolean nested = false;
boolean nestedIncludeInParent = false;
boolean nestedIncludeInRoot = false;
@@ -224,12 +224,12 @@ public class ObjectMapper extends Mapper implements Cloneable {
}
fieldNode = node.get("include_in_parent");
if (fieldNode != null) {
- nestedIncludeInParent = lenientNodeBooleanValue(fieldNode);
+ nestedIncludeInParent = TypeParsers.nodeBooleanValue(name, "include_in_parent", fieldNode, parserContext);
node.remove("include_in_parent");
}
fieldNode = node.get("include_in_root");
if (fieldNode != null) {
- nestedIncludeInRoot = lenientNodeBooleanValue(fieldNode);
+ nestedIncludeInRoot = TypeParsers.nodeBooleanValue(name, "include_in_root", fieldNode, parserContext);
node.remove("include_in_root");
}
if (nested) {
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/ParentFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/ParentFieldMapper.java
index 6b4133fd33..aee6979b5c 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/ParentFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/ParentFieldMapper.java
@@ -122,7 +122,7 @@ public class ParentFieldMapper extends MetadataFieldMapper {
}
iterator.remove();
} else if (fieldName.equals("eager_global_ordinals")) {
- builder.eagerGlobalOrdinals(XContentMapValues.nodeBooleanValue(fieldNode));
+ builder.eagerGlobalOrdinals(XContentMapValues.nodeBooleanValue(fieldNode, "eager_global_ordinals"));
iterator.remove();
}
}
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/RangeFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/RangeFieldMapper.java
index b0a809c12d..d3c9afd2f9 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/RangeFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/RangeFieldMapper.java
@@ -166,7 +166,7 @@ public class RangeFieldMapper extends FieldMapper {
throw new MapperParsingException("Property [null_value] is not supported for [" + this.type.name
+ "] field types.");
} else if (propName.equals("coerce")) {
- builder.coerce(TypeParsers.nodeBooleanValue("coerce", propNode, parserContext));
+ builder.coerce(TypeParsers.nodeBooleanValue(name, "coerce", propNode, parserContext));
iterator.remove();
} else if (propName.equals("locale")) {
builder.locale(LocaleUtils.parse(propNode.toString()));
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java
index 0ae7ce3358..c51f29072c 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java
@@ -150,10 +150,10 @@ public class RootObjectMapper extends ObjectMapper {
builder.dynamicTemplates(templates);
return true;
} else if (fieldName.equals("date_detection")) {
- ((Builder) builder).dateDetection = new Explicit<>(nodeBooleanValue(fieldNode), true);
+ builder.dateDetection = new Explicit<>(nodeBooleanValue(fieldNode, "date_detection"), true);
return true;
} else if (fieldName.equals("numeric_detection")) {
- ((Builder) builder).numericDetection = new Explicit<>(nodeBooleanValue(fieldNode), true);
+ builder.numericDetection = new Explicit<>(nodeBooleanValue(fieldNode, "numeric_detection"), true);
return true;
}
return false;
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/RoutingFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/RoutingFieldMapper.java
index 8640bfaa35..d1161b4740 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/RoutingFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/RoutingFieldMapper.java
@@ -32,8 +32,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
-
public class RoutingFieldMapper extends MetadataFieldMapper {
public static final String NAME = "_routing";
@@ -86,7 +84,7 @@ public class RoutingFieldMapper extends MetadataFieldMapper {
String fieldName = entry.getKey();
Object fieldNode = entry.getValue();
if (fieldName.equals("required")) {
- builder.required(lenientNodeBooleanValue(fieldNode));
+ builder.required(TypeParsers.nodeBooleanValue(name, "required", fieldNode, parserContext));
iterator.remove();
}
}
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java
index 6cd69c0fc6..cf2564f038 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java
@@ -147,10 +147,10 @@ public class ScaledFloatFieldMapper extends FieldMapper {
builder.nullValue(NumberFieldMapper.NumberType.DOUBLE.parse(propNode, false));
iterator.remove();
} else if (propName.equals("ignore_malformed")) {
- builder.ignoreMalformed(TypeParsers.nodeBooleanValue("ignore_malformed", propNode, parserContext));
+ builder.ignoreMalformed(TypeParsers.nodeBooleanValue(name, "ignore_malformed", propNode, parserContext));
iterator.remove();
} else if (propName.equals("coerce")) {
- builder.coerce(TypeParsers.nodeBooleanValue("coerce", propNode, parserContext));
+ builder.coerce(TypeParsers.nodeBooleanValue(name, "coerce", propNode, parserContext));
iterator.remove();
} else if (propName.equals("scaling_factor")) {
builder.scalingFactor(NumberFieldMapper.NumberType.DOUBLE.parse(propNode, false).doubleValue());
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/SourceFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/SourceFieldMapper.java
index efddec9066..e06ec80a47 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/SourceFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/SourceFieldMapper.java
@@ -47,8 +47,6 @@ import java.util.List;
import java.util.Map;
import java.util.function.Function;
-import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
-
public class SourceFieldMapper extends MetadataFieldMapper {
public static final String NAME = "_source";
@@ -116,7 +114,7 @@ public class SourceFieldMapper extends MetadataFieldMapper {
String fieldName = entry.getKey();
Object fieldNode = entry.getValue();
if (fieldName.equals("enabled")) {
- builder.enabled(lenientNodeBooleanValue(fieldNode));
+ builder.enabled(TypeParsers.nodeBooleanValue(name, "enabled", fieldNode, parserContext));
iterator.remove();
} else if ("format".equals(fieldName) && parserContext.indexVersionCreated().before(Version.V_5_0_0_alpha1)) {
// ignore on old indices, reject on and after 5.0
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java
index bb8c4d77a6..b41695eb8b 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java
@@ -144,10 +144,10 @@ public class TextFieldMapper extends FieldMapper {
builder.positionIncrementGap(newPositionIncrementGap);
iterator.remove();
} else if (propName.equals("fielddata")) {
- builder.fielddata(XContentMapValues.nodeBooleanValue(propNode));
+ builder.fielddata(XContentMapValues.nodeBooleanValue(propNode, "fielddata"));
iterator.remove();
} else if (propName.equals("eager_global_ordinals")) {
- builder.eagerGlobalOrdinals(XContentMapValues.nodeBooleanValue(propNode));
+ builder.eagerGlobalOrdinals(XContentMapValues.nodeBooleanValue(propNode, "eager_global_ordinals"));
iterator.remove();
} else if (propName.equals("fielddata_frequency_filter")) {
Map<?,?> frequencyFilter = (Map<?, ?>) propNode;
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/TypeParsers.java b/core/src/main/java/org/elasticsearch/index/mapper/TypeParsers.java
index 6e88e8b46c..3faa135402 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/TypeParsers.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/TypeParsers.java
@@ -22,6 +22,7 @@ package org.elasticsearch.index.mapper;
import org.apache.lucene.index.IndexOptions;
import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.Version;
+import org.elasticsearch.common.Booleans;
import org.elasticsearch.common.joda.FormatDateTimeFormatter;
import org.elasticsearch.common.joda.Joda;
import org.elasticsearch.common.logging.DeprecationLogger;
@@ -30,17 +31,13 @@ import org.elasticsearch.common.xcontent.support.XContentMapValues;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.similarity.SimilarityProvider;
-import java.util.Arrays;
import java.util.Collections;
-import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.Set;
import static org.elasticsearch.common.xcontent.support.XContentMapValues.isArray;
-import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeFloatValue;
import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeMapValue;
import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeStringValue;
@@ -54,17 +51,37 @@ public class TypeParsers {
public static final String INDEX_OPTIONS_OFFSETS = "offsets";
private static final DeprecationLogger DEPRECATION_LOGGER = new DeprecationLogger(Loggers.getLogger(TypeParsers.class));
- private static final Set<String> BOOLEAN_STRINGS = new HashSet<>(Arrays.asList("true", "false"));
- public static boolean nodeBooleanValue(String name, Object node, Mapper.TypeParser.ParserContext parserContext) {
- // TODO: remove this leniency in 6.0
- if (BOOLEAN_STRINGS.contains(node.toString()) == false) {
- DEPRECATION_LOGGER.deprecated("Expected a boolean for property [{}] but got [{}]", name, node);
+ //TODO 22298: Remove this method and have all call-sites use <code>XContentMapValues.nodeBooleanValue(node)</code> directly.
+ public static boolean nodeBooleanValue(String fieldName, String propertyName, Object node,
+ Mapper.TypeParser.ParserContext parserContext) {
+ if (parserContext.indexVersionCreated().onOrAfter(Version.V_6_0_0_alpha1_UNRELEASED)) {
+ return XContentMapValues.nodeBooleanValue(node, fieldName + "." + propertyName);
+ } else {
+ return nodeBooleanValueLenient(fieldName, propertyName, node);
+ }
+ }
+
+ //TODO 22298: Remove this method and have all call-sites use <code>XContentMapValues.nodeBooleanValue(node)</code> directly.
+ public static boolean nodeBooleanValueLenient(String fieldName, String propertyName, Object node) {
+ if (Booleans.isBoolean(node.toString()) == false) {
+ DEPRECATION_LOGGER.deprecated("Expected a boolean for property [{}] for field [{}] but got [{}]",
+ propertyName, fieldName, node);
+ }
+ if (node instanceof Boolean) {
+ return (Boolean) node;
}
- return XContentMapValues.lenientNodeBooleanValue(node);
+ if (node instanceof Number) {
+ return ((Number) node).intValue() != 0;
+ }
+ @SuppressWarnings("deprecated")
+ boolean value = Booleans.parseBooleanLenient(node.toString(), false);
+ return value;
}
- private static void parseAnalyzersAndTermVectors(FieldMapper.Builder builder, String name, Map<String, Object> fieldNode, Mapper.TypeParser.ParserContext parserContext) {
+
+ private static void parseAnalyzersAndTermVectors(FieldMapper.Builder builder, String name, Map<String, Object> fieldNode,
+ Mapper.TypeParser.ParserContext parserContext) {
NamedAnalyzer indexAnalyzer = null;
NamedAnalyzer searchAnalyzer = null;
NamedAnalyzer searchQuoteAnalyzer = null;
@@ -77,16 +94,17 @@ public class TypeParsers {
parseTermVector(name, propNode.toString(), builder);
iterator.remove();
} else if (propName.equals("store_term_vectors")) {
- builder.storeTermVectors(nodeBooleanValue("store_term_vectors", propNode, parserContext));
+ builder.storeTermVectors(nodeBooleanValue(name, "store_term_vectors", propNode, parserContext));
iterator.remove();
} else if (propName.equals("store_term_vector_offsets")) {
- builder.storeTermVectorOffsets(nodeBooleanValue("store_term_vector_offsets", propNode, parserContext));
+ builder.storeTermVectorOffsets(nodeBooleanValue(name, "store_term_vector_offsets", propNode, parserContext));
iterator.remove();
} else if (propName.equals("store_term_vector_positions")) {
- builder.storeTermVectorPositions(nodeBooleanValue("store_term_vector_positions", propNode, parserContext));
+ builder.storeTermVectorPositions(
+ nodeBooleanValue(name, "store_term_vector_positions", propNode, parserContext));
iterator.remove();
} else if (propName.equals("store_term_vector_payloads")) {
- builder.storeTermVectorPayloads(nodeBooleanValue("store_term_vector_payloads", propNode, parserContext));
+ builder.storeTermVectorPayloads(nodeBooleanValue(name,"store_term_vector_payloads", propNode, parserContext));
iterator.remove();
} else if (propName.equals("analyzer")) {
NamedAnalyzer analyzer = parserContext.getIndexAnalyzers().get(propNode.toString());
@@ -117,7 +135,8 @@ public class TypeParsers {
}
if (searchAnalyzer == null && searchQuoteAnalyzer != null) {
- throw new MapperParsingException("analyzer and search_analyzer on field [" + name + "] must be set when search_quote_analyzer is set");
+ throw new MapperParsingException("analyzer and search_analyzer on field [" + name +
+ "] must be set when search_quote_analyzer is set");
}
if (searchAnalyzer == null) {
@@ -139,16 +158,17 @@ public class TypeParsers {
}
}
- public static boolean parseNorms(FieldMapper.Builder builder, String propName, Object propNode, Mapper.TypeParser.ParserContext parserContext) {
+ public static boolean parseNorms(FieldMapper.Builder builder, String fieldName, String propName, Object propNode,
+ Mapper.TypeParser.ParserContext parserContext) {
if (propName.equals("norms")) {
if (propNode instanceof Map) {
final Map<String, Object> properties = nodeMapValue(propNode, "norms");
- for (Iterator<Entry<String, Object>> propsIterator = properties.entrySet().iterator(); propsIterator.hasNext();) {
+ for (Iterator<Entry<String, Object>> propsIterator = properties.entrySet().iterator(); propsIterator.hasNext(); ) {
Entry<String, Object> entry2 = propsIterator.next();
final String propName2 = entry2.getKey();
final Object propNode2 = entry2.getValue();
if (propName2.equals("enabled")) {
- builder.omitNorms(!lenientNodeBooleanValue(propNode2));
+ builder.omitNorms(nodeBooleanValue(fieldName, "enabled", propNode2, parserContext) == false);
propsIterator.remove();
} else if (propName2.equals("loading")) {
// ignore for bw compat
@@ -156,13 +176,14 @@ public class TypeParsers {
}
}
DocumentMapperParser.checkNoRemainingFields(propName, properties, parserContext.indexVersionCreated());
- DEPRECATION_LOGGER.deprecated("The [norms{enabled:true/false}] way of specifying norms is deprecated, please use [norms:true/false] instead");
+ DEPRECATION_LOGGER.deprecated("The [norms{enabled:true/false}] way of specifying norms is deprecated, please use " +
+ "[norms:true/false] instead");
} else {
- builder.omitNorms(nodeBooleanValue("norms", propNode, parserContext) == false);
+ builder.omitNorms(nodeBooleanValue(fieldName,"norms", propNode, parserContext) == false);
}
return true;
} else if (propName.equals("omit_norms")) {
- builder.omitNorms(nodeBooleanValue("norms", propNode, parserContext));
+ builder.omitNorms(nodeBooleanValue(fieldName,"norms", propNode, parserContext));
DEPRECATION_LOGGER.deprecated("[omit_norms] is deprecated, please use [norms] instead with the opposite boolean value");
return true;
} else {
@@ -174,14 +195,15 @@ public class TypeParsers {
* Parse text field attributes. In addition to {@link #parseField common attributes}
* this will parse analysis and term-vectors related settings.
*/
- public static void parseTextField(FieldMapper.Builder builder, String name, Map<String, Object> fieldNode, Mapper.TypeParser.ParserContext parserContext) {
+ public static void parseTextField(FieldMapper.Builder builder, String name, Map<String, Object> fieldNode,
+ Mapper.TypeParser.ParserContext parserContext) {
parseField(builder, name, fieldNode, parserContext);
parseAnalyzersAndTermVectors(builder, name, fieldNode, parserContext);
- for (Iterator<Map.Entry<String, Object>> iterator = fieldNode.entrySet().iterator(); iterator.hasNext();) {
+ for (Iterator<Map.Entry<String, Object>> iterator = fieldNode.entrySet().iterator(); iterator.hasNext(); ) {
Map.Entry<String, Object> entry = iterator.next();
final String propName = entry.getKey();
final Object propNode = entry.getValue();
- if (parseNorms(builder, propName, propNode, parserContext)) {
+ if (parseNorms(builder, name, propName, propNode, parserContext)) {
iterator.remove();
}
}
@@ -190,8 +212,8 @@ public class TypeParsers {
/**
* Parse common field attributes such as {@code doc_values} or {@code store}.
*/
- public static void parseField(FieldMapper.Builder builder, String name, Map<String, Object> fieldNode, Mapper.TypeParser.ParserContext parserContext) {
- Version indexVersionCreated = parserContext.indexVersionCreated();
+ public static void parseField(FieldMapper.Builder builder, String name, Map<String, Object> fieldNode,
+ Mapper.TypeParser.ParserContext parserContext) {
for (Iterator<Map.Entry<String, Object>> iterator = fieldNode.entrySet().iterator(); iterator.hasNext();) {
Map.Entry<String, Object> entry = iterator.next();
final String propName = entry.getKey();
@@ -204,28 +226,29 @@ public class TypeParsers {
throw new MapperParsingException("[" + propName + "] must not have a [null] value");
}
if (propName.equals("store")) {
- builder.store(parseStore(propNode.toString()));
+ builder.store(nodeBooleanValue(name,"store", propNode.toString(), parserContext));
iterator.remove();
} else if (propName.equals("index")) {
- builder.index(parseIndex(name, propNode.toString()));
+ builder.index(nodeBooleanValue(name, "index", propNode, parserContext));
iterator.remove();
} else if (propName.equals(DOC_VALUES)) {
- builder.docValues(nodeBooleanValue(DOC_VALUES, propNode, parserContext));
+ builder.docValues(nodeBooleanValue(name, DOC_VALUES, propNode, parserContext));
iterator.remove();
} else if (propName.equals("boost")) {
builder.boost(nodeFloatValue(propNode));
iterator.remove();
} else if (parserContext.indexVersionCreated().before(Version.V_5_0_0_alpha1)
- && parseNorms(builder, propName, propNode, parserContext)) {
+ && parseNorms(builder, name, propName, propNode, parserContext)) {
iterator.remove();
} else if (propName.equals("index_options")) {
builder.indexOptions(nodeIndexOptionValue(propNode));
iterator.remove();
} else if (propName.equals("include_in_all")) {
if (parserContext.isWithinMultiField()) {
- throw new MapperParsingException("include_in_all in multi fields is not allowed. Found the include_in_all in field [" + name + "] which is within a multi field.");
+ throw new MapperParsingException("include_in_all in multi fields is not allowed. Found the include_in_all in field ["
+ + name + "] which is within a multi field.");
} else {
- builder.includeInAll(nodeBooleanValue("include_in_all", propNode, parserContext));
+ builder.includeInAll(nodeBooleanValue(name, "include_in_all", propNode, parserContext));
}
iterator.remove();
} else if (propName.equals("similarity")) {
@@ -241,7 +264,8 @@ public class TypeParsers {
iterator.remove();
} else if (propName.equals("copy_to")) {
if (parserContext.isWithinMultiField()) {
- throw new MapperParsingException("copy_to in multi fields is not allowed. Found the copy_to in field [" + name + "] which is within a multi field.");
+ throw new MapperParsingException("copy_to in multi fields is not allowed. Found the copy_to in field [" + name + "] " +
+ "which is within a multi field.");
} else {
parseCopyFields(propNode, builder);
}
@@ -250,7 +274,8 @@ public class TypeParsers {
}
}
- public static boolean parseMultiField(FieldMapper.Builder builder, String name, Mapper.TypeParser.ParserContext parserContext, String propName, Object propNode) {
+ public static boolean parseMultiField(FieldMapper.Builder builder, String name, Mapper.TypeParser.ParserContext parserContext,
+ String propName, Object propNode) {
parserContext = parserContext.createMultiFieldContext(parserContext);
if (propName.equals("fields")) {
@@ -262,13 +287,14 @@ public class TypeParsers {
multiFieldsPropNodes = (Map<String, Object>) propNode;
} else {
throw new MapperParsingException("expected map for property [fields] on field [" + propNode + "] or " +
- "[" + propName + "] but got a " + propNode.getClass());
+ "[" + propName + "] but got a " + propNode.getClass());
}
for (Map.Entry<String, Object> multiFieldEntry : multiFieldsPropNodes.entrySet()) {
String multiFieldName = multiFieldEntry.getKey();
if (multiFieldName.contains(".")) {
- throw new MapperParsingException("Field name [" + multiFieldName + "] which is a multi field of [" + name + "] cannot contain '.'");
+ throw new MapperParsingException("Field name [" + multiFieldName + "] which is a multi field of [" + name + "] cannot" +
+ " contain '.'");
}
if (!(multiFieldEntry.getValue() instanceof Map)) {
throw new MapperParsingException("illegal field [" + multiFieldName + "], only fields can be specified inside fields");
@@ -343,40 +369,11 @@ public class TypeParsers {
}
}
- private static boolean parseIndex(String fieldName, String index) throws MapperParsingException {
- switch (index) {
- case "true":
- return true;
- case "false":
- return false;
- case "not_analyzed":
- case "analyzed":
- case "no":
- DEPRECATION_LOGGER.deprecated("Expected a boolean for property [index] but got [{}]", index);
- return "no".equals(index) == false;
- default:
- throw new IllegalArgumentException("Can't parse [index] value [" + index + "] for field [" + fieldName + "], expected [true] or [false]");
- }
- }
-
- private static boolean parseStore(String store) throws MapperParsingException {
- if (BOOLEAN_STRINGS.contains(store) == false) {
- DEPRECATION_LOGGER.deprecated("Expected a boolean for property [store] but got [{}]", store);
- }
- if ("no".equals(store)) {
- return false;
- } else if ("yes".equals(store)) {
- return true;
- } else {
- return lenientNodeBooleanValue(store);
- }
- }
-
@SuppressWarnings("unchecked")
public static void parseCopyFields(Object propNode, FieldMapper.Builder builder) {
FieldMapper.CopyTo.Builder copyToBuilder = new FieldMapper.CopyTo.Builder();
if (isArray(propNode)) {
- for(Object node : (List<Object>) propNode) {
+ for (Object node : (List<Object>) propNode) {
copyToBuilder.add(nodeStringValue(node, null));
}
} else {
diff --git a/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java b/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java
index 7cdeca2f5f..cb486de610 100644
--- a/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java
+++ b/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java
@@ -1008,7 +1008,7 @@ public class IndexShard extends AbstractIndexShardComponent implements IndicesCl
}
recoveryState.setStage(RecoveryState.Stage.VERIFY_INDEX);
// also check here, before we apply the translog
- if (Booleans.parseBoolean(checkIndexOnStartup, false)) {
+ if (Booleans.isTrue(checkIndexOnStartup)) {
try {
checkIndex();
} catch (IOException ex) {
diff --git a/core/src/main/java/org/elasticsearch/index/similarity/BM25SimilarityProvider.java b/core/src/main/java/org/elasticsearch/index/similarity/BM25SimilarityProvider.java
index 68e50da134..78c9a4b000 100644
--- a/core/src/main/java/org/elasticsearch/index/similarity/BM25SimilarityProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/similarity/BM25SimilarityProvider.java
@@ -21,6 +21,7 @@ package org.elasticsearch.index.similarity;
import org.apache.lucene.search.similarities.BM25Similarity;
import org.apache.lucene.search.similarities.Similarity;
+import org.elasticsearch.Version;
import org.elasticsearch.common.settings.Settings;
/**
@@ -38,11 +39,12 @@ public class BM25SimilarityProvider extends AbstractSimilarityProvider {
private final BM25Similarity similarity;
- public BM25SimilarityProvider(String name, Settings settings) {
+ public BM25SimilarityProvider(String name, Settings settings, Settings indexSettings) {
super(name);
float k1 = settings.getAsFloat("k1", 1.2f);
float b = settings.getAsFloat("b", 0.75f);
- boolean discountOverlaps = settings.getAsBoolean("discount_overlaps", true);
+ boolean discountOverlaps = settings.getAsBooleanLenientForPreEs6Indices(
+ Version.indexCreated(indexSettings), "discount_overlaps", true);
this.similarity = new BM25Similarity(k1, b);
this.similarity.setDiscountOverlaps(discountOverlaps);
diff --git a/core/src/main/java/org/elasticsearch/index/similarity/ClassicSimilarityProvider.java b/core/src/main/java/org/elasticsearch/index/similarity/ClassicSimilarityProvider.java
index f9a6ff2f5f..79e73eaf7e 100644
--- a/core/src/main/java/org/elasticsearch/index/similarity/ClassicSimilarityProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/similarity/ClassicSimilarityProvider.java
@@ -20,6 +20,7 @@
package org.elasticsearch.index.similarity;
import org.apache.lucene.search.similarities.ClassicSimilarity;
+import org.elasticsearch.Version;
import org.elasticsearch.common.settings.Settings;
/**
@@ -35,9 +36,10 @@ public class ClassicSimilarityProvider extends AbstractSimilarityProvider {
private final ClassicSimilarity similarity = new ClassicSimilarity();
- public ClassicSimilarityProvider(String name, Settings settings) {
+ public ClassicSimilarityProvider(String name, Settings settings, Settings indexSettings) {
super(name);
- boolean discountOverlaps = settings.getAsBoolean("discount_overlaps", true);
+ boolean discountOverlaps = settings.getAsBooleanLenientForPreEs6Indices(
+ Version.indexCreated(indexSettings), "discount_overlaps", true);
this.similarity.setDiscountOverlaps(discountOverlaps);
}
diff --git a/core/src/main/java/org/elasticsearch/index/similarity/DFISimilarityProvider.java b/core/src/main/java/org/elasticsearch/index/similarity/DFISimilarityProvider.java
index 54b0aab758..e795c7e232 100644
--- a/core/src/main/java/org/elasticsearch/index/similarity/DFISimilarityProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/similarity/DFISimilarityProvider.java
@@ -25,6 +25,7 @@ import org.apache.lucene.search.similarities.IndependenceChiSquared;
import org.apache.lucene.search.similarities.IndependenceSaturated;
import org.apache.lucene.search.similarities.IndependenceStandardized;
import org.apache.lucene.search.similarities.Similarity;
+import org.elasticsearch.Version;
import org.elasticsearch.common.settings.Settings;
import java.util.HashMap;
@@ -55,9 +56,10 @@ public class DFISimilarityProvider extends AbstractSimilarityProvider {
private final DFISimilarity similarity;
- public DFISimilarityProvider(String name, Settings settings) {
+ public DFISimilarityProvider(String name, Settings settings, Settings indexSettings) {
super(name);
- boolean discountOverlaps = settings.getAsBoolean("discount_overlaps", true);
+ boolean discountOverlaps = settings.getAsBooleanLenientForPreEs6Indices(
+ Version.indexCreated(indexSettings), "discount_overlaps", true);
Independence measure = parseIndependence(settings);
this.similarity = new DFISimilarity(measure);
this.similarity.setDiscountOverlaps(discountOverlaps);
diff --git a/core/src/main/java/org/elasticsearch/index/similarity/DFRSimilarityProvider.java b/core/src/main/java/org/elasticsearch/index/similarity/DFRSimilarityProvider.java
index 2aeb685de3..0d47e86da0 100644
--- a/core/src/main/java/org/elasticsearch/index/similarity/DFRSimilarityProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/similarity/DFRSimilarityProvider.java
@@ -75,7 +75,7 @@ public class DFRSimilarityProvider extends AbstractSimilarityProvider {
private final DFRSimilarity similarity;
- public DFRSimilarityProvider(String name, Settings settings) {
+ public DFRSimilarityProvider(String name, Settings settings, Settings indexSettings) {
super(name);
BasicModel basicModel = parseBasicModel(settings);
AfterEffect afterEffect = parseAfterEffect(settings);
diff --git a/core/src/main/java/org/elasticsearch/index/similarity/IBSimilarityProvider.java b/core/src/main/java/org/elasticsearch/index/similarity/IBSimilarityProvider.java
index 4b83bc838f..a43276bbfa 100644
--- a/core/src/main/java/org/elasticsearch/index/similarity/IBSimilarityProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/similarity/IBSimilarityProvider.java
@@ -65,7 +65,7 @@ public class IBSimilarityProvider extends AbstractSimilarityProvider {
private final IBSimilarity similarity;
- public IBSimilarityProvider(String name, Settings settings) {
+ public IBSimilarityProvider(String name, Settings settings, Settings indexSettings) {
super(name);
Distribution distribution = parseDistribution(settings);
Lambda lambda = parseLambda(settings);
diff --git a/core/src/main/java/org/elasticsearch/index/similarity/LMDirichletSimilarityProvider.java b/core/src/main/java/org/elasticsearch/index/similarity/LMDirichletSimilarityProvider.java
index 24494dc0b7..170a7e4213 100644
--- a/core/src/main/java/org/elasticsearch/index/similarity/LMDirichletSimilarityProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/similarity/LMDirichletSimilarityProvider.java
@@ -36,7 +36,7 @@ public class LMDirichletSimilarityProvider extends AbstractSimilarityProvider {
private final LMDirichletSimilarity similarity;
- public LMDirichletSimilarityProvider(String name, Settings settings) {
+ public LMDirichletSimilarityProvider(String name, Settings settings, Settings indexSettings) {
super(name);
float mu = settings.getAsFloat("mu", 2000f);
this.similarity = new LMDirichletSimilarity(mu);
diff --git a/core/src/main/java/org/elasticsearch/index/similarity/LMJelinekMercerSimilarityProvider.java b/core/src/main/java/org/elasticsearch/index/similarity/LMJelinekMercerSimilarityProvider.java
index cd10d29735..2ee04b78ec 100644
--- a/core/src/main/java/org/elasticsearch/index/similarity/LMJelinekMercerSimilarityProvider.java
+++ b/core/src/main/java/org/elasticsearch/index/similarity/LMJelinekMercerSimilarityProvider.java
@@ -36,7 +36,7 @@ public class LMJelinekMercerSimilarityProvider extends AbstractSimilarityProvide
private final LMJelinekMercerSimilarity similarity;
- public LMJelinekMercerSimilarityProvider(String name, Settings settings) {
+ public LMJelinekMercerSimilarityProvider(String name, Settings settings, Settings indexSettings) {
super(name);
float lambda = settings.getAsFloat("lambda", 0.1f);
this.similarity = new LMJelinekMercerSimilarity(lambda);
diff --git a/core/src/main/java/org/elasticsearch/index/similarity/SimilarityService.java b/core/src/main/java/org/elasticsearch/index/similarity/SimilarityService.java
index a8b7fafb98..54aa940a71 100644
--- a/core/src/main/java/org/elasticsearch/index/similarity/SimilarityService.java
+++ b/core/src/main/java/org/elasticsearch/index/similarity/SimilarityService.java
@@ -22,6 +22,7 @@ package org.elasticsearch.index.similarity;
import org.apache.lucene.search.similarities.PerFieldSimilarityWrapper;
import org.apache.lucene.search.similarities.Similarity;
import org.elasticsearch.Version;
+import org.elasticsearch.common.TriFunction;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.AbstractIndexComponent;
import org.elasticsearch.index.IndexModule;
@@ -32,7 +33,6 @@ import org.elasticsearch.index.mapper.MapperService;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-import java.util.function.BiFunction;
public final class SimilarityService extends AbstractIndexComponent {
@@ -40,11 +40,11 @@ public final class SimilarityService extends AbstractIndexComponent {
private final Similarity defaultSimilarity;
private final Similarity baseSimilarity;
private final Map<String, SimilarityProvider> similarities;
- static final Map<String, BiFunction<String, Settings, SimilarityProvider>> DEFAULTS;
- public static final Map<String, BiFunction<String, Settings, SimilarityProvider>> BUILT_IN;
+ private static final Map<String, TriFunction<String, Settings, Settings, SimilarityProvider>> DEFAULTS;
+ public static final Map<String, TriFunction<String, Settings, Settings, SimilarityProvider>> BUILT_IN;
static {
- Map<String, BiFunction<String, Settings, SimilarityProvider>> defaults = new HashMap<>();
- Map<String, BiFunction<String, Settings, SimilarityProvider>> buildIn = new HashMap<>();
+ Map<String, TriFunction<String, Settings, Settings, SimilarityProvider>> defaults = new HashMap<>();
+ Map<String, TriFunction<String, Settings, Settings, SimilarityProvider>> buildIn = new HashMap<>();
defaults.put("classic", ClassicSimilarityProvider::new);
defaults.put("BM25", BM25SimilarityProvider::new);
buildIn.put("classic", ClassicSimilarityProvider::new);
@@ -58,7 +58,8 @@ public final class SimilarityService extends AbstractIndexComponent {
BUILT_IN = Collections.unmodifiableMap(buildIn);
}
- public SimilarityService(IndexSettings indexSettings, Map<String, BiFunction<String, Settings, SimilarityProvider>> similarities) {
+ public SimilarityService(IndexSettings indexSettings,
+ Map<String, TriFunction<String, Settings, Settings, SimilarityProvider>> similarities) {
super(indexSettings);
Map<String, SimilarityProvider> providers = new HashMap<>(similarities.size());
Map<String, Settings> similaritySettings = this.indexSettings.getSettings().getGroups(IndexModule.SIMILARITY_SETTINGS_PREFIX);
@@ -68,20 +69,22 @@ public final class SimilarityService extends AbstractIndexComponent {
if(BUILT_IN.containsKey(name) && indexSettings.getIndexVersionCreated().onOrAfter(Version.V_5_0_0_alpha1)) {
throw new IllegalArgumentException("Cannot redefine built-in Similarity [" + name + "]");
}
- Settings settings = entry.getValue();
- String typeName = settings.get("type");
+ Settings providerSettings = entry.getValue();
+ String typeName = providerSettings.get("type");
if (typeName == null) {
throw new IllegalArgumentException("Similarity [" + name + "] must have an associated type");
} else if ((similarities.containsKey(typeName) || BUILT_IN.containsKey(typeName)) == false) {
throw new IllegalArgumentException("Unknown Similarity type [" + typeName + "] for [" + name + "]");
}
- BiFunction<String, Settings, SimilarityProvider> factory = similarities.getOrDefault(typeName, BUILT_IN.get(typeName));
- if (settings == null) {
- settings = Settings.Builder.EMPTY_SETTINGS;
+ TriFunction<String, Settings, Settings, SimilarityProvider> defaultFactory = BUILT_IN.get(typeName);
+ TriFunction<String, Settings, Settings, SimilarityProvider> factory = similarities.getOrDefault(typeName, defaultFactory);
+ if (providerSettings == null) {
+ providerSettings = Settings.Builder.EMPTY_SETTINGS;
}
- providers.put(name, factory.apply(name, settings));
+ providers.put(name, factory.apply(name, providerSettings, indexSettings.getSettings()));
}
- for (Map.Entry<String, SimilarityProvider> entry : addSimilarities(similaritySettings, DEFAULTS).entrySet()) {
+ Map<String, SimilarityProvider> providerMapping = addSimilarities(similaritySettings, indexSettings.getSettings(), DEFAULTS);
+ for (Map.Entry<String, SimilarityProvider> entry : providerMapping.entrySet()) {
// Avoid overwriting custom providers for indices older that v5.0
if (providers.containsKey(entry.getKey()) && indexSettings.getIndexVersionCreated().before(Version.V_5_0_0_alpha1)) {
continue;
@@ -102,17 +105,17 @@ public final class SimilarityService extends AbstractIndexComponent {
defaultSimilarity;
}
- private Map<String, SimilarityProvider> addSimilarities(Map<String, Settings> similaritySettings,
- Map<String, BiFunction<String, Settings, SimilarityProvider>> similarities) {
+ private Map<String, SimilarityProvider> addSimilarities(Map<String, Settings> similaritySettings, Settings indexSettings,
+ Map<String, TriFunction<String, Settings, Settings, SimilarityProvider>> similarities) {
Map<String, SimilarityProvider> providers = new HashMap<>(similarities.size());
- for (Map.Entry<String, BiFunction<String, Settings, SimilarityProvider>> entry : similarities.entrySet()) {
+ for (Map.Entry<String, TriFunction<String, Settings, Settings, SimilarityProvider>> entry : similarities.entrySet()) {
String name = entry.getKey();
- BiFunction<String, Settings, SimilarityProvider> factory = entry.getValue();
- Settings settings = similaritySettings.get(name);
- if (settings == null) {
- settings = Settings.Builder.EMPTY_SETTINGS;
+ TriFunction<String, Settings, Settings, SimilarityProvider> factory = entry.getValue();
+ Settings providerSettings = similaritySettings.get(name);
+ if (providerSettings == null) {
+ providerSettings = Settings.Builder.EMPTY_SETTINGS;
}
- providers.put(name, factory.apply(name, settings));
+ providers.put(name, factory.apply(name, providerSettings, indexSettings));
}
return providers;
}
diff --git a/core/src/main/java/org/elasticsearch/index/store/FsDirectoryService.java b/core/src/main/java/org/elasticsearch/index/store/FsDirectoryService.java
index b6bc8c6081..bf8e8466da 100644
--- a/core/src/main/java/org/elasticsearch/index/store/FsDirectoryService.java
+++ b/core/src/main/java/org/elasticsearch/index/store/FsDirectoryService.java
@@ -29,7 +29,6 @@ import org.apache.lucene.store.NativeFSLockFactory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.store.SimpleFSLockFactory;
import org.apache.lucene.store.SleepingLockWrapper;
-import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.common.settings.Setting.Property;
@@ -75,7 +74,7 @@ public class FsDirectoryService extends DirectoryService {
Set<String> preLoadExtensions = new HashSet<>(
indexSettings.getValue(IndexModule.INDEX_STORE_PRE_LOAD_SETTING));
wrapped = setPreload(wrapped, location, lockFactory, preLoadExtensions);
- if (IndexMetaData.isOnSharedFilesystem(indexSettings.getSettings())) {
+ if (indexSettings.isOnSharedFilesystem()) {
wrapped = new SleepingLockWrapper(wrapped, 5000);
}
return wrapped;
diff --git a/core/src/main/java/org/elasticsearch/rest/RestRequest.java b/core/src/main/java/org/elasticsearch/rest/RestRequest.java
index 8c05a2b3ae..b4b0614f8a 100644
--- a/core/src/main/java/org/elasticsearch/rest/RestRequest.java
+++ b/core/src/main/java/org/elasticsearch/rest/RestRequest.java
@@ -200,7 +200,13 @@ public abstract class RestRequest implements ToXContent.Params {
@Override
public boolean paramAsBoolean(String key, boolean defaultValue) {
- return Booleans.parseBoolean(param(key), defaultValue);
+ String rawParam = param(key);
+ // Treat empty string as true because that allows the presence of the url parameter to mean "turn this on"
+ if (rawParam != null && rawParam.length() == 0) {
+ return true;
+ } else {
+ return Booleans.parseBoolean(rawParam, defaultValue);
+ }
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/rest/action/cat/RestShardsAction.java b/core/src/main/java/org/elasticsearch/rest/action/cat/RestShardsAction.java
index 8944c0827e..06b14573a5 100644
--- a/core/src/main/java/org/elasticsearch/rest/action/cat/RestShardsAction.java
+++ b/core/src/main/java/org/elasticsearch/rest/action/cat/RestShardsAction.java
@@ -195,7 +195,7 @@ public class RestShardsAction extends AbstractCatAction {
IndexMetaData indexMeta = state.getState().getMetaData().getIndexSafe(shard.index());
boolean usesShadowReplicas = false;
if (indexMeta != null) {
- usesShadowReplicas = IndexMetaData.isIndexUsingShadowReplicas(indexMeta.getSettings());
+ usesShadowReplicas = indexMeta.isIndexUsingShadowReplicas();
}
if (shard.primary()) {
table.addCell("p");
diff --git a/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java b/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java
index 5cfa7795e0..a5a56ebe54 100644
--- a/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java
+++ b/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java
@@ -42,7 +42,7 @@ import java.io.IOException;
import java.util.Map;
import java.util.function.BiConsumer;
-import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
+import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeBooleanValue;
import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeStringArrayValue;
import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeStringValue;
import static org.elasticsearch.rest.RestRequest.Method.GET;
@@ -158,7 +158,7 @@ public class RestMultiSearchAction extends BaseRestHandler {
} else if ("search_type".equals(entry.getKey()) || "searchType".equals(entry.getKey())) {
searchRequest.searchType(nodeStringValue(value, null));
} else if ("request_cache".equals(entry.getKey()) || "requestCache".equals(entry.getKey())) {
- searchRequest.requestCache(lenientNodeBooleanValue(value));
+ searchRequest.requestCache(nodeBooleanValue(value, entry.getKey()));
} else if ("preference".equals(entry.getKey())) {
searchRequest.preference(nodeStringValue(value, null));
} else if ("routing".equals(entry.getKey())) {
diff --git a/core/src/main/java/org/elasticsearch/search/fetch/subphase/FetchSourceContext.java b/core/src/main/java/org/elasticsearch/search/fetch/subphase/FetchSourceContext.java
index f3e8bab93f..c86342f690 100644
--- a/core/src/main/java/org/elasticsearch/search/fetch/subphase/FetchSourceContext.java
+++ b/core/src/main/java/org/elasticsearch/search/fetch/subphase/FetchSourceContext.java
@@ -96,9 +96,9 @@ public class FetchSourceContext implements Writeable, ToXContent {
String source = request.param("_source");
if (source != null) {
- if (Booleans.isExplicitTrue(source)) {
+ if (Booleans.isTrue(source)) {
fetchSource = true;
- } else if (Booleans.isExplicitFalse(source)) {
+ } else if (Booleans.isFalse(source)) {
fetchSource = false;
} else {
source_includes = Strings.splitStringByCommaToArray(source);
diff --git a/core/src/test/java/org/elasticsearch/action/get/MultiGetRequestTests.java b/core/src/test/java/org/elasticsearch/action/get/MultiGetRequestTests.java
new file mode 100644
index 0000000000..6c79b20774
--- /dev/null
+++ b/core/src/test/java/org/elasticsearch/action/get/MultiGetRequestTests.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to Elasticsearch under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.elasticsearch.action.get;
+
+import org.elasticsearch.common.xcontent.XContentFactory;
+import org.elasticsearch.common.xcontent.XContentParser;
+import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
+import org.elasticsearch.test.ESTestCase;
+
+public class MultiGetRequestTests extends ESTestCase {
+
+ public void testAddWithInvalidSourceValueIsRejected() throws Exception {
+ String sourceValue = randomFrom("on", "off", "0", "1");
+ XContentParser parser = createParser(XContentFactory.jsonBuilder()
+ .startObject()
+ .startArray("docs")
+ .startObject()
+ .field("_source", sourceValue)
+ .endObject()
+ .endArray()
+ .endObject()
+ );
+
+ MultiGetRequest multiGetRequest = new MultiGetRequest();
+ IllegalArgumentException ex = expectThrows(IllegalArgumentException.class, () -> multiGetRequest.add
+ (randomAsciiOfLength(5), randomAsciiOfLength(3), null, FetchSourceContext.FETCH_SOURCE, null, parser, true));
+ assertEquals("Failed to parse value [" + sourceValue + "] as only [true] or [false] are allowed.", ex.getMessage());
+ }
+
+ public void testAddWithValidSourceValueIsAccepted() throws Exception {
+ XContentParser parser = createParser(XContentFactory.jsonBuilder()
+ .startObject()
+ .startArray("docs")
+ .startObject()
+ .field("_source", randomFrom("false", "true"))
+ .endObject()
+ .startObject()
+ .field("_source", randomBoolean())
+ .endObject()
+ .endArray()
+ .endObject()
+ );
+
+ MultiGetRequest multiGetRequest = new MultiGetRequest();
+ multiGetRequest.add(
+ randomAsciiOfLength(5), randomAsciiOfLength(3), null, FetchSourceContext.FETCH_SOURCE, null, parser, true);
+
+ assertEquals(2, multiGetRequest.getItems().size());
+ }
+}
diff --git a/core/src/test/java/org/elasticsearch/action/support/IndicesOptionsTests.java b/core/src/test/java/org/elasticsearch/action/support/IndicesOptionsTests.java
index d656e0f62a..c687fc6cab 100644
--- a/core/src/test/java/org/elasticsearch/action/support/IndicesOptionsTests.java
+++ b/core/src/test/java/org/elasticsearch/action/support/IndicesOptionsTests.java
@@ -31,7 +31,8 @@ public class IndicesOptionsTests extends ESTestCase {
public void testSerialization() throws Exception {
int iterations = randomIntBetween(5, 20);
for (int i = 0; i < iterations; i++) {
- IndicesOptions indicesOptions = IndicesOptions.fromOptions(randomBoolean(), randomBoolean(), randomBoolean(), randomBoolean(), randomBoolean(), randomBoolean());
+ IndicesOptions indicesOptions = IndicesOptions.fromOptions(
+ randomBoolean(), randomBoolean(), randomBoolean(), randomBoolean(), randomBoolean(), randomBoolean());
BytesStreamOutput output = new BytesStreamOutput();
Version outputVersion = randomVersion(random());
diff --git a/core/src/test/java/org/elasticsearch/bwcompat/RestoreBackwardsCompatIT.java b/core/src/test/java/org/elasticsearch/bwcompat/RestoreBackwardsCompatIT.java
index 6d13d3cf41..6f8019bcdd 100644
--- a/core/src/test/java/org/elasticsearch/bwcompat/RestoreBackwardsCompatIT.java
+++ b/core/src/test/java/org/elasticsearch/bwcompat/RestoreBackwardsCompatIT.java
@@ -52,6 +52,7 @@ import java.util.SortedSet;
import java.util.TreeSet;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
+import static org.hamcrest.Matchers.anyOf;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.greaterThan;
@@ -189,7 +190,15 @@ public class RestoreBackwardsCompatIT extends AbstractSnapshotIntegTestCase {
assertThat(template.patterns(), equalTo(Collections.singletonList("te*")));
assertThat(template.settings().getAsInt(IndexMetaData.SETTING_NUMBER_OF_SHARDS, -1), equalTo(1));
assertThat(template.mappings().size(), equalTo(1));
- assertThat(template.mappings().get("type1").string(), equalTo("{\"type1\":{\"_source\":{\"enabled\":false}}}"));
+ assertThat(template.mappings().get("type1").string(),
+ anyOf(
+ equalTo("{\"type1\":{\"_source\":{\"enabled\":false}}}"),
+ equalTo("{\"type1\":{\"_source\":{\"enabled\":\"false\"}}}"),
+ equalTo("{\"type1\":{\"_source\":{\"enabled\":\"0\"}}}"),
+ equalTo("{\"type1\":{\"_source\":{\"enabled\":0}}}"),
+ equalTo("{\"type1\":{\"_source\":{\"enabled\":\"off\"}}}"),
+ equalTo("{\"type1\":{\"_source\":{\"enabled\":\"no\"}}}")
+ ));
assertThat(template.aliases().size(), equalTo(3));
assertThat(template.aliases().get("alias1"), notNullValue());
assertThat(template.aliases().get("alias2").filter().string(), containsString(version));
diff --git a/core/src/test/java/org/elasticsearch/cluster/SimpleClusterStateIT.java b/core/src/test/java/org/elasticsearch/cluster/SimpleClusterStateIT.java
index 1944ed6e3b..89d33043e5 100644
--- a/core/src/test/java/org/elasticsearch/cluster/SimpleClusterStateIT.java
+++ b/core/src/test/java/org/elasticsearch/cluster/SimpleClusterStateIT.java
@@ -96,18 +96,37 @@ public class SimpleClusterStateIT extends ESIntegTestCase {
client().admin().indices().preparePutTemplate("foo_template")
.setPatterns(Collections.singletonList("te*"))
.setOrder(0)
- .addMapping("type1", XContentFactory.jsonBuilder().startObject().startObject("type1").startObject("properties")
- .startObject("field1").field("type", "text").field("store", true).endObject()
- .startObject("field2").field("type", "keyword").field("store", true).endObject()
- .endObject().endObject().endObject())
+ .addMapping("type1", XContentFactory.jsonBuilder()
+ .startObject()
+ .startObject("type1")
+ .startObject("properties")
+ .startObject("field1")
+ .field("type", "text")
+ .field("store", true)
+ .endObject()
+ .startObject("field2")
+ .field("type", "keyword")
+ .field("store", true)
+ .endObject()
+ .endObject()
+ .endObject()
+ .endObject())
.get();
client().admin().indices().preparePutTemplate("fuu_template")
.setPatterns(Collections.singletonList("test*"))
.setOrder(1)
- .addMapping("type1", XContentFactory.jsonBuilder().startObject().startObject("type1").startObject("properties")
- .startObject("field2").field("type", "text").field("store", "no").endObject()
- .endObject().endObject().endObject())
+ .addMapping("type1", XContentFactory.jsonBuilder()
+ .startObject()
+ .startObject("type1")
+ .startObject("properties")
+ .startObject("field2")
+ .field("type", "text")
+ .field("store", false)
+ .endObject()
+ .endObject()
+ .endObject()
+ .endObject())
.get();
ClusterStateResponse clusterStateResponseUnfiltered = client().admin().cluster().prepareState().get();
diff --git a/core/src/test/java/org/elasticsearch/common/BooleansTests.java b/core/src/test/java/org/elasticsearch/common/BooleansTests.java
index 176c4c75dc..2e14159c07 100644
--- a/core/src/test/java/org/elasticsearch/common/BooleansTests.java
+++ b/core/src/test/java/org/elasticsearch/common/BooleansTests.java
@@ -28,59 +28,103 @@ import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
public class BooleansTests extends ESTestCase {
+ private static final String[] NON_BOOLEANS = new String[]{"11", "00", "sdfsdfsf", "F", "T", "on", "off", "yes", "no", "0", "1",
+ "True", "False"};
+ private static final String[] BOOLEANS = new String[]{"true", "false"};
+
public void testIsBoolean() {
+ for (String b : BOOLEANS) {
+ String t = "prefix" + b + "suffix";
+ assertTrue("failed to recognize [" + b + "] as boolean",
+ Booleans.isBoolean(t.toCharArray(), "prefix".length(), b.length()));
+ assertTrue("failed to recognize [" + b + "] as boolean", Booleans.isBoolean(b));
+ }
+ }
+
+ public void testIsNonBoolean() {
+ assertThat(Booleans.isBoolean(null, 0, 1), is(false));
+
+ for (String nb : NON_BOOLEANS) {
+ String t = "prefix" + nb + "suffix";
+ assertFalse("recognized [" + nb + "] as boolean", Booleans.isBoolean(t.toCharArray(), "prefix".length(), nb.length()));
+ assertFalse("recognized [" + nb + "] as boolean", Booleans.isBoolean(t));
+ }
+ }
+
+ public void testParseBooleanWithFallback() {
+ assertFalse(Booleans.parseBoolean(null, false));
+ assertTrue(Booleans.parseBoolean(null, true));
+ assertNull(Booleans.parseBoolean(null, null));
+ assertFalse(Booleans.parseBoolean(null, Boolean.FALSE));
+ assertTrue(Booleans.parseBoolean(null, Boolean.TRUE));
+
+ assertTrue(Booleans.parseBoolean("true", randomFrom(Boolean.TRUE, Boolean.FALSE, null)));
+ assertFalse(Booleans.parseBoolean("false", randomFrom(Boolean.TRUE, Boolean.FALSE, null)));
+ }
+
+ public void testParseNonBooleanWithFallback() {
+ for (String nonBoolean : NON_BOOLEANS) {
+ boolean defaultValue = randomFrom(Boolean.TRUE, Boolean.FALSE);
+
+ expectThrows(IllegalArgumentException.class,
+ () -> Booleans.parseBoolean(nonBoolean, defaultValue));
+ expectThrows(IllegalArgumentException.class,
+ () -> Booleans.parseBoolean(nonBoolean.toCharArray(), 0, nonBoolean.length(), defaultValue));
+ }
+ }
+
+ public void testParseBoolean() {
+ assertTrue(Booleans.parseBoolean("true"));
+ assertFalse(Booleans.parseBoolean("false"));
+ }
+
+ public void testParseNonBoolean() {
+ expectThrows(IllegalArgumentException.class, () -> Booleans.parseBoolean(null));
+ for (String nonBoolean : NON_BOOLEANS) {
+ expectThrows(IllegalArgumentException.class, () -> Booleans.parseBoolean(nonBoolean));
+ }
+ }
+
+ public void testIsBooleanLenient() {
String[] booleans = new String[]{"true", "false", "on", "off", "yes", "no", "0", "1"};
String[] notBooleans = new String[]{"11", "00", "sdfsdfsf", "F", "T"};
- assertThat(Booleans.isBoolean(null, 0, 1), is(false));
+ assertThat(Booleans.isBooleanLenient(null, 0, 1), is(false));
for (String b : booleans) {
String t = "prefix" + b + "suffix";
- assertThat("failed to recognize [" + b + "] as boolean", Booleans.isBoolean(t.toCharArray(), "prefix".length(), b.length()), Matchers.equalTo(true));
+ assertTrue("failed to recognize [" + b + "] as boolean",
+ Booleans.isBooleanLenient(t.toCharArray(), "prefix".length(), b.length()));
}
for (String nb : notBooleans) {
String t = "prefix" + nb + "suffix";
- assertThat("recognized [" + nb + "] as boolean", Booleans.isBoolean(t.toCharArray(), "prefix".length(), nb.length()), Matchers.equalTo(false));
+ assertFalse("recognized [" + nb + "] as boolean",
+ Booleans.isBooleanLenient(t.toCharArray(), "prefix".length(), nb.length()));
}
}
- public void testParseBoolean() {
- assertThat(Booleans.parseBoolean(randomFrom("true", "on", "yes", "1"), randomBoolean()), is(true));
- assertThat(Booleans.parseBoolean(randomFrom("false", "off", "no", "0"), randomBoolean()), is(false));
- assertThat(Booleans.parseBoolean(randomFrom("true", "on", "yes").toUpperCase(Locale.ROOT), randomBoolean()), is(true));
- assertThat(Booleans.parseBoolean(null, false), is(false));
- assertThat(Booleans.parseBoolean(null, true), is(true));
-
- assertThat(Booleans.parseBoolean(randomFrom("true", "on", "yes", "1"), randomFrom(Boolean.TRUE, Boolean.FALSE, null)), is(true));
- assertThat(Booleans.parseBoolean(randomFrom("false", "off", "no", "0"), randomFrom(Boolean.TRUE, Boolean.FALSE, null)), is(false));
- assertThat(Booleans.parseBoolean(randomFrom("true", "on", "yes").toUpperCase(Locale.ROOT),randomFrom(Boolean.TRUE, Boolean.FALSE, null)), is(true));
- assertThat(Booleans.parseBoolean(null, Boolean.FALSE), is(false));
- assertThat(Booleans.parseBoolean(null, Boolean.TRUE), is(true));
- assertThat(Booleans.parseBoolean(null, null), nullValue());
+ public void testParseBooleanLenient() {
+ assertThat(Booleans.parseBooleanLenient(randomFrom("true", "on", "yes", "1"), randomBoolean()), is(true));
+ assertThat(Booleans.parseBooleanLenient(randomFrom("false", "off", "no", "0"), randomBoolean()), is(false));
+ assertThat(Booleans.parseBooleanLenient(randomFrom("true", "on", "yes").toUpperCase(Locale.ROOT), randomBoolean()), is(true));
+ assertThat(Booleans.parseBooleanLenient(null, false), is(false));
+ assertThat(Booleans.parseBooleanLenient(null, true), is(true));
+
+ assertThat(Booleans.parseBooleanLenient(
+ randomFrom("true", "on", "yes", "1"), randomFrom(Boolean.TRUE, Boolean.FALSE, null)), is(true));
+ assertThat(Booleans.parseBooleanLenient(
+ randomFrom("false", "off", "no", "0"), randomFrom(Boolean.TRUE, Boolean.FALSE, null)), is(false));
+ assertThat(Booleans.parseBooleanLenient(
+ randomFrom("true", "on", "yes").toUpperCase(Locale.ROOT),randomFrom(Boolean.TRUE, Boolean.FALSE, null)), is(true));
+ assertThat(Booleans.parseBooleanLenient(null, Boolean.FALSE), is(false));
+ assertThat(Booleans.parseBooleanLenient(null, Boolean.TRUE), is(true));
+ assertThat(Booleans.parseBooleanLenient(null, null), nullValue());
char[] chars = randomFrom("true", "on", "yes", "1").toCharArray();
- assertThat(Booleans.parseBoolean(chars, 0, chars.length, randomBoolean()), is(true));
+ assertThat(Booleans.parseBooleanLenient(chars, 0, chars.length, randomBoolean()), is(true));
chars = randomFrom("false", "off", "no", "0").toCharArray();
- assertThat(Booleans.parseBoolean(chars,0, chars.length, randomBoolean()), is(false));
+ assertThat(Booleans.parseBooleanLenient(chars,0, chars.length, randomBoolean()), is(false));
chars = randomFrom("true", "on", "yes").toUpperCase(Locale.ROOT).toCharArray();
- assertThat(Booleans.parseBoolean(chars,0, chars.length, randomBoolean()), is(true));
- }
-
- public void testParseBooleanExact() {
- assertThat(Booleans.parseBooleanExact(randomFrom("true", "on", "yes", "1")), is(true));
- assertThat(Booleans.parseBooleanExact(randomFrom("false", "off", "no", "0")), is(false));
- try {
- Booleans.parseBooleanExact(randomFrom("fred", "foo", "barney", null));
- fail("Expected exception while parsing invalid boolean value ");
- } catch (Exception ex) {
- assertTrue(ex instanceof IllegalArgumentException);
- }
- }
-
- public void testIsExplicit() {
- assertThat(Booleans.isExplicitFalse(randomFrom("true", "on", "yes", "1", "foo", null)), is(false));
- assertThat(Booleans.isExplicitFalse(randomFrom("false", "off", "no", "0")), is(true));
- assertThat(Booleans.isExplicitTrue(randomFrom("true", "on", "yes", "1")), is(true));
- assertThat(Booleans.isExplicitTrue(randomFrom("false", "off", "no", "0", "foo", null)), is(false));
+ assertThat(Booleans.parseBooleanLenient(chars,0, chars.length, randomBoolean()), is(true));
}
}
diff --git a/core/src/test/java/org/elasticsearch/common/settings/SettingTests.java b/core/src/test/java/org/elasticsearch/common/settings/SettingTests.java
index 3789ea4045..24b48cbf36 100644
--- a/core/src/test/java/org/elasticsearch/common/settings/SettingTests.java
+++ b/core/src/test/java/org/elasticsearch/common/settings/SettingTests.java
@@ -127,7 +127,7 @@ public class SettingTests extends ESTestCase {
settingUpdater.apply(build, Settings.EMPTY);
fail("not a boolean");
} catch (IllegalArgumentException ex) {
- assertEquals("Failed to parse value [I am not a boolean] cannot be parsed to boolean [ true/1/on/yes OR false/0/off/no ]",
+ assertEquals("Failed to parse value [I am not a boolean] as only [true] or [false] are allowed.",
ex.getMessage());
}
}
diff --git a/core/src/test/java/org/elasticsearch/common/settings/SettingsModuleTests.java b/core/src/test/java/org/elasticsearch/common/settings/SettingsModuleTests.java
index dc0545624d..929aacf8a9 100644
--- a/core/src/test/java/org/elasticsearch/common/settings/SettingsModuleTests.java
+++ b/core/src/test/java/org/elasticsearch/common/settings/SettingsModuleTests.java
@@ -118,7 +118,7 @@ public class SettingsModuleTests extends ModuleTestCase {
new SettingsModule(settings);
fail();
} catch (IllegalArgumentException ex) {
- assertEquals("Failed to parse value [BOOM] cannot be parsed to boolean [ true/1/on/yes OR false/0/off/no ]",
+ assertEquals("Failed to parse value [BOOM] as only [true] or [false] are allowed.",
ex.getMessage());
}
}
diff --git a/core/src/test/java/org/elasticsearch/common/settings/SettingsTests.java b/core/src/test/java/org/elasticsearch/common/settings/SettingsTests.java
index 62fa9ec82c..4b1aa077b6 100644
--- a/core/src/test/java/org/elasticsearch/common/settings/SettingsTests.java
+++ b/core/src/test/java/org/elasticsearch/common/settings/SettingsTests.java
@@ -19,14 +19,14 @@
package org.elasticsearch.common.settings;
+import org.elasticsearch.Version;
+import org.elasticsearch.common.Booleans;
import org.elasticsearch.common.settings.loader.YamlSettingsLoader;
-import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.test.ESTestCase;
import org.hamcrest.Matchers;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -148,6 +148,66 @@ public class SettingsTests extends ESTestCase {
assertThat(fooSettings.get("baz"), equalTo("ghi"));
}
+ @SuppressWarnings("deprecation") //#getAsBooleanLenientForPreEs6Indices is the test subject
+ public void testLenientBooleanForPreEs6Index() throws IOException {
+ // time to say goodbye?
+ assertTrue(
+ "It's time to implement #22298. Please delete this test and Settings#getAsBooleanLenientForPreEs6Indices().",
+ Version.CURRENT.minimumCompatibilityVersion().before(Version.V_6_0_0_alpha1_UNRELEASED));
+
+
+ String falsy = randomFrom("false", "off", "no", "0");
+ String truthy = randomFrom("true", "on", "yes", "1");
+
+ Settings settings = Settings.builder()
+ .put("foo", falsy)
+ .put("bar", truthy).build();
+
+ assertFalse(settings.getAsBooleanLenientForPreEs6Indices(Version.V_5_0_0, "foo", null));
+ assertTrue(settings.getAsBooleanLenientForPreEs6Indices(Version.V_5_0_0, "bar", null));
+ assertTrue(settings.getAsBooleanLenientForPreEs6Indices(Version.V_5_0_0, "baz", true));
+
+ List<String> expectedDeprecationWarnings = new ArrayList<>();
+ if (Booleans.isBoolean(falsy) == false) {
+ expectedDeprecationWarnings.add(
+ "The value [" + falsy + "] of setting [foo] is not coerced into boolean anymore. Please change this value to [false].");
+ }
+ if (Booleans.isBoolean(truthy) == false) {
+ expectedDeprecationWarnings.add(
+ "The value [" + truthy + "] of setting [bar] is not coerced into boolean anymore. Please change this value to [true].");
+ }
+
+ if (expectedDeprecationWarnings.isEmpty() == false) {
+ assertWarnings(expectedDeprecationWarnings.toArray(new String[1]));
+ }
+ }
+
+ @SuppressWarnings("deprecation") //#getAsBooleanLenientForPreEs6Indices is the test subject
+ public void testInvalidLenientBooleanForCurrentIndexVersion() {
+ String falsy = randomFrom("off", "no", "0");
+ String truthy = randomFrom("on", "yes", "1");
+
+ Settings settings = Settings.builder()
+ .put("foo", falsy)
+ .put("bar", truthy).build();
+
+ expectThrows(IllegalArgumentException.class,
+ () -> settings.getAsBooleanLenientForPreEs6Indices(Version.CURRENT, "foo", null));
+ expectThrows(IllegalArgumentException.class,
+ () -> settings.getAsBooleanLenientForPreEs6Indices(Version.CURRENT, "bar", null));
+ }
+
+ @SuppressWarnings("deprecation") //#getAsBooleanLenientForPreEs6Indices is the test subject
+ public void testValidLenientBooleanForCurrentIndexVersion() {
+ Settings settings = Settings.builder()
+ .put("foo", "false")
+ .put("bar", "true").build();
+
+ assertFalse(settings.getAsBooleanLenientForPreEs6Indices(Version.CURRENT, "foo", null));
+ assertTrue(settings.getAsBooleanLenientForPreEs6Indices(Version.CURRENT, "bar", null));
+ assertTrue(settings.getAsBooleanLenientForPreEs6Indices(Version.CURRENT, "baz", true));
+ }
+
public void testMultLevelGetPrefix() {
Settings settings = Settings.builder()
.put("1.2.3", "hello world")
diff --git a/core/src/test/java/org/elasticsearch/common/xcontent/XContentParserTests.java b/core/src/test/java/org/elasticsearch/common/xcontent/XContentParserTests.java
index a7257fbca8..02fd68890a 100644
--- a/core/src/test/java/org/elasticsearch/common/xcontent/XContentParserTests.java
+++ b/core/src/test/java/org/elasticsearch/common/xcontent/XContentParserTests.java
@@ -19,11 +19,13 @@
package org.elasticsearch.common.xcontent;
+import com.fasterxml.jackson.core.JsonParseException;
import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.elasticsearch.test.ESTestCase;
import java.io.IOException;
+import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -32,6 +34,7 @@ import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.isIn;
import static org.hamcrest.Matchers.nullValue;
public class XContentParserTests extends ESTestCase {
@@ -102,4 +105,92 @@ public class XContentParserTests extends ESTestCase {
return randomBoolean() ? parser.mapStringsOrdered() : parser.mapStrings();
}
}
+
+ @SuppressWarnings("deprecation") // #isBooleanValueLenient() and #booleanValueLenient() are the test subjects
+ public void testReadLenientBooleans() throws IOException {
+ // allow String, boolean and int representations of lenient booleans
+ String falsy = randomFrom("\"off\"", "\"no\"", "\"0\"", "0", "\"false\"", "false");
+ String truthy = randomFrom("\"on\"", "\"yes\"", "\"1\"", "1", "\"true\"", "true");
+
+ try (XContentParser parser = createParser(JsonXContent.jsonXContent, "{\"foo\": " + falsy + ", \"bar\": " + truthy + "}")) {
+ XContentParser.Token token = parser.nextToken();
+ assertThat(token, equalTo(XContentParser.Token.START_OBJECT));
+ token = parser.nextToken();
+ assertThat(token, equalTo(XContentParser.Token.FIELD_NAME));
+ assertThat(parser.currentName(), equalTo("foo"));
+ token = parser.nextToken();
+ assertThat(token, isIn(
+ Arrays.asList(XContentParser.Token.VALUE_STRING, XContentParser.Token.VALUE_NUMBER, XContentParser.Token.VALUE_BOOLEAN)));
+ assertTrue(parser.isBooleanValueLenient());
+ assertFalse(parser.booleanValueLenient());
+
+ token = parser.nextToken();
+ assertThat(token, equalTo(XContentParser.Token.FIELD_NAME));
+ assertThat(parser.currentName(), equalTo("bar"));
+ token = parser.nextToken();
+ assertThat(token, isIn(
+ Arrays.asList(XContentParser.Token.VALUE_STRING, XContentParser.Token.VALUE_NUMBER, XContentParser.Token.VALUE_BOOLEAN)));
+ assertTrue(parser.isBooleanValueLenient());
+ assertTrue(parser.booleanValueLenient());
+ }
+ }
+
+ public void testReadBooleansFailsForLenientBooleans() throws IOException {
+ String falsy = randomFrom("\"off\"", "\"no\"", "\"0\"", "0");
+ String truthy = randomFrom("\"on\"", "\"yes\"", "\"1\"", "1");
+
+ try (XContentParser parser = createParser(JsonXContent.jsonXContent, "{\"foo\": " + falsy + ", \"bar\": " + truthy + "}")) {
+ XContentParser.Token token = parser.nextToken();
+ assertThat(token, equalTo(XContentParser.Token.START_OBJECT));
+
+ token = parser.nextToken();
+ assertThat(token, equalTo(XContentParser.Token.FIELD_NAME));
+ assertThat(parser.currentName(), equalTo("foo"));
+ token = parser.nextToken();
+ assertThat(token, isIn(Arrays.asList(XContentParser.Token.VALUE_STRING, XContentParser.Token.VALUE_NUMBER)));
+ assertFalse(parser.isBooleanValue());
+ if (token.equals(XContentParser.Token.VALUE_STRING)) {
+ expectThrows(IllegalArgumentException.class, parser::booleanValue);
+ } else {
+ expectThrows(JsonParseException.class, parser::booleanValue);
+ }
+
+ token = parser.nextToken();
+ assertThat(token, equalTo(XContentParser.Token.FIELD_NAME));
+ assertThat(parser.currentName(), equalTo("bar"));
+ token = parser.nextToken();
+ assertThat(token, isIn(Arrays.asList(XContentParser.Token.VALUE_STRING, XContentParser.Token.VALUE_NUMBER)));
+ assertFalse(parser.isBooleanValue());
+ if (token.equals(XContentParser.Token.VALUE_STRING)) {
+ expectThrows(IllegalArgumentException.class, parser::booleanValue);
+ } else {
+ expectThrows(JsonParseException.class, parser::booleanValue);
+ }
+ }
+ }
+
+ public void testReadBooleans() throws IOException {
+ String falsy = randomFrom("\"false\"", "false");
+ String truthy = randomFrom("\"true\"", "true");
+
+ try (XContentParser parser = createParser(JsonXContent.jsonXContent, "{\"foo\": " + falsy + ", \"bar\": " + truthy + "}")) {
+ XContentParser.Token token = parser.nextToken();
+ assertThat(token, equalTo(XContentParser.Token.START_OBJECT));
+ token = parser.nextToken();
+ assertThat(token, equalTo(XContentParser.Token.FIELD_NAME));
+ assertThat(parser.currentName(), equalTo("foo"));
+ token = parser.nextToken();
+ assertThat(token, isIn(Arrays.asList(XContentParser.Token.VALUE_STRING, XContentParser.Token.VALUE_BOOLEAN)));
+ assertTrue(parser.isBooleanValue());
+ assertFalse(parser.booleanValue());
+
+ token = parser.nextToken();
+ assertThat(token, equalTo(XContentParser.Token.FIELD_NAME));
+ assertThat(parser.currentName(), equalTo("bar"));
+ token = parser.nextToken();
+ assertThat(token, isIn(Arrays.asList(XContentParser.Token.VALUE_STRING, XContentParser.Token.VALUE_BOOLEAN)));
+ assertTrue(parser.isBooleanValue());
+ assertTrue(parser.booleanValue());
+ }
+ }
}
diff --git a/core/src/test/java/org/elasticsearch/index/IndexModuleTests.java b/core/src/test/java/org/elasticsearch/index/IndexModuleTests.java
index 0958bbc605..86dbc8b740 100644
--- a/core/src/test/java/org/elasticsearch/index/IndexModuleTests.java
+++ b/core/src/test/java/org/elasticsearch/index/IndexModuleTests.java
@@ -296,7 +296,7 @@ public class IndexModuleTests extends ESTestCase {
.build();
IndexModule module = new IndexModule(IndexSettingsModule.newIndexSettings("foo", indexSettings),
new AnalysisRegistry(environment, emptyMap(), emptyMap(), emptyMap(), emptyMap(), emptyMap()));
- module.addSimilarity("test_similarity", (string, settings) -> new SimilarityProvider() {
+ module.addSimilarity("test_similarity", (string, providerSettings, indexLevelSettings) -> new SimilarityProvider() {
@Override
public String name() {
return string;
@@ -304,7 +304,7 @@ public class IndexModuleTests extends ESTestCase {
@Override
public Similarity get() {
- return new TestSimilarity(settings.get("key"));
+ return new TestSimilarity(providerSettings.get("key"));
}
});
diff --git a/core/src/test/java/org/elasticsearch/index/IndexServiceTests.java b/core/src/test/java/org/elasticsearch/index/IndexServiceTests.java
index a601f238d2..28d67a4a1e 100644
--- a/core/src/test/java/org/elasticsearch/index/IndexServiceTests.java
+++ b/core/src/test/java/org/elasticsearch/index/IndexServiceTests.java
@@ -21,9 +21,8 @@ package org.elasticsearch.index;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.TopDocs;
-import org.elasticsearch.cluster.metadata.AliasMetaData;
+import org.elasticsearch.Version;
import org.elasticsearch.cluster.metadata.IndexMetaData;
-import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.compress.CompressedXContent;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
@@ -34,7 +33,6 @@ import org.elasticsearch.index.engine.Engine;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.shard.IndexShard;
import org.elasticsearch.index.translog.Translog;
-import org.elasticsearch.indices.InvalidAliasNameException;
import org.elasticsearch.test.ESSingleNodeTestCase;
import org.elasticsearch.threadpool.ThreadPool;
@@ -45,24 +43,32 @@ import java.util.concurrent.atomic.AtomicReference;
import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS;
import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS;
-import static org.elasticsearch.index.query.QueryBuilders.termQuery;
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.nullValue;
/** Unit test(s) for IndexService */
public class IndexServiceTests extends ESSingleNodeTestCase {
public void testDetermineShadowEngineShouldBeUsed() {
- Settings regularSettings = Settings.builder()
- .put(SETTING_NUMBER_OF_SHARDS, 2)
- .put(SETTING_NUMBER_OF_REPLICAS, 1)
- .build();
-
- Settings shadowSettings = Settings.builder()
- .put(SETTING_NUMBER_OF_SHARDS, 2)
- .put(SETTING_NUMBER_OF_REPLICAS, 1)
- .put(IndexMetaData.SETTING_SHADOW_REPLICAS, true)
- .build();
+ IndexSettings regularSettings = new IndexSettings(
+ IndexMetaData
+ .builder("regular")
+ .settings(Settings.builder()
+ .put(SETTING_NUMBER_OF_SHARDS, 2)
+ .put(SETTING_NUMBER_OF_REPLICAS, 1)
+ .put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
+ .build())
+ .build(),
+ Settings.EMPTY);
+
+ IndexSettings shadowSettings = new IndexSettings(
+ IndexMetaData
+ .builder("shadow")
+ .settings(Settings.builder()
+ .put(SETTING_NUMBER_OF_SHARDS, 2)
+ .put(SETTING_NUMBER_OF_REPLICAS, 1)
+ .put(IndexMetaData.SETTING_SHADOW_REPLICAS, true)
+ .put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
+ .build())
+ .build(),
+ Settings.EMPTY);
assertFalse("no shadow replicas for normal settings", IndexService.useShadowEngine(true, regularSettings));
assertFalse("no shadow replicas for normal settings", IndexService.useShadowEngine(false, regularSettings));
diff --git a/core/src/test/java/org/elasticsearch/index/IndexingSlowLogTests.java b/core/src/test/java/org/elasticsearch/index/IndexingSlowLogTests.java
index 16903a01d9..ecdba6ec44 100644
--- a/core/src/test/java/org/elasticsearch/index/IndexingSlowLogTests.java
+++ b/core/src/test/java/org/elasticsearch/index/IndexingSlowLogTests.java
@@ -88,7 +88,7 @@ public class IndexingSlowLogTests extends ESTestCase {
settings.updateIndexMetaData(newIndexMeta("index", Settings.builder().put(IndexingSlowLog.INDEX_INDEXING_SLOWLOG_REFORMAT_SETTING.getKey(), "NOT A BOOLEAN").build()));
fail();
} catch (IllegalArgumentException ex) {
- assertEquals(ex.getMessage(), "Failed to parse value [NOT A BOOLEAN] cannot be parsed to boolean [ true/1/on/yes OR false/0/off/no ]");
+ assertEquals(ex.getMessage(), "Failed to parse value [NOT A BOOLEAN] as only [true] or [false] are allowed.");
}
assertTrue(log.isReformat());
}
diff --git a/core/src/test/java/org/elasticsearch/index/mapper/BooleanFieldMapperTests.java b/core/src/test/java/org/elasticsearch/index/mapper/BooleanFieldMapperTests.java
index 308f775527..2486f91ccd 100644
--- a/core/src/test/java/org/elasticsearch/index/mapper/BooleanFieldMapperTests.java
+++ b/core/src/test/java/org/elasticsearch/index/mapper/BooleanFieldMapperTests.java
@@ -30,8 +30,12 @@ import org.apache.lucene.index.SortedNumericDocValues;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.Version;
+import org.elasticsearch.cluster.metadata.IndexMetaData;
+import org.elasticsearch.common.Booleans;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.compress.CompressedXContent;
+import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
@@ -43,19 +47,25 @@ import org.elasticsearch.test.InternalSettingsPlugin;
import org.junit.Before;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
import static org.hamcrest.Matchers.containsString;
public class BooleanFieldMapperTests extends ESSingleNodeTestCase {
-
- IndexService indexService;
- DocumentMapperParser parser;
+ private IndexService indexService;
+ private DocumentMapperParser parser;
+ private DocumentMapperParser preEs6Parser;
@Before
public void setup() {
indexService = createIndex("test");
parser = indexService.mapperService().documentMapperParser();
+
+ IndexService preEs6IndexService = createIndex("legacy",
+ Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_5_0_0).build());
+ preEs6Parser = preEs6IndexService.mapperService().documentMapperParser();
}
@Override
@@ -121,6 +131,69 @@ public class BooleanFieldMapperTests extends ESSingleNodeTestCase {
assertEquals("{\"field\":{\"type\":\"boolean\",\"doc_values\":false,\"null_value\":true}}", builder.string());
}
+ public void testParsesPreEs6BooleansLenient() throws IOException {
+ String mapping = XContentFactory.jsonBuilder()
+ .startObject()
+ .startObject("type")
+ .startObject("properties")
+ .startObject("field1")
+ .field("type", "boolean")
+ .endObject()
+ .startObject("field2")
+ .field("type", "boolean")
+ .endObject()
+ .endObject()
+ .endObject()
+ .endObject().string();
+ DocumentMapper defaultMapper = preEs6Parser.parse("type", new CompressedXContent(mapping));
+
+ String falsy = randomFrom("false", "off", "no", "0");
+ String truthy = randomFrom("true", "on", "yes", "1");
+
+ ParsedDocument parsedDoc = defaultMapper.parse("legacy", "type", "1", XContentFactory.jsonBuilder()
+ .startObject()
+ .field("field1", falsy)
+ .field("field2", truthy)
+ .endObject()
+ .bytes());
+ Document doc = parsedDoc.rootDoc();
+ assertEquals("F", doc.getField("field1").stringValue());
+ assertEquals("T", doc.getField("field2").stringValue());
+
+ List<String> expectedDeprecationWarnings = new ArrayList<>();
+ if (Booleans.isBoolean(falsy) == false) {
+ expectedDeprecationWarnings.add("Expected a boolean for property [field1] but got ["+ falsy + "]");
+ }
+ if (Booleans.isBoolean(truthy) == false) {
+ expectedDeprecationWarnings.add("Expected a boolean for property [field2] but got [" + truthy + "]");
+ }
+
+ if (expectedDeprecationWarnings.isEmpty() == false) {
+ assertWarnings(expectedDeprecationWarnings.toArray(new String[1]));
+ }
+ }
+
+ public void testParsesEs6BooleansStrict() throws IOException {
+ String mapping = XContentFactory.jsonBuilder()
+ .startObject()
+ .startObject("type")
+ .startObject("properties")
+ .startObject("field")
+ .field("type", "boolean")
+ .endObject()
+ .endObject()
+ .endObject()
+ .endObject().string();
+ DocumentMapper defaultMapper = parser.parse("type", new CompressedXContent(mapping));
+ BytesReference source = XContentFactory.jsonBuilder()
+ .startObject()
+ // omit "false"/"true" here as they should still be parsed correctly
+ .field("field", randomFrom("off", "no", "0", "on", "yes", "1"))
+ .endObject().bytes();
+ MapperParsingException ex = expectThrows(MapperParsingException.class, () -> defaultMapper.parse("test", "type", "1", source));
+ assertEquals("failed to parse [field]", ex.getMessage());
+ }
+
public void testMultiFields() throws IOException {
String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
.startObject("properties")
@@ -133,7 +206,8 @@ public class BooleanFieldMapperTests extends ESSingleNodeTestCase {
.endObject()
.endObject().endObject()
.endObject().endObject().string();
- DocumentMapper mapper = indexService.mapperService().merge("type", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE, false);
+ DocumentMapper mapper = indexService.mapperService()
+ .merge("type", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE, false);
assertEquals(mapping, mapper.mappingSource().toString());
BytesReference source = XContentFactory.jsonBuilder()
.startObject()
diff --git a/core/src/test/java/org/elasticsearch/index/mapper/FieldTypeTestCase.java b/core/src/test/java/org/elasticsearch/index/mapper/FieldTypeTestCase.java
index 96ca2e72b9..5d86602c4c 100644
--- a/core/src/test/java/org/elasticsearch/index/mapper/FieldTypeTestCase.java
+++ b/core/src/test/java/org/elasticsearch/index/mapper/FieldTypeTestCase.java
@@ -19,6 +19,8 @@
package org.elasticsearch.index.mapper;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.elasticsearch.Version;
+import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.analysis.AnalyzerScope;
import org.elasticsearch.index.analysis.NamedAnalyzer;
@@ -32,6 +34,8 @@ import java.util.List;
/** Base test case for subclasses of MappedFieldType */
public abstract class FieldTypeTestCase extends ESTestCase {
+ private static final Settings INDEX_SETTINGS = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT).build();
+
/** Abstraction for mutating a property of a MappedFieldType */
public abstract static class Modifier {
/** The name of the property that is being modified. Used in test failure messages. */
@@ -117,17 +121,17 @@ public abstract class FieldTypeTestCase extends ESTestCase {
new Modifier("similarity", false) {
@Override
public void modify(MappedFieldType ft) {
- ft.setSimilarity(new BM25SimilarityProvider("foo", Settings.EMPTY));
+ ft.setSimilarity(new BM25SimilarityProvider("foo", Settings.EMPTY, INDEX_SETTINGS));
}
},
new Modifier("similarity", false) {
@Override
public void modify(MappedFieldType ft) {
- ft.setSimilarity(new BM25SimilarityProvider("foo", Settings.EMPTY));
+ ft.setSimilarity(new BM25SimilarityProvider("foo", Settings.EMPTY, INDEX_SETTINGS));
}
@Override
public void normalizeOther(MappedFieldType other) {
- other.setSimilarity(new BM25SimilarityProvider("bar", Settings.EMPTY));
+ other.setSimilarity(new BM25SimilarityProvider("bar", Settings.EMPTY, INDEX_SETTINGS));
}
},
new Modifier("eager_global_ordinals", true) {
diff --git a/core/src/test/java/org/elasticsearch/index/mapper/UpdateMappingTests.java b/core/src/test/java/org/elasticsearch/index/mapper/UpdateMappingTests.java
index ee92f255d4..9321801d1f 100644
--- a/core/src/test/java/org/elasticsearch/index/mapper/UpdateMappingTests.java
+++ b/core/src/test/java/org/elasticsearch/index/mapper/UpdateMappingTests.java
@@ -53,13 +53,29 @@ public class UpdateMappingTests extends ESSingleNodeTestCase {
public void testConflictFieldsMapping(String fieldName) throws Exception {
//test store, ... all the parameters that are not to be changed just like in other fields
- XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
- .startObject(fieldName).field("enabled", true).field("store", "no").endObject()
- .endObject().endObject();
- XContentBuilder mappingUpdate = XContentFactory.jsonBuilder().startObject().startObject("type")
- .startObject(fieldName).field("enabled", true).field("store", "yes").endObject()
- .startObject("properties").startObject("text").field("type", "text").endObject().endObject()
- .endObject().endObject();
+ XContentBuilder mapping = XContentFactory.jsonBuilder()
+ .startObject()
+ .startObject("type")
+ .startObject(fieldName)
+ .field("enabled", true)
+ .field("store", false)
+ .endObject()
+ .endObject()
+ .endObject();
+ XContentBuilder mappingUpdate = XContentFactory.jsonBuilder()
+ .startObject()
+ .startObject("type")
+ .startObject(fieldName)
+ .field("enabled", true)
+ .field("store", true)
+ .endObject()
+ .startObject("properties")
+ .startObject("text")
+ .field("type", "text")
+ .endObject()
+ .endObject()
+ .endObject()
+ .endObject();
testConflictWhileMergingAndMappingUnchanged(mapping, mappingUpdate);
}
diff --git a/core/src/test/java/org/elasticsearch/index/query/HasChildQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/HasChildQueryBuilderTests.java
index ac5c93604d..032ebc392c 100644
--- a/core/src/test/java/org/elasticsearch/index/query/HasChildQueryBuilderTests.java
+++ b/core/src/test/java/org/elasticsearch/index/query/HasChildQueryBuilderTests.java
@@ -31,7 +31,9 @@ import org.apache.lucene.search.join.ScoreMode;
import org.apache.lucene.search.similarities.PerFieldSimilarityWrapper;
import org.apache.lucene.search.similarities.Similarity;
import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.Version;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
+import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.common.compress.CompressedXContent;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.mapper.MapperService;
@@ -273,7 +275,9 @@ public class HasChildQueryBuilderTests extends AbstractQueryTestCase<HasChildQue
QueryShardContext shardContext = createShardContext();
HasChildQueryBuilder hasChildQueryBuilder = QueryBuilders.hasChildQuery(CHILD_TYPE, new TermQueryBuilder("custom_string", "value"), ScoreMode.None);
HasChildQueryBuilder.LateParsingQuery query = (HasChildQueryBuilder.LateParsingQuery) hasChildQueryBuilder.toQuery(shardContext);
- Similarity expected = SimilarityService.BUILT_IN.get(similarity).apply(similarity, Settings.EMPTY).get();
+ Similarity expected = SimilarityService.BUILT_IN.get(similarity)
+ .apply(similarity, Settings.EMPTY, Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT).build())
+ .get();
assertThat(((PerFieldSimilarityWrapper) query.getSimilarity()).get("custom_string"), instanceOf(expected.getClass()));
}
diff --git a/core/src/test/java/org/elasticsearch/indices/analysis/AnalysisModuleTests.java b/core/src/test/java/org/elasticsearch/indices/analysis/AnalysisModuleTests.java
index b568ae9276..012fae17f5 100644
--- a/core/src/test/java/org/elasticsearch/indices/analysis/AnalysisModuleTests.java
+++ b/core/src/test/java/org/elasticsearch/indices/analysis/AnalysisModuleTests.java
@@ -306,7 +306,7 @@ public class AnalysisModuleTests extends ModuleTestCase {
// assertThat(dictionaryDecompounderAnalyze.tokenFilters().length, equalTo(1));
// assertThat(dictionaryDecompounderAnalyze.tokenFilters()[0], instanceOf(DictionaryCompoundWordTokenFilterFactory.class));
- Set<?> wordList = Analysis.getWordSet(null, settings, "index.analysis.filter.dict_dec.word_list");
+ Set<?> wordList = Analysis.getWordSet(null, Version.CURRENT, settings, "index.analysis.filter.dict_dec.word_list");
MatcherAssert.assertThat(wordList.size(), equalTo(6));
// MatcherAssert.assertThat(wordList, hasItems("donau", "dampf", "schiff", "spargel", "creme", "suppe"));
}
@@ -321,7 +321,7 @@ public class AnalysisModuleTests extends ModuleTestCase {
Path wordListFile = generateWordList(words);
settings = Settings.builder().loadFromSource("index: \n word_list_path: " + wordListFile.toAbsolutePath()).build();
- Set<?> wordList = Analysis.getWordSet(env, settings, "index.word_list");
+ Set<?> wordList = Analysis.getWordSet(env, Version.CURRENT, settings, "index.word_list");
MatcherAssert.assertThat(wordList.size(), equalTo(6));
// MatcherAssert.assertThat(wordList, hasItems(words));
Files.delete(wordListFile);
diff --git a/core/src/test/java/org/elasticsearch/indices/template/SimpleIndexTemplateIT.java b/core/src/test/java/org/elasticsearch/indices/template/SimpleIndexTemplateIT.java
index 521446583c..6469b660f0 100644
--- a/core/src/test/java/org/elasticsearch/indices/template/SimpleIndexTemplateIT.java
+++ b/core/src/test/java/org/elasticsearch/indices/template/SimpleIndexTemplateIT.java
@@ -154,18 +154,37 @@ public class SimpleIndexTemplateIT extends ESIntegTestCase {
client().admin().indices().preparePutTemplate("template_1")
.setPatterns(Collections.singletonList("te*"))
.setOrder(0)
- .addMapping("type1", XContentFactory.jsonBuilder().startObject().startObject("type1").startObject("properties")
- .startObject("field1").field("type", "text").field("store", true).endObject()
- .startObject("field2").field("type", "text").field("store", true).endObject()
- .endObject().endObject().endObject())
+ .addMapping("type1", XContentFactory.jsonBuilder()
+ .startObject()
+ .startObject("type1")
+ .startObject("properties")
+ .startObject("field1")
+ .field("type", "text")
+ .field("store", true)
+ .endObject()
+ .startObject("field2")
+ .field("type", "text")
+ .field("store", true)
+ .endObject()
+ .endObject()
+ .endObject()
+ .endObject())
.execute().actionGet();
client().admin().indices().preparePutTemplate("template_2")
.setPatterns(Collections.singletonList("test*"))
.setOrder(1)
- .addMapping("type1", XContentFactory.jsonBuilder().startObject().startObject("type1").startObject("properties")
- .startObject("field2").field("type", "text").field("store", "no").endObject()
- .endObject().endObject().endObject())
+ .addMapping("type1", XContentFactory.jsonBuilder()
+ .startObject()
+ .startObject("type1")
+ .startObject("properties")
+ .startObject("field2")
+ .field("type", "text")
+ .field("store", false)
+ .endObject()
+ .endObject()
+ .endObject()
+ .endObject())
.execute().actionGet();
logger.info("--> explicitly delete template_1");
diff --git a/core/src/test/java/org/elasticsearch/rest/BaseRestHandlerTests.java b/core/src/test/java/org/elasticsearch/rest/BaseRestHandlerTests.java
index 3e3d310b33..80ee4dd6d0 100644
--- a/core/src/test/java/org/elasticsearch/rest/BaseRestHandlerTests.java
+++ b/core/src/test/java/org/elasticsearch/rest/BaseRestHandlerTests.java
@@ -160,8 +160,8 @@ public class BaseRestHandlerTests extends ESTestCase {
final HashMap<String, String> params = new HashMap<>();
params.put("format", randomAsciiOfLength(8));
params.put("filter_path", randomAsciiOfLength(8));
- params.put("pretty", randomAsciiOfLength(8));
- params.put("human", randomAsciiOfLength(8));
+ params.put("pretty", randomFrom("true", "false", "", null));
+ params.put("human", null);
RestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withParams(params).build();
RestChannel channel = new FakeRestChannel(request, randomBoolean(), 1);
handler.handleRequest(request, channel, mock(NodeClient.class));
diff --git a/core/src/test/java/org/elasticsearch/rest/action/cat/RestTableTests.java b/core/src/test/java/org/elasticsearch/rest/action/cat/RestTableTests.java
index cf42f2b1b3..38ed76cae5 100644
--- a/core/src/test/java/org/elasticsearch/rest/action/cat/RestTableTests.java
+++ b/core/src/test/java/org/elasticsearch/rest/action/cat/RestTableTests.java
@@ -139,7 +139,7 @@ public class RestTableTests extends ESTestCase {
public void testThatDisplayHeadersWithoutTimestamp() throws Exception {
restRequest.params().put("h", "timestamp,epoch,bulk*");
- restRequest.params().put("ts", "0");
+ restRequest.params().put("ts", "false");
List<RestTable.DisplayHeader> headers = buildDisplayHeaders(table, restRequest);
List<String> headerNames = getHeaderNames(headers);
diff --git a/core/src/test/java/org/elasticsearch/script/ScriptContextTests.java b/core/src/test/java/org/elasticsearch/script/ScriptContextTests.java
index 9578e0c628..d961fd677a 100644
--- a/core/src/test/java/org/elasticsearch/script/ScriptContextTests.java
+++ b/core/src/test/java/org/elasticsearch/script/ScriptContextTests.java
@@ -37,7 +37,7 @@ public class ScriptContextTests extends ESTestCase {
Settings settings = Settings.builder()
.put(Environment.PATH_HOME_SETTING.getKey(), createTempDir())
// no file watching, so we don't need a ResourceWatcherService
- .put(ScriptService.SCRIPT_AUTO_RELOAD_ENABLED_SETTING.getKey(), "off")
+ .put(ScriptService.SCRIPT_AUTO_RELOAD_ENABLED_SETTING.getKey(), "false")
.put("script." + PLUGIN_NAME + "_custom_globally_disabled_op", "false")
.put("script.engine." + MockScriptEngine.NAME + ".inline." + PLUGIN_NAME + "_custom_exp_disabled_op", "false")
.build();
diff --git a/core/src/test/java/org/elasticsearch/snapshots/SharedClusterSnapshotRestoreIT.java b/core/src/test/java/org/elasticsearch/snapshots/SharedClusterSnapshotRestoreIT.java
index ef6275e2cc..acc8967082 100644
--- a/core/src/test/java/org/elasticsearch/snapshots/SharedClusterSnapshotRestoreIT.java
+++ b/core/src/test/java/org/elasticsearch/snapshots/SharedClusterSnapshotRestoreIT.java
@@ -445,10 +445,25 @@ public class SharedClusterSnapshotRestoreIT extends AbstractSnapshotIntegTestCas
.setType("fs").setSettings(Settings.builder().put("location", randomRepoPath())));
logger.info("--> creating test template");
- assertThat(client.admin().indices().preparePutTemplate("test-template").setPatterns(Collections.singletonList("te*")).addMapping("test-mapping", XContentFactory.jsonBuilder().startObject().startObject("test-mapping").startObject("properties")
- .startObject("field1").field("type", "text").field("store", "yes").endObject()
- .startObject("field2").field("type", "keyword").field("store", "yes").endObject()
- .endObject().endObject().endObject()).get().isAcknowledged(), equalTo(true));
+ assertThat(client.admin().indices()
+ .preparePutTemplate("test-template")
+ .setPatterns(Collections.singletonList("te*"))
+ .addMapping("test-mapping", XContentFactory.jsonBuilder()
+ .startObject()
+ .startObject("test-mapping")
+ .startObject("properties")
+ .startObject("field1")
+ .field("type", "text")
+ .field("store", true)
+ .endObject()
+ .startObject("field2")
+ .field("type", "keyword")
+ .field("store", true)
+ .endObject()
+ .endObject()
+ .endObject()
+ .endObject())
+ .get().isAcknowledged(), equalTo(true));
logger.info("--> snapshot");
CreateSnapshotResponse createSnapshotResponse = client.admin().cluster().prepareCreateSnapshot("test-repo", "test-snap").setIndices().setWaitForCompletion(true).get();
@@ -486,10 +501,25 @@ public class SharedClusterSnapshotRestoreIT extends AbstractSnapshotIntegTestCas
if(testTemplate) {
logger.info("--> creating test template");
- assertThat(client.admin().indices().preparePutTemplate("test-template").setPatterns(Collections.singletonList("te*")).addMapping("test-mapping", XContentFactory.jsonBuilder().startObject().startObject("test-mapping").startObject("properties")
- .startObject("field1").field("type", "text").field("store", "yes").endObject()
- .startObject("field2").field("type", "keyword").field("store", "yes").endObject()
- .endObject().endObject().endObject()).get().isAcknowledged(), equalTo(true));
+ assertThat(client.admin().indices()
+ .preparePutTemplate("test-template")
+ .setPatterns(Collections.singletonList("te*"))
+ .addMapping("test-mapping", XContentFactory.jsonBuilder()
+ .startObject()
+ .startObject("test-mapping")
+ .startObject("properties")
+ .startObject("field1")
+ .field("type", "text")
+ .field("store", true)
+ .endObject()
+ .startObject("field2")
+ .field("type", "keyword")
+ .field("store", true)
+ .endObject()
+ .endObject()
+ .endObject()
+ .endObject())
+ .get().isAcknowledged(), equalTo(true));
}
if(testPipeline) {
diff --git a/core/src/test/resources/indices/bwc/index-5.1.1.zip b/core/src/test/resources/indices/bwc/index-5.1.1.zip
index ab13e00b66..49e89e6ccd 100644
--- a/core/src/test/resources/indices/bwc/index-5.1.1.zip
+++ b/core/src/test/resources/indices/bwc/index-5.1.1.zip
Binary files differ
diff --git a/core/src/test/resources/indices/bwc/repo-5.1.1.zip b/core/src/test/resources/indices/bwc/repo-5.1.1.zip
index 01a9645e55..9fef3e730a 100644
--- a/core/src/test/resources/indices/bwc/repo-5.1.1.zip
+++ b/core/src/test/resources/indices/bwc/repo-5.1.1.zip
Binary files differ
diff --git a/dev-tools/create_bwc_index.py b/dev-tools/create_bwc_index.py
index a6814e52f8..4703759e12 100644
--- a/dev-tools/create_bwc_index.py
+++ b/dev-tools/create_bwc_index.py
@@ -48,6 +48,28 @@ def rarely():
def frequently():
return not rarely()
+def capabilities_of(version):
+ current_version = parse_version(version)
+
+ return {
+ 'warmers': current_version < parse_version('2.0.0-alpha1'),
+ 'dots_in_field_names': current_version >= parse_version('2.4.0'),
+ 'lenient_booleans': current_version < parse_version('6.0.0-alpha1')
+ }
+
+
+def falsy(lenient):
+ return random.choice(['off', 'no', '0', 0, 'false', False]) if lenient else False
+
+
+def truthy(lenient):
+ return random.choice(['on', 'yes', '1', 1, 'true', True]) if lenient else True
+
+
+def random_bool(lenient):
+ return random.choice([falsy, truthy])(lenient)
+
+
# asserts the correctness of the given hits given they are sorted asc
def assert_sort(hits):
values = [hit['sort'] for hit in hits['hits']['hits']]
@@ -59,19 +81,23 @@ def assert_sort(hits):
# Indexes the given number of document into the given index
# and randomly runs refresh, optimize and flush commands
-def index_documents(es, index_name, type, num_docs, supports_dots_in_field_names):
+def index_documents(es, index_name, type, num_docs, capabilities):
logging.info('Indexing %s docs' % num_docs)
- index(es, index_name, type, num_docs, supports_dots_in_field_names, True)
+ index(es, index_name, type, num_docs, capabilities, flush=True)
logging.info('Flushing index')
es.indices.flush(index=index_name)
-def index(es, index_name, type, num_docs, supports_dots_in_field_names, flush=False):
+def index(es, index_name, type, num_docs, capabilities, flush=False):
for id in range(0, num_docs):
- body = {'string': str(random.randint(0, 100)),
- 'long_sort': random.randint(0, 100),
- 'double_sort' : float(random.randint(0, 100)),
- 'bool' : random.choice([True, False])}
- if supports_dots_in_field_names:
+ lenient_bool = capabilities['lenient_booleans']
+ body = {
+ 'string': str(random.randint(0, 100)),
+ 'long_sort': random.randint(0, 100),
+ 'double_sort': float(random.randint(0, 100)),
+ # be sure to create a "proper" boolean (True, False) for the first document so that automapping is correct
+ 'bool': random_bool(lenient_bool) if id > 0 else random.choice([True, False])
+ }
+ if capabilities['dots_in_field_names']:
body['field.with.dots'] = str(random.randint(0, 100))
body['binary'] = base64.b64encode(bytearray(random.getrandbits(8) for _ in range(16))).decode('ascii')
@@ -83,10 +109,14 @@ def index(es, index_name, type, num_docs, supports_dots_in_field_names, flush=Fa
if rarely() and flush:
es.indices.flush(index=index_name, force=frequently())
-def reindex_docs(es, index_name, type, num_docs, supports_dots_in_field_names):
+def reindex_docs(es, index_name, type, num_docs, capabilities):
logging.info('Re-indexing %s docs' % num_docs)
+ # TODO: Translog recovery fails on mixed representation of booleans as strings / booleans (e.g. "true", true)
+ # (see gradle :core:test -Dtests.seed=AF7BB7B3FA387AAE -Dtests.class=org.elasticsearch.index.engine.InternalEngineTests
+ # -Dtests.method="testUpgradeOldIndex")
+ capabilities['lenient_booleans'] = False
# reindex some docs after the flush such that we have something in the translog
- index(es, index_name, type, num_docs, supports_dots_in_field_names)
+ index(es, index_name, type, num_docs, capabilities)
def delete_by_query(es, version, index_name, doc_type):
@@ -200,9 +230,12 @@ def generate_index(client, version, index_name):
client.indices.delete(index=index_name, ignore=404)
logging.info('Create single shard test index')
+ capabilities = capabilities_of(version)
+ lenient_booleans = capabilities['lenient_booleans']
+
mappings = {}
warmers = {}
- if parse_version(version) < parse_version('2.0.0-alpha1'):
+ if capabilities['warmers']:
warmers['warmer1'] = {
'source': {
'query': {
@@ -249,7 +282,7 @@ def generate_index(client, version, index_name):
}
mappings['meta_fields'] = {
'_routing': {
- 'required': 'false'
+ 'required': falsy(lenient_booleans)
},
}
mappings['custom_formats'] = {
@@ -266,13 +299,12 @@ def generate_index(client, version, index_name):
}
mappings['auto_boost'] = {
'_all': {
- 'auto_boost': True
+ 'auto_boost': truthy(lenient_booleans)
}
}
mappings['doc'] = {'properties' : {}}
- supports_dots_in_field_names = parse_version(version) >= parse_version("2.4.0")
- if supports_dots_in_field_names:
+ if capabilities['dots_in_field_names']:
if parse_version(version) < parse_version("5.0.0-alpha1"):
mappings["doc"]['properties'].update({
'field.with.dots': {
@@ -320,7 +352,7 @@ def generate_index(client, version, index_name):
'properties': {
'string_with_norms_disabled': {
'type': 'text',
- 'norms' : False
+ 'norms': False
},
'string_with_norms_enabled': {
'type': 'keyword',
@@ -340,7 +372,7 @@ def generate_index(client, version, index_name):
# test back-compat of stored binary fields
mappings['doc']['properties']['binary'] = {
'type': 'binary',
- 'store': True,
+ 'store': truthy(lenient_booleans),
}
settings = {
@@ -372,13 +404,13 @@ def generate_index(client, version, index_name):
# lighter index for it to keep bw tests reasonable
# see https://github.com/elastic/elasticsearch/issues/5817
num_docs = int(num_docs / 10)
- index_documents(client, index_name, 'doc', num_docs, supports_dots_in_field_names)
+ index_documents(client, index_name, 'doc', num_docs, capabilities)
if parse_version(version) < parse_version('5.1.0'):
logging.info("Adding a alias that can't be created in 5.1+ so we can assert that we can still use it")
client.indices.put_alias(index=index_name, name='#' + index_name)
logging.info('Running basic asserts on the data added')
run_basic_asserts(client, version, index_name, 'doc', num_docs)
- return num_docs, supports_dots_in_field_names
+ return num_docs, capabilities
def snapshot_index(client, version, repo_dir):
persistent = {
@@ -400,7 +432,9 @@ def snapshot_index(client, version, repo_dir):
},
"mappings": {
"type1": {
- "_source": { "enabled" : False }
+ "_source": {
+ "enabled": falsy(capabilities_of(version)['lenient_booleans'])
+ }
}
},
"aliases": {
@@ -488,7 +522,7 @@ def create_bwc_index(cfg, version):
node = start_node(version, release_dir, data_dir, repo_dir, cfg.tcp_port, cfg.http_port)
client = create_client(cfg.http_port)
index_name = 'index-%s' % version.lower()
- num_docs, supports_dots_in_field_names = generate_index(client, version, index_name)
+ num_docs, capabilities = generate_index(client, version, index_name)
if snapshot_supported:
snapshot_index(client, version, repo_dir)
@@ -497,7 +531,7 @@ def create_bwc_index(cfg, version):
# will already have the deletions applied on upgrade.
if version.startswith('0.') or version.startswith('1.'):
delete_by_query(client, version, index_name, 'doc')
- reindex_docs(client, index_name, 'doc', min(100, num_docs), supports_dots_in_field_names)
+ reindex_docs(client, index_name, 'doc', min(100, num_docs), capabilities)
shutdown_node(node)
node = None
diff --git a/docs/reference/analysis/tokenfilters/pattern-capture-tokenfilter.asciidoc b/docs/reference/analysis/tokenfilters/pattern-capture-tokenfilter.asciidoc
index ccde46a3fd..b233081d54 100644
--- a/docs/reference/analysis/tokenfilters/pattern-capture-tokenfilter.asciidoc
+++ b/docs/reference/analysis/tokenfilters/pattern-capture-tokenfilter.asciidoc
@@ -53,7 +53,7 @@ curl -XPUT localhost:9200/test/ -d '
"filter" : {
"code" : {
"type" : "pattern_capture",
- "preserve_original" : 1,
+ "preserve_original" : true,
"patterns" : [
"(\\p{Ll}+|\\p{Lu}\\p{Ll}+|\\p{Lu}+)",
"(\\d+)"
@@ -94,7 +94,7 @@ curl -XPUT localhost:9200/test/ -d '
"filter" : {
"email" : {
"type" : "pattern_capture",
- "preserve_original" : 1,
+ "preserve_original" : true,
"patterns" : [
"([^@]+)",
"(\\p{L}+)",
diff --git a/docs/reference/api-conventions.asciidoc b/docs/reference/api-conventions.asciidoc
index efec2efe1a..712a7969a0 100644
--- a/docs/reference/api-conventions.asciidoc
+++ b/docs/reference/api-conventions.asciidoc
@@ -476,9 +476,8 @@ convention of using underscore casing.
=== Boolean Values
All REST APIs parameters (both request parameters and JSON body) support
-providing boolean "false" as the values: `false`, `0`, `no` and `off`.
-All other values are considered "true". Note, this is not related to
-fields within a document indexed treated as boolean fields.
+providing boolean "false" as the value `false` and boolean "true" as the
+value `true`. All other values will raise an error.
[float]
=== Number Values
diff --git a/docs/reference/cat/health.asciidoc b/docs/reference/cat/health.asciidoc
index cca24c66a3..a87fe4e5e4 100644
--- a/docs/reference/cat/health.asciidoc
+++ b/docs/reference/cat/health.asciidoc
@@ -22,7 +22,7 @@ It has one option `ts` to disable the timestamping:
[source,js]
--------------------------------------------------
-GET /_cat/health?v&ts=0
+GET /_cat/health?v&ts=false
--------------------------------------------------
// CONSOLE
// TEST[s/^/PUT twitter\n{"settings":{"number_of_replicas": 0}}\n/]
diff --git a/docs/reference/mapping/types/boolean.asciidoc b/docs/reference/mapping/types/boolean.asciidoc
index d273dddb27..5f52192265 100644
--- a/docs/reference/mapping/types/boolean.asciidoc
+++ b/docs/reference/mapping/types/boolean.asciidoc
@@ -2,16 +2,16 @@
=== Boolean datatype
Boolean fields accept JSON `true` and `false` values, but can also accept
-strings and numbers which are interpreted as either true or false:
+strings which are interpreted as either true or false:
[horizontal]
False values::
- `false`, `"false"`, `"off"`, `"no"`, `"0"`, `""` (empty string), `0`, `0.0`
+ `false`, `"false"`
True values::
- Anything that isn't false.
+ `true`, `"true"`
For example:
@@ -32,7 +32,7 @@ PUT my_index
POST my_index/my_type/1
{
- "is_published": 1 <1>
+ "is_published": "true" <1>
}
GET my_index/_search
@@ -45,7 +45,7 @@ GET my_index/_search
}
--------------------------------------------------
// CONSOLE
-<1> Indexing a document with `1`, which is interpreted as `true`.
+<1> Indexing a document with `"true"`, which is interpreted as `true`.
<2> Searching for documents with a JSON `true`.
Aggregations like the <<search-aggregations-bucket-terms-aggregation,`terms`
diff --git a/docs/reference/migration/migrate_6_0/mappings.asciidoc b/docs/reference/migration/migrate_6_0/mappings.asciidoc
index b4f99fe7bd..b5fa55fdd5 100644
--- a/docs/reference/migration/migrate_6_0/mappings.asciidoc
+++ b/docs/reference/migration/migrate_6_0/mappings.asciidoc
@@ -1,6 +1,14 @@
[[breaking_60_mappings_changes]]
=== Mapping changes
+==== Coercion of boolean fields
+
+Previously, Elasticsearch recognized the strings `true`, `false`, `on`, `off`, `yes`, `no`, `0`, `1` as booleans. Elasticsearch 6.0
+recognizes only `true` and `false` as boolean and will throw an error otherwise. For backwards compatibility purposes, during the 6.x
+series the previous coercion rules will continue to work on pre-6.0 indices. This means that you do not need to change affected existing
+mappings immediately. However, it is not possible to create new indices from existing index templates that violate the strict `boolean`
+coercion rules.
+
==== The `_all` meta field is now disabled by default
On new mappings, the `_all` meta field that contains a copy of the text from
diff --git a/docs/reference/migration/migrate_6_0/rest.asciidoc b/docs/reference/migration/migrate_6_0/rest.asciidoc
index dcbc289300..1999ff6517 100644
--- a/docs/reference/migration/migrate_6_0/rest.asciidoc
+++ b/docs/reference/migration/migrate_6_0/rest.asciidoc
@@ -13,6 +13,11 @@ has been removed in Elasticsearch 6.0.0.
In previous versions of Elasticsearch, documents were allowed to contain duplicate keys. Elasticsearch 6.0.0
enforces that all keys are unique. This applies to all content types: JSON, CBOR, Yaml and Smile.
+==== Boolean API parameters
+
+All REST APIs parameters (both request parameters and JSON body) support providing boolean "false" as the
+value `false` and boolean "true" as the value `true`. All other values will raise an error.
+
==== Analyze API changes
The deprecated request parameters and plain text in request body has been removed. Define parameters in request body.
@@ -26,4 +31,4 @@ defaults.
=== `timestamp` and `ttl` in index requests
`timestamp` and `ttl` are not accepted anymore as parameters of index/update
-requests.
+requests. \ No newline at end of file
diff --git a/docs/reference/migration/migrate_6_0/settings.asciidoc b/docs/reference/migration/migrate_6_0/settings.asciidoc
index 65f242c078..ec25ffb601 100644
--- a/docs/reference/migration/migrate_6_0/settings.asciidoc
+++ b/docs/reference/migration/migrate_6_0/settings.asciidoc
@@ -1,6 +1,13 @@
[[breaking_60_settings_changes]]
=== Settings changes
+==== Coercion of boolean settings
+
+Previously, Elasticsearch recognized the strings `true`, `false`, `on`, `off`, `yes`, `no`, `0`, `1` as booleans. Elasticsearch 6.0
+recognizes only `true` and `false` as boolean and will throw an error otherwise. For backwards compatibility purposes, during the 6.x series
+index settings on pre-6.0 indices will continue to work. Note that this does not apply to node-level settings that are stored
+in `elasticsearch.yml`.
+
==== Snapshot settings
The internal setting `cluster.routing.allocation.snapshot.relocation_enabled` that allowed shards with running snapshots to be reallocated to
diff --git a/plugins/analysis-icu/src/main/java/org/elasticsearch/index/analysis/IcuCollationTokenFilterFactory.java b/plugins/analysis-icu/src/main/java/org/elasticsearch/index/analysis/IcuCollationTokenFilterFactory.java
index 091189f361..25ac75812e 100644
--- a/plugins/analysis-icu/src/main/java/org/elasticsearch/index/analysis/IcuCollationTokenFilterFactory.java
+++ b/plugins/analysis-icu/src/main/java/org/elasticsearch/index/analysis/IcuCollationTokenFilterFactory.java
@@ -131,7 +131,7 @@ public class IcuCollationTokenFilterFactory extends AbstractTokenFilterFactory {
}
}
- Boolean caseLevel = settings.getAsBoolean("caseLevel", null);
+ Boolean caseLevel = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "caseLevel", null);
if (caseLevel != null) {
rbc.setCaseLevel(caseLevel);
}
@@ -147,7 +147,7 @@ public class IcuCollationTokenFilterFactory extends AbstractTokenFilterFactory {
}
}
- Boolean numeric = settings.getAsBoolean("numeric", null);
+ Boolean numeric = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "numeric", null);
if (numeric != null) {
rbc.setNumericCollation(numeric);
}
@@ -157,7 +157,8 @@ public class IcuCollationTokenFilterFactory extends AbstractTokenFilterFactory {
rbc.setVariableTop(variableTop);
}
- Boolean hiraganaQuaternaryMode = settings.getAsBoolean("hiraganaQuaternaryMode", null);
+ Boolean hiraganaQuaternaryMode = settings
+ .getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "hiraganaQuaternaryMode", null);
if (hiraganaQuaternaryMode != null) {
rbc.setHiraganaQuaternary(hiraganaQuaternaryMode);
}
diff --git a/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/JapaneseStopTokenFilterFactory.java b/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/JapaneseStopTokenFilterFactory.java
index d10fe4089f..57d6c70846 100644
--- a/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/JapaneseStopTokenFilterFactory.java
+++ b/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/JapaneseStopTokenFilterFactory.java
@@ -45,8 +45,9 @@ public class JapaneseStopTokenFilterFactory extends AbstractTokenFilterFactory{
public JapaneseStopTokenFilterFactory(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- this.ignoreCase = settings.getAsBoolean("ignore_case", false);
- this.removeTrailing = settings.getAsBoolean("remove_trailing", true);
+ this.ignoreCase = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "ignore_case", false);
+ this.removeTrailing = settings
+ .getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "remove_trailing", true);
this.stopWords = Analysis.parseWords(env, settings, "stopwords", JapaneseAnalyzer.getDefaultStopSet(), NAMED_STOP_WORDS, ignoreCase);
}
diff --git a/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiAnalyzerProvider.java b/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiAnalyzerProvider.java
index 1776977c8e..3749f957a3 100644
--- a/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiAnalyzerProvider.java
+++ b/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiAnalyzerProvider.java
@@ -35,7 +35,8 @@ public class KuromojiAnalyzerProvider extends AbstractIndexAnalyzerProvider<Japa
public KuromojiAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- final Set<?> stopWords = Analysis.parseStopWords(env, settings, JapaneseAnalyzer.getDefaultStopSet());
+ final Set<?> stopWords = Analysis.parseStopWords(
+ env, indexSettings.getIndexVersionCreated(), settings, JapaneseAnalyzer.getDefaultStopSet());
final JapaneseTokenizer.Mode mode = KuromojiTokenizerFactory.getMode(settings);
final UserDictionary userDictionary = KuromojiTokenizerFactory.getUserDictionary(env, settings);
analyzer = new JapaneseAnalyzer(userDictionary, mode, CharArraySet.copy(stopWords), JapaneseAnalyzer.getDefaultStopTags());
diff --git a/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiIterationMarkCharFilterFactory.java b/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiIterationMarkCharFilterFactory.java
index 836dbbdfae..21387f1982 100644
--- a/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiIterationMarkCharFilterFactory.java
+++ b/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiIterationMarkCharFilterFactory.java
@@ -33,8 +33,10 @@ public class KuromojiIterationMarkCharFilterFactory extends AbstractCharFilterFa
public KuromojiIterationMarkCharFilterFactory(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name);
- normalizeKanji = settings.getAsBoolean("normalize_kanji", JapaneseIterationMarkCharFilter.NORMALIZE_KANJI_DEFAULT);
- normalizeKana = settings.getAsBoolean("normalize_kana", JapaneseIterationMarkCharFilter.NORMALIZE_KANA_DEFAULT);
+ normalizeKanji = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "normalize_kanji",
+ JapaneseIterationMarkCharFilter.NORMALIZE_KANJI_DEFAULT);
+ normalizeKana = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "normalize_kana",
+ JapaneseIterationMarkCharFilter.NORMALIZE_KANA_DEFAULT);
}
@Override
diff --git a/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiReadingFormFilterFactory.java b/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiReadingFormFilterFactory.java
index d0eb0cecdb..ae9247db9c 100644
--- a/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiReadingFormFilterFactory.java
+++ b/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiReadingFormFilterFactory.java
@@ -31,7 +31,7 @@ public class KuromojiReadingFormFilterFactory extends AbstractTokenFilterFactory
public KuromojiReadingFormFilterFactory(IndexSettings indexSettings, Environment environment, String name, Settings settings) {
super(indexSettings, name, settings);
- useRomaji = settings.getAsBoolean("use_romaji", false);
+ useRomaji = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "use_romaji", false);
}
@Override
diff --git a/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiTokenizerFactory.java b/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiTokenizerFactory.java
index 2f00e68a75..39dfc4ccc0 100644
--- a/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiTokenizerFactory.java
+++ b/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiTokenizerFactory.java
@@ -48,7 +48,8 @@ public class KuromojiTokenizerFactory extends AbstractTokenizerFactory {
super(indexSettings, name, settings);
mode = getMode(settings);
userDictionary = getUserDictionary(env, settings);
- discartPunctuation = settings.getAsBoolean("discard_punctuation", true);
+ discartPunctuation = settings
+ .getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "discard_punctuation", true);
nBestCost = settings.getAsInt(NBEST_COST, -1);
nBestExamples = settings.get(NBEST_EXAMPLES);
}
diff --git a/plugins/analysis-phonetic/src/main/java/org/elasticsearch/index/analysis/PhoneticTokenFilterFactory.java b/plugins/analysis-phonetic/src/main/java/org/elasticsearch/index/analysis/PhoneticTokenFilterFactory.java
index ff4ab4943e..93f68000ad 100644
--- a/plugins/analysis-phonetic/src/main/java/org/elasticsearch/index/analysis/PhoneticTokenFilterFactory.java
+++ b/plugins/analysis-phonetic/src/main/java/org/elasticsearch/index/analysis/PhoneticTokenFilterFactory.java
@@ -60,7 +60,7 @@ public class PhoneticTokenFilterFactory extends AbstractTokenFilterFactory {
this.nametype = null;
this.ruletype = null;
this.maxcodelength = 0;
- this.replace = settings.getAsBoolean("replace", true);
+ this.replace = settings.getAsBooleanLenientForPreEs6Indices(indexSettings.getIndexVersionCreated(), "replace", true);
// weird, encoder is null at last step in SimplePhoneticAnalysisTests, so we set it to metaphone as default
String encodername = settings.get("encoder", "metaphone");
if ("metaphone".equalsIgnoreCase(encodername)) {
diff --git a/plugins/analysis-ukrainian/src/main/java/org/elasticsearch/index/analysis/UkrainianAnalyzerProvider.java b/plugins/analysis-ukrainian/src/main/java/org/elasticsearch/index/analysis/UkrainianAnalyzerProvider.java
index 45bf27b954..0a00b752b9 100644
--- a/plugins/analysis-ukrainian/src/main/java/org/elasticsearch/index/analysis/UkrainianAnalyzerProvider.java
+++ b/plugins/analysis-ukrainian/src/main/java/org/elasticsearch/index/analysis/UkrainianAnalyzerProvider.java
@@ -24,8 +24,6 @@ import org.apache.lucene.analysis.uk.UkrainianMorfologikAnalyzer;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.env.Environment;
import org.elasticsearch.index.IndexSettings;
-import org.elasticsearch.index.analysis.AbstractIndexAnalyzerProvider;
-import org.elasticsearch.index.analysis.Analysis;
public class UkrainianAnalyzerProvider extends AbstractIndexAnalyzerProvider<UkrainianMorfologikAnalyzer> {
@@ -33,8 +31,10 @@ public class UkrainianAnalyzerProvider extends AbstractIndexAnalyzerProvider<Ukr
public UkrainianAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
super(indexSettings, name, settings);
- analyzer = new UkrainianMorfologikAnalyzer(Analysis.parseStopWords(env, settings, UkrainianMorfologikAnalyzer.getDefaultStopSet()),
- Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET));
+ analyzer = new UkrainianMorfologikAnalyzer(
+ Analysis.parseStopWords(env, indexSettings.getIndexVersionCreated(), settings, UkrainianMorfologikAnalyzer.getDefaultStopSet()),
+ Analysis.parseStemExclusion(settings, CharArraySet.EMPTY_SET)
+ );
analyzer.setVersion(version);
}
diff --git a/plugins/mapper-size/src/main/java/org/elasticsearch/index/mapper/size/SizeFieldMapper.java b/plugins/mapper-size/src/main/java/org/elasticsearch/index/mapper/size/SizeFieldMapper.java
index c2a7e79ff2..b2974f139f 100644
--- a/plugins/mapper-size/src/main/java/org/elasticsearch/index/mapper/size/SizeFieldMapper.java
+++ b/plugins/mapper-size/src/main/java/org/elasticsearch/index/mapper/size/SizeFieldMapper.java
@@ -32,14 +32,13 @@ import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MetadataFieldMapper;
import org.elasticsearch.index.mapper.NumberFieldMapper;
import org.elasticsearch.index.mapper.ParseContext;
+import org.elasticsearch.index.mapper.TypeParsers;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
-
public class SizeFieldMapper extends MetadataFieldMapper {
public static final String NAME = "_size";
@@ -102,8 +101,8 @@ public class SizeFieldMapper extends MetadataFieldMapper {
String fieldName = entry.getKey();
Object fieldNode = entry.getValue();
if (fieldName.equals("enabled")) {
- builder.enabled(lenientNodeBooleanValue(fieldNode) ?
- EnabledAttributeMapper.ENABLED : EnabledAttributeMapper.DISABLED);
+ boolean enabled = TypeParsers.nodeBooleanValue(name, "enabled", fieldNode, parserContext);
+ builder.enabled(enabled ? EnabledAttributeMapper.ENABLED : EnabledAttributeMapper.DISABLED);
iterator.remove();
}
}
diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/cat.health/10_basic.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/cat.health/10_basic.yaml
index 9225ad69ea..380caec931 100644
--- a/rest-api-spec/src/main/resources/rest-api-spec/test/cat.health/10_basic.yaml
+++ b/rest-api-spec/src/main/resources/rest-api-spec/test/cat.health/10_basic.yaml
@@ -57,7 +57,7 @@
- do:
cat.health:
- ts: 0
+ ts: false
- match:
$body: |
diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/exists/60_realtime_refresh.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/exists/60_realtime_refresh.yaml
index aa45376b52..df8c697e4a 100644
--- a/rest-api-spec/src/main/resources/rest-api-spec/test/exists/60_realtime_refresh.yaml
+++ b/rest-api-spec/src/main/resources/rest-api-spec/test/exists/60_realtime_refresh.yaml
@@ -26,7 +26,7 @@
index: test_1
type: test
id: 1
- realtime: 0
+ realtime: false
- is_false: ''
@@ -35,7 +35,7 @@
index: test_1
type: test
id: 1
- realtime: 1
+ realtime: true
- is_true: ''
@@ -44,7 +44,7 @@
index: test_1
type: test
id: 1
- realtime: 0
- refresh: 1
+ realtime: false
+ refresh: true
- is_true: ''
diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/get/60_realtime_refresh.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/get/60_realtime_refresh.yaml
index 0c705de5e7..7d02b4667e 100644
--- a/rest-api-spec/src/main/resources/rest-api-spec/test/get/60_realtime_refresh.yaml
+++ b/rest-api-spec/src/main/resources/rest-api-spec/test/get/60_realtime_refresh.yaml
@@ -27,14 +27,14 @@
index: test_1
type: test
id: 1
- realtime: 0
+ realtime: false
- do:
get:
index: test_1
type: test
id: 1
- realtime: 1
+ realtime: true
- is_true: found
@@ -43,7 +43,7 @@
index: test_1
type: test
id: 1
- realtime: 0
- refresh: 1
+ realtime: false
+ refresh: true
- is_true: found
diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/get_source/60_realtime_refresh.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/get_source/60_realtime_refresh.yaml
index 20009c87b2..fbf3948d7b 100644
--- a/rest-api-spec/src/main/resources/rest-api-spec/test/get_source/60_realtime_refresh.yaml
+++ b/rest-api-spec/src/main/resources/rest-api-spec/test/get_source/60_realtime_refresh.yaml
@@ -27,14 +27,14 @@
index: test_1
type: test
id: 1
- realtime: 0
+ realtime: false
- do:
get_source:
index: test_1
type: test
id: 1
- realtime: 1
+ realtime: true
- match: { '': {foo: bar}}
@@ -43,8 +43,8 @@
index: test_1
type: test
id: 1
- realtime: 0
- refresh: 1
+ realtime: false
+ refresh: true
- match: { '': {foo: bar}}
diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/mget/60_realtime_refresh.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/mget/60_realtime_refresh.yaml
index c688b4b0e9..0cb7b71cf4 100644
--- a/rest-api-spec/src/main/resources/rest-api-spec/test/mget/60_realtime_refresh.yaml
+++ b/rest-api-spec/src/main/resources/rest-api-spec/test/mget/60_realtime_refresh.yaml
@@ -25,7 +25,7 @@
mget:
index: test_1
type: test
- realtime: 0
+ realtime: false
body:
ids: [1]
@@ -35,7 +35,7 @@
mget:
index: test_1
type: test
- realtime: 1
+ realtime: true
body:
ids: [1]
@@ -45,8 +45,8 @@
mget:
index: test_1
type: test
- realtime: 0
- refresh: 1
+ realtime: false
+ refresh: true
body:
ids: [1]
diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/termvectors/20_issue7121.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/termvectors/20_issue7121.yaml
index cc04ea32a6..168c913b75 100644
--- a/rest-api-spec/src/main/resources/rest-api-spec/test/termvectors/20_issue7121.yaml
+++ b/rest-api-spec/src/main/resources/rest-api-spec/test/termvectors/20_issue7121.yaml
@@ -33,7 +33,7 @@
index: testidx
type: doc
id: 1
- realtime: 0
+ realtime: false
- match: { _index: "testidx" }
- match: { _type: "doc" }
diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/termvectors/30_realtime.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/termvectors/30_realtime.yaml
index 12457861c9..26f441207a 100644
--- a/rest-api-spec/src/main/resources/rest-api-spec/test/termvectors/30_realtime.yaml
+++ b/rest-api-spec/src/main/resources/rest-api-spec/test/termvectors/30_realtime.yaml
@@ -26,7 +26,7 @@
index: test_1
type: test
id: 1
- realtime: 0
+ realtime: false
- is_false: found
@@ -35,6 +35,6 @@
index: test_1
type: test
id: 1
- realtime: 1
+ realtime: true
- is_true: found
diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/update/22_doc_as_upsert.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/update/22_doc_as_upsert.yaml
index af25730fd7..7585b9f3e0 100644
--- a/rest-api-spec/src/main/resources/rest-api-spec/test/update/22_doc_as_upsert.yaml
+++ b/rest-api-spec/src/main/resources/rest-api-spec/test/update/22_doc_as_upsert.yaml
@@ -8,7 +8,7 @@
id: 1
body:
doc: { foo: bar, count: 1 }
- doc_as_upsert: 1
+ doc_as_upsert: true
- do:
get:
@@ -27,7 +27,7 @@
id: 1
body:
doc: { count: 2 }
- doc_as_upsert: 1
+ doc_as_upsert: true
- do:
get: