You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by th...@apache.org on 2015/03/20 15:52:19 UTC

svn commit: r1668034 - in /jackrabbit/oak/trunk/oak-lucene: ./ src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/ src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ src/main/java/org/apache/jackrabbit/oak/plugins/index/lucen...

Author: thomasm
Date: Fri Mar 20 14:52:19 2015
New Revision: 1668034

URL: http://svn.apache.org/r1668034
Log:
OAK-2399 Custom scorer for modifying score per documents

Added:
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProvider.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProviderFactory.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/impl/
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/impl/ScorerProviderFactoryImpl.java
Modified:
    jackrabbit/oak/trunk/oak-lucene/pom.xml
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java

Modified: jackrabbit/oak/trunk/oak-lucene/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/pom.xml?rev=1668034&r1=1668033&r2=1668034&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-lucene/pom.xml Fri Mar 20 14:52:19 2015
@@ -106,9 +106,13 @@
               org.apache.lucene.*;version=${lucene.version}
             </_exportcontents>
             <Export-Package>
-              org.apache.jackrabbit.oak.plugins.index.lucene,
-              org.apache.jackrabbit.oak.plugins.index.lucene.util
+                org.apache.jackrabbit.oak.plugins.index.lucene,
+                org.apache.jackrabbit.oak.plugins.index.lucene.util,
+                org.apache.jackrabbit.oak.plugins.index.lucene.score,
             </Export-Package>
+            <_exportcontents>
+                org.apache.lucene.*;version=${lucene.version}
+            </_exportcontents>
             <Import-Package>
                 org.apache.lucene.sandbox.*;resolution:=optional,
                 !org.apache.lucene.*,

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java?rev=1668034&r1=1668033&r2=1668034&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java Fri Mar 20 14:52:19 2015
@@ -185,6 +185,8 @@ class IndexDefinition implements Aggrega
 
     private final Analyzer analyzer;
 
+    private final String scorerProviderName;
+
     private final Map<String, Analyzer> analyzers;
 
     private final boolean hasCustomTikaConfig;
@@ -254,6 +256,7 @@ class IndexDefinition implements Aggrega
         this.hasCustomTikaConfig = getTikaConfigNode().exists();
         this.maxExtractLength = determineMaxExtractLength();
         this.suggesterUpdateFrequencyMinutes = getOptionalValue(defn, LuceneIndexConstants.SUGGEST_UPDATE_FREQUENCY_MINUTES, 60);
+        this.scorerProviderName = getOptionalValue(defn, LuceneIndexConstants.PROP_SCORER_PROVIDER, null);
     }
 
     public boolean isFullTextEnabled() {
@@ -354,6 +357,10 @@ class IndexDefinition implements Aggrega
         return maxExtractLength;
     }
 
