diff --git a/solr/core/src/java/org/apache/solr/index/BPReorderingMergePolicyFactory.java b/solr/core/src/java/org/apache/solr/index/BPReorderingMergePolicyFactory.java new file mode 100644 index 00000000000..5a5113d681b --- /dev/null +++ b/solr/core/src/java/org/apache/solr/index/BPReorderingMergePolicyFactory.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.apache.solr.index; + +import java.util.Set; +import org.apache.lucene.index.MergePolicy; +import org.apache.lucene.misc.index.BPIndexReorderer; +import org.apache.lucene.misc.index.BPReorderingMergePolicy; +import org.apache.solr.core.SolrResourceLoader; +import org.apache.solr.schema.IndexSchema; +import org.apache.solr.util.SolrPluginUtils; + +/** A {@link MergePolicyFactory} for {@code BPReorderingMergePolicy} objects. */ +public class BPReorderingMergePolicyFactory extends WrapperMergePolicyFactory { + + private static final String BPR_PREFIX = "bpr.prefix"; + + private final BPIndexReorderer reorderer; + + public BPReorderingMergePolicyFactory( + SolrResourceLoader resourceLoader, MergePolicyFactoryArgs args, IndexSchema schema) { + super(resourceLoader, args, schema); + reorderer = new BPIndexReorderer(); + MergePolicyFactoryArgs bprArgs = filterWrappedMergePolicyFactoryArgs(BPR_PREFIX); + if (bprArgs != null) { + final String fields = (String) bprArgs.remove("fields"); + if (fields != null) { + reorderer.setFields(Set.of(fields.split(","))); + } + SolrPluginUtils.invokeSetters(reorderer, bprArgs.args.entrySet()); + } + } + + @Override + protected MergePolicy getMergePolicyInstance(MergePolicy wrappedMP) { + final MergePolicy mp = new BPReorderingMergePolicy(wrappedMP, reorderer); + return mp; + } +} diff --git a/solr/core/src/java/org/apache/solr/index/MergePolicyFactoryArgs.java b/solr/core/src/java/org/apache/solr/index/MergePolicyFactoryArgs.java index 4cc55a77e58..9923b940953 100644 --- a/solr/core/src/java/org/apache/solr/index/MergePolicyFactoryArgs.java +++ b/solr/core/src/java/org/apache/solr/index/MergePolicyFactoryArgs.java @@ -24,7 +24,7 @@ public class MergePolicyFactoryArgs { - private final Map args; + final Map args; public MergePolicyFactoryArgs() { this.args = new HashMap<>(); diff --git a/solr/core/src/java/org/apache/solr/index/WrapperMergePolicyFactory.java b/solr/core/src/java/org/apache/solr/index/WrapperMergePolicyFactory.java index 8aa61ef8edf..d2ce876cbe0 100644 --- a/solr/core/src/java/org/apache/solr/index/WrapperMergePolicyFactory.java +++ b/solr/core/src/java/org/apache/solr/index/WrapperMergePolicyFactory.java @@ -38,7 +38,7 @@ public abstract class WrapperMergePolicyFactory extends MergePolicyFactory { protected WrapperMergePolicyFactory( SolrResourceLoader resourceLoader, MergePolicyFactoryArgs args, IndexSchema schema) { super(resourceLoader, args, schema); - wrappedMergePolicyArgs = filterWrappedMergePolicyFactoryArgs(); + wrappedMergePolicyArgs = filterWrappedMergePolicyFactoryArgs(WRAPPED_PREFIX); if (wrappedMergePolicyArgs == null) { wrappedMergePolicyClassName = null; } else { @@ -108,8 +108,8 @@ public final MergePolicy getMergePolicy() { * Returns a {@link MergePolicyFactoryArgs} for the wrapped {@link MergePolicyFactory}. This * method also removes all args from this instance's args. */ - private MergePolicyFactoryArgs filterWrappedMergePolicyFactoryArgs() { - final String wrappedPolicyPrefix = (String) args.remove(WRAPPED_PREFIX); + protected MergePolicyFactoryArgs filterWrappedMergePolicyFactoryArgs(String wrappedPrefix) { + final String wrappedPolicyPrefix = (String) args.remove(wrappedPrefix); if (wrappedPolicyPrefix == null) { return null; } diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig-bpreorderingmergepolicyfactory.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig-bpreorderingmergepolicyfactory.xml new file mode 100644 index 00000000000..c9144c24fbf --- /dev/null +++ b/solr/core/src/test-files/solr/collection1/conf/solrconfig-bpreorderingmergepolicyfactory.xml @@ -0,0 +1,64 @@ + + + + + + ${tests.luceneMatchVersion:LATEST} + + + + + + in + org.apache.solr.util.RandomForceMergePolicyFactory + bpr + 1 + 1 + 32 + 20 + 42.42 + foo,bar + 1 + 0.0 + + ${solr.tests.lockType:single} + + + + + + + ${solr.ulog.dir:} + + + + ${solr.autoCommit.maxTime:-1} + false + + + + ${solr.autoSoftCommit.maxTime:-1} + + + + + text + + + + diff --git a/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java b/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java index 2a59bbb8312..54c58df9d90 100644 --- a/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java +++ b/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java @@ -24,6 +24,7 @@ import org.apache.lucene.index.MergePolicy; import org.apache.lucene.index.SimpleMergedSegmentWarmer; import org.apache.lucene.index.TieredMergePolicy; +import org.apache.lucene.misc.index.BPReorderingMergePolicy; import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; import org.apache.solr.SolrTestCaseJ4; @@ -55,6 +56,8 @@ public class SolrIndexConfigTest extends SolrTestCaseJ4 { "solrconfig-concurrentmergescheduler.xml"; private static final String solrConfigFileNameSortingMergePolicyFactory = "solrconfig-sortingmergepolicyfactory.xml"; + private static final String solrConfigFileNameBPReorderingMergePolicyFactory = + "solrconfig-bpreorderingmergepolicyfactory.xml"; private static final String schemaFileName = "schema.xml"; private static boolean compoundMergePolicySort = false; @@ -169,6 +172,23 @@ public void testSortingMPSolrIndexConfigCreation() throws Exception { assertEquals("SortingMergePolicy.getSort", expected, actual); } + public void testBPReorderingMPSolrIndexConfigCreation() throws Exception { + SolrConfig solrConfig = + new SolrConfig(instanceDir, solrConfigFileNameBPReorderingMergePolicyFactory); + SolrIndexConfig solrIndexConfig = new SolrIndexConfig(solrConfig, null); + assertNotNull(solrIndexConfig); + IndexSchema indexSchema = IndexSchemaFactory.buildIndexSchema(schemaFileName, solrConfig); + + h.getCore().setLatestSchema(indexSchema); + IndexWriterConfig iwc = solrIndexConfig.toIndexWriterConfig(h.getCore()); + + final MergePolicy mergePolicy = iwc.getMergePolicy(); + assertNotNull("null mergePolicy", mergePolicy); + assertTrue( + "mergePolicy (" + mergePolicy + ") is not a BPReorderingMergePolicy", + mergePolicy instanceof BPReorderingMergePolicy); + } + public void testMergedSegmentWarmerIndexConfigCreation() throws Exception { SolrConfig solrConfig = new SolrConfig(instanceDir, solrConfigFileNameWarmerRandomMergePolicyFactory);