+    public String getScorerProviderName() {
+        return scorerProviderName;
+    }
+
     @Override
     public String toString() {
         return "Lucene Index : " + indexName;

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java?rev=1668034&r1=1668033&r2=1668034&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java Fri Mar 20 14:52:19 2015
@@ -130,6 +130,8 @@ public interface LuceneIndexConstants {
 
     String PROP_ORDERED = "ordered";
 
+    String PROP_SCORER_PROVIDER = "scorerProviderName";
+
     /**
      * Integer property indicating that LuceneIndex should be
      * used in compat mode to specific version

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java?rev=1668034&r1=1668033&r2=1668034&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProvider.java Fri Mar 20 14:52:19 2015
@@ -23,6 +23,7 @@ import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.plugins.index.aggregate.AggregateIndex;
 import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
+import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.Observer;
 import org.apache.jackrabbit.oak.spi.query.QueryIndex;
@@ -42,12 +43,19 @@ public class LuceneIndexProvider impleme
 
     protected volatile NodeAggregator aggregator = null;
 
+    ScorerProviderFactory scorerFactory;
+
     public LuceneIndexProvider() {
         this(new IndexTracker());
     }
 
     public LuceneIndexProvider(IndexTracker tracker) {
+        this(tracker, ScorerProviderFactory.DEFAULT);
+    }
+
+    public LuceneIndexProvider(IndexTracker tracker, ScorerProviderFactory scorerFactory) {
         this.tracker = tracker;
+        this.scorerFactory = scorerFactory;
     }
 
     public void close() {
@@ -73,7 +81,7 @@ public class LuceneIndexProvider impleme
     }
 
     protected LucenePropertyIndex newLucenePropertyIndex() {
-        return new LucenePropertyIndex(tracker);
+        return new LucenePropertyIndex(tracker, scorerFactory);
     }
 
     /**

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java?rev=1668034&r1=1668033&r2=1668034&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java Fri Mar 20 14:52:19 2015
@@ -40,6 +40,7 @@ import org.apache.jackrabbit.oak.commons
 import org.apache.jackrabbit.oak.osgi.OsgiWhiteboard;
 import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
 import org.apache.jackrabbit.oak.spi.commit.BackgroundObserver;
+import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
 import org.apache.jackrabbit.oak.spi.commit.Observer;
 import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
@@ -109,6 +110,9 @@ public class LuceneIndexProviderService
 
     private BackgroundObserver backgroundObserver;
 
+    @Reference
+    ScorerProviderFactory scorerFactory;
+
     @Activate
     private void activate(BundleContext bundleContext, Map<String, ?> config)
             throws NotCompliantMBeanException {
@@ -117,7 +121,7 @@ public class LuceneIndexProviderService
         executor = new WhiteboardExecutor();
         executor.start(whiteboard);
 
-        indexProvider = new LuceneIndexProvider(createTracker(bundleContext, config));
+        indexProvider = new LuceneIndexProvider(createTracker(bundleContext, config), scorerFactory);
         initializeLogging(config);
         initialize();
 

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java?rev=1668034&r1=1668033&r2=1668034&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java Fri Mar 20 14:52:19 2015
@@ -43,6 +43,7 @@ import org.apache.jackrabbit.oak.commons
 import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
 import org.apache.jackrabbit.oak.plugins.index.lucene.IndexDefinition.IndexingRule;
 import org.apache.jackrabbit.oak.plugins.index.lucene.IndexPlanner.PlanResult;
+import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
 import org.apache.jackrabbit.oak.plugins.index.lucene.util.MoreLikeThisHelper;
 import org.apache.jackrabbit.oak.plugins.index.lucene.util.SpellcheckHelper;
 import org.apache.jackrabbit.oak.plugins.index.lucene.util.SuggestHelper;
@@ -70,6 +71,7 @@ import org.apache.lucene.index.IndexRead
 import org.apache.lucene.index.MultiFields;
 import org.apache.lucene.index.StoredFieldVisitor;
 import org.apache.lucene.index.Term;
+import org.apache.lucene.queries.CustomScoreQuery;
 import org.apache.lucene.queryparser.classic.ParseException;
 import org.apache.lucene.queryparser.classic.QueryParser;
 import org.apache.lucene.queryparser.flexible.core.QueryNodeException;
@@ -169,8 +171,16 @@ public class LucenePropertyIndex impleme
 
     protected final IndexTracker tracker;
 
+    private final ScorerProviderFactory scorerProviderFactory;
+
     public LucenePropertyIndex(IndexTracker tracker) {
         this.tracker = tracker;
+        this.scorerProviderFactory = ScorerProviderFactory.DEFAULT;
+    }
+
+    public LucenePropertyIndex(IndexTracker tracker, ScorerProviderFactory factory) {
+        this.tracker = tracker;
+        this.scorerProviderFactory = factory;
     }
 
     @Override
@@ -308,6 +318,13 @@ public class LucenePropertyIndex impleme
                     LuceneRequestFacade luceneRequestFacade = getLuceneRequest(plan, searcher.getIndexReader());
                     if (luceneRequestFacade.getLuceneRequest() instanceof Query) {
                         Query query = (Query) luceneRequestFacade.getLuceneRequest();
+
+                        CustomScoreQuery customScoreQuery = getCustomScoreQuery(plan, query);
+
+                        if (customScoreQuery != null) {
+                            query = customScoreQuery;
+                        }
+
                         TopDocs docs;
                         long time = System.currentTimeMillis();
                         if (lastDoc != null) {
@@ -584,6 +601,17 @@ public class LucenePropertyIndex impleme
         return new LuceneRequestFacade<Query>(bq);
     }
 
+    private CustomScoreQuery getCustomScoreQuery(IndexPlan plan, Query subQuery) {
+        PlanResult planResult = getPlanResult(plan);
+        IndexDefinition idxDef = planResult.indexDefinition;
+        String providerName = idxDef.getScorerProviderName();
+        if (scorerProviderFactory != null && providerName != null) {
+               return  scorerProviderFactory.getScorerProvider(providerName)
+                       .createCustomScoreQuery(subQuery);
+        }
+        return null;
+    }
+
     private static void addNonFullTextConstraints(List<Query> qs,
             IndexPlan plan, IndexReader reader) {
         Filter filter = plan.getFilter();

Added: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProvider.java?rev=1668034&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProvider.java (added)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProvider.java Fri Mar 20 14:52:19 2015
@@ -0,0 +1,25 @@
+/*
+ * 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.jackrabbit.oak.plugins.index.lucene.score;
+
+import org.apache.lucene.queries.CustomScoreQuery;
+import org.apache.lucene.search.Query;
+
+public interface ScorerProvider {
+    String getName();
+    CustomScoreQuery createCustomScoreQuery(Query subQuery);
+}

Added: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProviderFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProviderFactory.java?rev=1668034&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProviderFactory.java (added)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ScorerProviderFactory.java Fri Mar 20 14:52:19 2015
@@ -0,0 +1,28 @@
+/*
+ * 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.jackrabbit.oak.plugins.index.lucene.score;
+
+public interface ScorerProviderFactory {
+    ScorerProviderFactory DEFAULT = new ScorerProviderFactory() {
+        @Override
+        public ScorerProvider getScorerProvider(String name) {
+            return null;
+        }
+    };
+
+    ScorerProvider getScorerProvider(String name);
+}

Added: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/impl/ScorerProviderFactoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/impl/ScorerProviderFactoryImpl.java?rev=1668034&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/impl/ScorerProviderFactoryImpl.java (added)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/impl/ScorerProviderFactoryImpl.java Fri Mar 20 14:52:19 2015
@@ -0,0 +1,68 @@
+/*
+ * 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.jackrabbit.oak.plugins.index.lucene.score.impl;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProvider;
+import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component(metatype = false, immediate = true)
+@Service(value = ScorerProviderFactory.class)
+@Reference(name = "ScorerProvider",
+        policy = ReferencePolicy.DYNAMIC,
+        cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
+        referenceInterface = ScorerProvider.class,
+        bind = "bindScorerProvider",
+        unbind = "unbindScorerProvider"
+)
+public class ScorerProviderFactoryImpl implements ScorerProviderFactory {
+
+    private Map<String, ScorerProvider> scorerProviderMap =
+            new ConcurrentHashMap<String, ScorerProvider>();
+
+    @Activate
+    private void activate() {
+        scorerProviderMap.clear();
+    }
+
+    @Deactivate
+    private void deactivate() {
+        scorerProviderMap.clear();
+    }
+
+    @Override
+    public ScorerProvider getScorerProvider(String scorerName) {
+        return scorerProviderMap.get(scorerName);
+    }
+
+    private void bindScorerProvider(ScorerProvider provider) {
+        scorerProviderMap.put(provider.getName(), provider);
+    }
+
+    private void unbindScorerProvider(ScorerProvider provider) {
+        scorerProviderMap.remove(provider.getName());
+    }
+}

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java?rev=1668034&r1=1668033&r2=1668034&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java Fri Mar 20 14:52:19 2015
@@ -17,8 +17,10 @@
 package org.apache.jackrabbit.oak.plugins.index.lucene;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
@@ -31,6 +33,7 @@ import static com.google.common.collect.
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Sets.newHashSet;
 import static com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor;
+import static java.util.Arrays.asList;
 import static javax.jcr.PropertyType.TYPENAME_STRING;
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
@@ -50,6 +53,7 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PERSISTENCE_PATH;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.TestUtil.NT_TEST;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.TestUtil.createNodeWithType;
+import static org.apache.jackrabbit.oak.plugins.index.lucene.TestUtil.useV2;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.util.LuceneIndexHelper.newLuceneIndexDefinition;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.util.LuceneIndexHelper.newLucenePropertyIndexDefinition;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
@@ -58,10 +62,13 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.spi.query.QueryIndex.IndexPlan;
 
 import com.google.common.base.Function;
+import com.google.common.collect.Maps;
 import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateProvider;
+import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProvider;
+import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
 import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore;
 import org.apache.jackrabbit.oak.query.QueryEngineSettings;
 import org.apache.jackrabbit.oak.query.ast.Operator;
@@ -81,6 +88,12 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.index.AtomicReader;
+import org.apache.lucene.index.AtomicReaderContext;
+import org.apache.lucene.queries.CustomScoreProvider;
+import org.apache.lucene.queries.CustomScoreQuery;
+import org.apache.lucene.search.Query;
 import org.junit.After;
 import org.junit.Test;
 
@@ -426,6 +439,71 @@ public class LuceneIndexTest {
     }
 
     @Test
+    public void customScoreQuery() throws Exception{
+        NodeBuilder nb = newLuceneIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "lucene",
+                of(TYPENAME_STRING));
+        TestUtil.useV2(nb);
+        nb.setProperty(LuceneIndexConstants.PROP_SCORER_PROVIDER, "testScorer");
+
+        NodeState before = builder.getNodeState();
+        builder.child("a").setProperty("jcr:createdBy", "bar bar");
+        builder.child("b").setProperty("jcr:createdBy", "foo bar");
+        NodeState after = builder.getNodeState();
+        NodeState indexed = HOOK.processCommit(before, after,CommitInfo.EMPTY);
+        IndexTracker tracker = new IndexTracker();
+        tracker.update(indexed);
+
+        SimpleScorerFactory factory = new SimpleScorerFactory();
+        ScorerProvider provider = new ScorerProvider() {
+
+            String scorerName = "testScorer";
+            @Override
+            public String getName() {
+                return scorerName;
+            }
+            @Override
+            public CustomScoreQuery createCustomScoreQuery(Query query) {
+                return new ModifiedCustomScoreQuery(query);
+            }
+
+            class ModifiedCustomScoreQuery extends CustomScoreQuery {
+                private Query query;
+                public ModifiedCustomScoreQuery(Query query) {
+                    super(query);
+                    this.query = query;
+                }
+
+                @Override
+                public CustomScoreProvider getCustomScoreProvider(AtomicReaderContext context) {
+                    return new CustomScoreProvider(context) {
+                        public float customScore(int doc, float subQueryScore, float valSrcScore) {
+                            AtomicReader atomicReader = context.reader();
+                            try {
+                                Document document = atomicReader.document(doc);
+                                // boosting docs created by foo
+                                String fieldValue = document.get("full:jcr:createdBy");
+                                if (fieldValue != null && fieldValue.contains("foo")) {
+                                    valSrcScore *= 2.0;
+                                }
+                            } catch (IOException e) {
+                                return subQueryScore * valSrcScore;
+                            }
+                            return subQueryScore * valSrcScore;
+                        }
+                    };
+                }
+            }
+        };
+
+        factory.providers.put(provider.getName(), provider);
+        AdvancedQueryIndex queryIndex = new LucenePropertyIndex(tracker, factory);
+
+        FilterImpl filter = createFilter(NT_BASE);
+        filter.setFullTextConstraint(new FullTextTerm(null, "bar", false, false, null));
+        assertFilter(filter, queryIndex, indexed, asList("/b", "/a"), true);
+    }
+
+    @Test
     public void testTokens() {
         Analyzer analyzer = LuceneIndexConstants.ANALYZER;
         assertEquals(ImmutableList.of("parent", "child"),
@@ -608,9 +686,37 @@ public class LuceneIndexTest {
         return paths;
     }
 
+    private static List<String> assertFilter(Filter filter, AdvancedQueryIndex queryIndex,
+                                             NodeState indexed, List<String> expected, boolean ordered) {
+        if (!ordered) {
+            return assertFilter(filter, queryIndex, indexed, expected);
+        }
+
+        List<IndexPlan> plans = queryIndex.getPlans(filter, null, indexed);
+        Cursor cursor = queryIndex.query(plans.get(0), indexed);
+
+        List<String> paths = newArrayList();
+        while (cursor.hasNext()) {
+            paths.add(cursor.next().getPath());
+        }
+        for (String p : expected) {
+            assertTrue("Expected path " + p + " not found", paths.contains(p));
+        }
+        assertEquals("Result set size is different", expected.size(), paths.size());
+        return paths;
+    }
+
     private String getIndexDir(){
         File dir = new File("target", "indexdir"+System.nanoTime());
         dirs.add(dir);
         return dir.getAbsolutePath();
     }
+
+    private static class SimpleScorerFactory implements ScorerProviderFactory {
+        final Map<String,ScorerProvider> providers = Maps.newHashMap();
+        @Override
+        public ScorerProvider getScorerProvider(String name) {
+            return providers.get(name);
+        }
+    }
 }



Re: svn commit: r1668034 - in /jackrabbit/oak/trunk/oak-lucene: ./ src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/ src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/score/ src/main/java/org/apache/jackrabbit/oak/plugins/index/lucen...

Posted by Chetan Mehrotra <ch...@gmail.com>.
On Fri, Mar 20, 2015 at 8:22 PM, <th...@apache.org> wrote:

> +    @Activate
> +    private void activate() {
> +        scorerProviderMap.clear();
> +    }
>

Probably this should only be done in deactivate

Chetan Mehrotra