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 to...@apache.org on 2015/03/09 11:56:29 UTC

svn commit: r1665181 - in /jackrabbit/oak/branches/1.0: ./ oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/ oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/ oak-solr-core/src/main/java/org/ap...

Author: tommaso
Date: Mon Mar  9 10:56:29 2015
New Revision: 1665181

URL: http://svn.apache.org/r1665181
Log:
OAK-2168 - backported to branch 1.0

Added:
    jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/AdvancedSolrQueryIndex.java
      - copied, changed from r1646766, jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/AdvancedSolrQueryIndex.java
    jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/FilterQueryParser.java
      - copied, changed from r1646766, jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/FilterQueryParser.java
    jackrabbit/oak/branches/1.0/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/FilterQueryParserTest.java
      - copied unchanged from r1646766, jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/FilterQueryParserTest.java
Modified:
    jackrabbit/oak/branches/1.0/   (props changed)
    jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java
    jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrQueryIndexProviderService.java
    jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java
    jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexProvider.java
    jackrabbit/oak/branches/1.0/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/jcr/SolrOakRepositoryStub.java
    jackrabbit/oak/branches/1.0/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexTest.java

Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Mar  9 10:56:29 2015
@@ -1,2 +1,2 @@
-/jackrabbit/oak/trunk:1584578,1584602,1584614,1584616,1584709,1584781,1584937,1585297,1585304-1585305,1585420,1585424,1585427,1585448,1585465,1585468,1585486,1585497,1585509,1585647,1585655-1585656,1585661,1585665-1585666,1585669-1585670,1585673,1585680,1585719,1585763,1585770,1585896,1585904,1585907,1585940,1585949,1585951,1585956,1585962-1585963,1586287,1586320,1586364,1586372,1586655,1586836,1587130,1587224,1587399,1587408,1587472,1587485,1587488,1587538,1587580,1587807,1588033,1588042,1588046,1588066,1588201,1589025,1589101,1589137,1589141,1589263,1589440,1589442,1589484,1589488,1589661,1589664,1589682,1589708,1589741,1589748,1589789,1589794,1589850,1589864,1590628,1590660,1590684,1590697,1590701,1590980,1590988,1591101,1591226,1591229,1591293,1591314,1591317,1591362,1591374,1591381,1591438,1591467,1591552,1591704,1591713,1591715,1591723,1591874,1592487,1592512,1592658,1592665,1592677,1592742,1592744,1592787,1592809,1592955,1593036,1593048,1593061,1593133,1593210-1593211,1593231
 ,1593245,1593250,1593294,1593304,1593317,1593342,1593554,1594158-1594164,1594166-1594167,1594169,1594237,1594800,1594808,1594835,1594888,1595147,1595457,1595856,1596241,1596474,1596534,1596844,1597569,1597795,1597854,1597860,1598292,1598302,1598352,1598369,1598595,1598631,1598696,1598732,1598797-1598798,1599299,1599332,1599416,1599434,1599671,1600088,1600935,1601309,1601388,1601578,1601649,1601676,1601757,1601768,1601814,1601833,1601838,1601853,1601878,1601888,1601922,1602156,1602170,1602174,1602179,1602183,1602201,1602207,1602227,1602256,1602261,1602342,1602796-1602797,1602800,1602809,1602853,1602872,1602914,1603155,1603307,1603401,1603441,1603748,1604166,1605030,1605036,1605038,1605292,1605447,1605526,1605670,1605725,1605831,1605852,1606077,1606079,1606087,1606638,1606641,1606644,1606708,1606711,1607031-1607032,1607077,1607127,1607141,1607152,1607185,1607196,1607331,1607362,1607366,1607392,1607526,1607557,1607664,1607737,1608560,1608731,1608783,1609064,1609081,1609165,1609214,1609
 488,1610489,1610592,1610603,1610634,1610658,1610664,1611021,1611041,1611270,1611275,1611277,1611313,1611332,1611584,1612560,1612825,1612993,1613018,1613041,1614265,1614272,1614344-1614345,1614384-1614385,1614397,1614405-1614406,1614574,1614591,1614593,1614596,1614604,1614689,1614807,1614835,1614891,1615417-1615418,1616182,1616236,1616463,1616719,1617417,1617451,1617463,1617711,1618158,1618613,1618624,1618709,1619222,1619411,1619695,1619800,1619808,1619815,1619823-1619824,1620512,1620581,1620585,1620634,1620898,1620905,1621115,1621123-1621124,1621168,1621192,1621201,1621706,1621962,1622197,1622201,1622207,1622250,1622479,1623364,1623766,1623827,1623949,1623969,1623973,1624216,1624317,1624551,1624559,1624973,1624993-1624994,1625025,1625036,1625158,1625224,1625237,1625299,1625348,1625620,1625916,1625962-1625963,1626021,1626053,1626163,1626168,1626175,1626191,1626265,1626770,1627047,1627052,1627228,1627346,1627470,1627473,1627479,1627503,1627586,1627590,1627715,1627731,1628180,1628198,1
 628262,1628447,1628608,1629688,1629840,1629917,1630055-1630057,1630156,1630299,1630338,1630773,1631283-1631284,1631333-1631334,1631617-1631619,1631630,1631699,1631704,1631711,1631967-1631969,1631986,1631990,1631999,1632002-1632003,1632017,1632258,1632264,1632270,1632293,1632303,1632592,1632605,1633315,1633559-1633560,1633562,1633567,1633571,1633598,1633608,1633641,1633687,1633697,1633768,1633783,1634505,1634513,1634774,1634779,1634781,1634792,1634803,1634814,1634816,1634838,1634841,1634852,1634864,1634896,1634898,1635044-1635045,1635060,1635077,1635089,1635102,1635108,1635218,1635387,1635435,1635518,1635563,1635586,1636336,1636348,1636505,1636585,1636799,1637368,1637382,1637413,1637651,1637815,1638779-1638783,1639260,1639577,1639622,1639963,1639966,1639973,1640134,1640143,1640555-1640556,1640694-1640695,1640715,1640722-1640723,1640728,1640863-1640872,1641340,1641350,1641352,1641541,1641596-1641599,1641601,1641662,1641671,1641695,1641771,1641802,1641811,1641950,1642031,1642056,164211
 9,1642285,1642648,1642667,1642954,1642959,1643111,1643178,1643186,1643204,1643287,1643767,1643774,1643982,1644016,1644106,1644366,1644383,1644397-1644398,1644407,1644479,1644547,1644552,1644554,1644588,1644645,1644650,1644654,1644689,1644750,1645421,1645424,1645459,1645585,1645611,1645637,1645646,1645660-1645663,1645888,1645901,1645948,1645966,1645970-1645971,1646014,1646164,1646174,1646684,1649743,1649803,1650015,1650239,1650529,1650797,1651323,1651382,1651643,1651652,1651730,1651988-1651989,1651996,1652024,1652035,1652058-1652059,1652075,1652127,1652158,1652467,1652965,1652971,1653207,1653446,1653463,1653484,1653572,1653579,1653591,1653804,1653809,1653848-1653850,1653882,1654116,1654743,1654756,1654778,1655049,1655054-1655055,1655086,1655237,1655248,1655996,1656027,1656394,1656400,1656425,1656427,1656453,1656628,1657804,1658470,1659483,1659527,1659550,1659578,1659765,1660154-1660155,1660383,1660409,1660426,1660676,1660870,1660872,1660897,1660903,1661069,1661122,1661146,1661158,166
 1226,1661630,1661643,1661645,1662313-1662315,1662323,1662450,1663241,1663275,1663288,1663448,1663565,1663666,1663705,1663730,1664038,1664184,1664228-1664229,1664231,1665176
+/jackrabbit/oak/trunk:1584578,1584602,1584614,1584616,1584709,1584781,1584937,1585297,1585304-1585305,1585420,1585424,1585427,1585448,1585465,1585468,1585486,1585497,1585509,1585647,1585655-1585656,1585661,1585665-1585666,1585669-1585670,1585673,1585680,1585719,1585763,1585770,1585896,1585904,1585907,1585940,1585949,1585951,1585956,1585962-1585963,1586287,1586320,1586364,1586372,1586655,1586836,1587130,1587224,1587399,1587408,1587472,1587485,1587488,1587538,1587580,1587807,1588033,1588042,1588046,1588066,1588201,1589025,1589101,1589137,1589141,1589263,1589440,1589442,1589484,1589488,1589661,1589664,1589682,1589708,1589741,1589748,1589789,1589794,1589850,1589864,1590628,1590660,1590684,1590697,1590701,1590980,1590988,1591101,1591226,1591229,1591293,1591314,1591317,1591362,1591374,1591381,1591438,1591467,1591552,1591704,1591713,1591715,1591723,1591874,1592487,1592512,1592658,1592665,1592677,1592742,1592744,1592787,1592809,1592955,1593036,1593048,1593061,1593133,1593210-1593211,1593231
 ,1593245,1593250,1593294,1593304,1593317,1593342,1593554,1594158-1594164,1594166-1594167,1594169,1594237,1594800,1594808,1594835,1594888,1595147,1595457,1595856,1596241,1596474,1596534,1596844,1597569,1597795,1597854,1597860,1598292,1598302,1598352,1598369,1598595,1598631,1598696,1598732,1598797-1598798,1599299,1599332,1599416,1599434,1599671,1600088,1600935,1601309,1601388,1601578,1601649,1601676,1601757,1601768,1601814,1601833,1601838,1601853,1601878,1601888,1601922,1602156,1602170,1602174,1602179,1602183,1602201,1602207,1602227,1602256,1602261,1602342,1602796-1602797,1602800,1602809,1602853,1602872,1602914,1603155,1603307,1603401,1603441,1603748,1604166,1605030,1605036,1605038,1605292,1605447,1605526,1605670,1605725,1605831,1605852,1606077,1606079,1606087,1606638,1606641,1606644,1606708,1606711,1607031-1607032,1607077,1607127,1607141,1607152,1607185,1607196,1607331,1607362,1607366,1607392,1607526,1607557,1607664,1607737,1608560,1608731,1608783,1609064,1609081,1609165,1609214,1609
 488,1610489,1610592,1610603,1610634,1610658,1610664,1611021,1611041,1611270,1611275,1611277,1611313,1611332,1611584,1612560,1612825,1612993,1613018,1613041,1614265,1614272,1614344-1614345,1614384-1614385,1614397,1614405-1614406,1614574,1614591,1614593,1614596,1614604,1614689,1614807,1614835,1614891,1615417-1615418,1616182,1616236,1616463,1616719,1617417,1617451,1617463,1617711,1618158,1618613,1618624,1618709,1619222,1619411,1619695,1619800,1619808,1619815,1619823-1619824,1620512,1620581,1620585,1620634,1620898,1620905,1621115,1621123-1621124,1621168,1621192,1621201,1621706,1621962,1622197,1622201,1622207,1622250,1622479,1623364,1623766,1623827,1623949,1623969,1623973,1624216,1624317,1624551,1624559,1624973,1624993-1624994,1625025,1625036,1625158,1625224,1625237,1625299,1625348,1625620,1625916,1625962-1625963,1626021,1626053,1626163,1626168,1626175,1626191,1626265,1626770,1627047,1627052,1627228,1627346,1627470,1627473,1627479,1627503,1627586,1627590,1627715,1627731,1628180,1628198,1
 628262,1628447,1628608,1629688,1629840,1629917,1630055-1630057,1630156,1630299,1630338,1630773,1631283-1631284,1631333-1631334,1631617-1631619,1631630,1631699,1631704,1631711,1631967-1631969,1631986,1631990,1631999,1632002-1632003,1632017,1632258,1632264,1632270,1632293,1632303,1632592,1632605,1633315,1633559-1633560,1633562,1633567,1633571,1633598,1633608,1633641,1633687,1633697,1633768,1633783,1634505,1634513,1634774,1634779,1634781,1634792,1634803,1634814,1634816,1634838,1634841,1634852,1634864,1634896,1634898,1635044-1635045,1635060,1635077,1635089,1635102,1635108,1635218,1635387,1635435,1635518,1635563,1635586,1636336,1636348,1636505,1636585,1636799,1637368,1637382,1637413,1637651,1637815,1638779-1638783,1639260,1639577,1639622,1639963,1639966,1639973,1640134,1640143,1640555-1640556,1640694-1640695,1640715,1640722-1640723,1640728,1640863-1640872,1641340,1641350,1641352,1641541,1641596-1641599,1641601,1641662,1641671,1641695,1641771,1641802,1641811,1641950,1642031,1642056,164211
 9,1642285,1642648,1642667,1642954,1642959,1643111,1643178,1643186,1643204,1643287,1643767,1643774,1643982,1644016,1644106,1644366,1644383,1644397-1644398,1644407,1644479,1644547,1644552,1644554,1644588,1644645,1644650,1644654,1644689,1644750,1645421,1645424,1645459,1645585,1645611,1645637,1645646,1645660-1645663,1645888,1645901,1645948,1645966,1645970-1645971,1646014,1646164,1646174,1646469,1646684,1646766,1646795,1646981,1649743,1649803,1650015,1650239,1650529,1650797,1651323,1651382,1651643,1651652,1651730,1651988-1651989,1651996,1652024,1652035,1652058-1652059,1652075,1652127,1652158,1652467,1652965,1652971,1653207,1653446,1653463,1653484,1653572,1653579,1653591,1653804,1653809,1653848-1653850,1653882,1654116,1654743,1654756,1654778,1655049,1655054-1655055,1655086,1655237,1655248,1655996,1656027,1656394,1656400,1656425,1656427,1656453,1656628,1657804,1658470,1659483,1659527,1659550,1659578,1659765,1660154-1660155,1660383,1660409,1660426,1660676,1660870,1660872,1660897,1660903,166
 1069,1661122,1661146,1661158,1661226,1661630,1661643,1661645,1662313-1662315,1662323,1662450,1663241,1663275,1663288,1663448,1663565,1663666,1663705,1663730,1664038,1664184,1664228-1664229,1664231
 /jackrabbit/trunk:1345480

Modified: jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java?rev=1665181&r1=1665180&r2=1665181&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java (original)
+++ jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java Mon Mar  9 10:56:29 2015
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.solr.index;
 
+import javax.annotation.Nonnull;
+
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
@@ -29,8 +31,6 @@ import org.apache.solr.client.solrj.Solr
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.annotation.Nonnull;
-
 /**
  * Solr based {@link IndexEditorProvider}
  *

Modified: jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrQueryIndexProviderService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrQueryIndexProviderService.java?rev=1665181&r1=1665180&r2=1665181&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrQueryIndexProviderService.java (original)
+++ jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrQueryIndexProviderService.java Mon Mar  9 10:56:29 2015
@@ -19,15 +19,27 @@ package org.apache.jackrabbit.oak.plugin
 import java.util.ArrayList;
 import java.util.List;
 import javax.annotation.Nonnull;
+
+import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Property;
 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.ReferencePolicyOption;
 import org.apache.felix.scr.annotations.Service;
+import org.apache.jackrabbit.oak.commons.PropertiesUtil;
+import org.apache.jackrabbit.oak.plugins.index.aggregate.AggregateIndexProvider;
+import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
 import org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfigurationProvider;
 import org.apache.jackrabbit.oak.plugins.index.solr.query.SolrQueryIndexProvider;
 import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
 import org.apache.jackrabbit.oak.spi.query.QueryIndex;
 import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Osgi Service that provides Solr based {@link org.apache.jackrabbit.oak.spi.query.QueryIndex}es
@@ -35,22 +47,47 @@ import org.apache.jackrabbit.oak.spi.sta
  * @see org.apache.jackrabbit.oak.plugins.index.solr.query.SolrQueryIndexProvider
  * @see QueryIndexProvider
  */
-@Component(metatype = false, immediate = true)
+@Component(metatype = true, immediate = true, label = "Oak Solr Query index provider configuration")
 @Service(value = QueryIndexProvider.class)
 public class SolrQueryIndexProviderService implements QueryIndexProvider {
 
+    private static final boolean QUERY_TIME_AGGREGATION_DEFAULT = false;
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
     @Reference
     private SolrServerProvider solrServerProvider;
 
     @Reference
     private OakSolrConfigurationProvider oakSolrConfigurationProvider;
 
+    @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY,
+            policyOption = ReferencePolicyOption.GREEDY,
+            policy = ReferencePolicy.DYNAMIC
+    )
+    private NodeAggregator nodeAggregator;
+
+    @Property(boolValue = QUERY_TIME_AGGREGATION_DEFAULT, label = "query time aggregation",
+            description = "enable query time aggregation for Solr index")
+    private static final String QUERY_TIME_AGGREGATION = "query.aggregation";
+
+    private boolean queryTimeAggregation;
+
+    @Activate
+    protected void activate(ComponentContext componentContext) {
+        Object value = componentContext.getProperties().get(QUERY_TIME_AGGREGATION);
+        queryTimeAggregation = PropertiesUtil.toBoolean(value, QUERY_TIME_AGGREGATION_DEFAULT);
+    }
+
     @Override
     @Nonnull
     public List<? extends QueryIndex> getQueryIndexes(NodeState nodeState) {
         if (solrServerProvider != null && oakSolrConfigurationProvider != null) {
-            return new SolrQueryIndexProvider(solrServerProvider,
-                    oakSolrConfigurationProvider).getQueryIndexes(nodeState);
+            SolrQueryIndexProvider solrQueryIndexProvider = new SolrQueryIndexProvider(solrServerProvider,
+                    oakSolrConfigurationProvider, nodeAggregator);
+            log.debug("creating Solr query index provider {} query time aggregation", queryTimeAggregation ? "with" : "without");
+            return queryTimeAggregation ? AggregateIndexProvider.wrap(solrQueryIndexProvider).getQueryIndexes(nodeState) :
+                    solrQueryIndexProvider.getQueryIndexes(nodeState);
         } else {
             return new ArrayList<QueryIndex>();
         }

Copied: jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/AdvancedSolrQueryIndex.java (from r1646766, jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/AdvancedSolrQueryIndex.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/AdvancedSolrQueryIndex.java?p2=jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/AdvancedSolrQueryIndex.java&p1=jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/AdvancedSolrQueryIndex.java&r1=1646766&r2=1665181&rev=1665181&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/AdvancedSolrQueryIndex.java (original)
+++ jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/AdvancedSolrQueryIndex.java Mon Mar  9 10:56:29 2015
@@ -30,6 +30,7 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServer;
 import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
+import org.apache.solr.common.SolrDocumentList;
 
 /**
  * {@link org.apache.jackrabbit.oak.spi.query.QueryIndex.AdvanceFulltextQueryIndex} implementation of a Solr
@@ -70,20 +71,20 @@ public class AdvancedSolrQueryIndex exte
         String key = filter.toString();
         long cachedEstimate = cache.get(key) != null ? cache.get(key) : -1;
         long estimatedEntryCount;
-        if (cachedEstimate > 0) {
+        if (cachedEstimate >= 0) {
             estimatedEntryCount = cachedEstimate;
         } else {
-            Long updatedEstimation = updateEstimation();
+            Long updatedEstimation = initializeEstimation(filter);
             cache.put(key, updatedEstimation);
             estimatedEntryCount = updatedEstimation;
         }
         return estimatedEntryCount;
     }
 
-    private Long updateEstimation() {
+    private Long initializeEstimation(Filter filter) {
         SolrQuery solrQuery = new SolrQuery("*:*");
         try {
-            return solrServer.query(solrQuery).getResults().getNumFound();
+            return solrServer.query(solrQuery).getResults().getNumFound() / 3; // 33% of the docs is a reasonable worst case
         } catch (Exception e) {
             return Long.MAX_VALUE;
         }
@@ -100,6 +101,12 @@ public class AdvancedSolrQueryIndex exte
     }
 
     @Override
+    void onRetrievedResults(Filter filter, SolrDocumentList docs) {
+        // update estimates cache
+        cache.put(filter.toString(), docs.getNumFound());
+    }
+
+    @Override
     public String getPlanDescription(IndexPlan plan, NodeState root) {
         return plan.toString();
     }

Copied: jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/FilterQueryParser.java (from r1646766, jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/FilterQueryParser.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/FilterQueryParser.java?p2=jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/FilterQueryParser.java&p1=jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/FilterQueryParser.java&r1=1646766&r2=1665181&rev=1665181&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/FilterQueryParser.java (original)
+++ jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/FilterQueryParser.java Mon Mar  9 10:56:29 2015
@@ -20,7 +20,6 @@ import java.util.Collection;
 
 import org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfiguration;
 import org.apache.jackrabbit.oak.query.fulltext.FullTextAnd;
-import org.apache.jackrabbit.oak.query.fulltext.FullTextContains;
 import org.apache.jackrabbit.oak.query.fulltext.FullTextExpression;
 import org.apache.jackrabbit.oak.query.fulltext.FullTextOr;
 import org.apache.jackrabbit.oak.query.fulltext.FullTextTerm;
@@ -34,7 +33,7 @@ import static org.apache.jackrabbit.oak.
 
 /**
  * the {@link org.apache.jackrabbit.oak.plugins.index.solr.query.FilterQueryParser} can parse {@link org.apache.jackrabbit.oak.spi.query.Filter}s
- * and transform them into Solr query {@code String}s.
+ * and transform them into {@link org.apache.solr.client.solrj.SolrQuery}s and / or Solr query {@code String}s.
  */
 class FilterQueryParser {
 
@@ -234,11 +233,6 @@ class FilterQueryParser {
             }
 
             @Override
-            public boolean visit(FullTextContains contains) {
-                return contains.getBase().accept(this);
-            }
-
-            @Override
             public boolean visit(FullTextAnd and) {
                 fullTextString.append('(');
                 for (int i = 0; i < and.list.size(); i++) {

Modified: jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java?rev=1665181&r1=1665180&r2=1665181&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java (original)
+++ jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java Mon Mar  9 10:56:29 2015
@@ -29,13 +29,12 @@ import com.google.common.collect.Abstrac
 import com.google.common.collect.Queues;
 import com.google.common.collect.Sets;
 import org.apache.jackrabbit.oak.api.PropertyValue;
+import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
 import org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfiguration;
 import org.apache.jackrabbit.oak.query.QueryEngineSettings;
 import org.apache.jackrabbit.oak.query.QueryImpl;
-import org.apache.jackrabbit.oak.query.fulltext.FullTextAnd;
 import org.apache.jackrabbit.oak.query.fulltext.FullTextExpression;
-import org.apache.jackrabbit.oak.query.fulltext.FullTextOr;
 import org.apache.jackrabbit.oak.query.fulltext.FullTextTerm;
 import org.apache.jackrabbit.oak.query.fulltext.FullTextVisitor;
 import org.apache.jackrabbit.oak.spi.query.Cursor;
@@ -64,11 +63,12 @@ import static org.apache.jackrabbit.oak.
  */
 public class SolrQueryIndex implements FulltextQueryIndex {
 
-    private static final String NATIVE_SOLR_QUERY = "native*solr";
-    private static final String NATIVE_LUCENE_QUERY = "native*lucene";
-
     public static final String TYPE = "solr";
 
+    static final String NATIVE_SOLR_QUERY = "native*solr";
+
+    static final String NATIVE_LUCENE_QUERY = "native*lucene";
+
     private final Logger log = LoggerFactory.getLogger(SolrQueryIndex.class);
 
     private final String name;
@@ -77,12 +77,15 @@ public class SolrQueryIndex implements F
 
     private final NodeAggregator aggregator;
 
-    public SolrQueryIndex(String name, SolrServer solrServer, OakSolrConfiguration configuration) {
+    public SolrQueryIndex(String name, SolrServer solrServer, OakSolrConfiguration configuration, NodeAggregator aggregator) {
         this.name = name;
         this.solrServer = solrServer;
         this.configuration = configuration;
-        // TODO this index should support aggregation in the same way as the Lucene index
-        this.aggregator = null;
+        this.aggregator = aggregator;
+    }
+
+    public SolrQueryIndex(String name, SolrServer solrServer, OakSolrConfiguration configuration) {
+        this(name, solrServer, configuration, null);
     }
 
     @Override
@@ -93,10 +96,14 @@ public class SolrQueryIndex implements F
     @Override
     public double getCost(Filter filter, NodeState root) {
         // cost is inverse proportional to the number of matching restrictions, infinite if no restriction matches
-        return 10d / getMatchingFilterRestrictions(filter);
+        double cost = 10d / getMatchingFilterRestrictions(filter);
+        if (log.isDebugEnabled()) {
+            log.debug("Solr: cost for {} is {}", name, cost);
+        }
+        return cost;
     }
 
-    private int getMatchingFilterRestrictions(Filter filter) {
+    int getMatchingFilterRestrictions(Filter filter) {
         int match = 0;
 
         // full text expressions OR full text conditions defined
@@ -139,240 +146,10 @@ public class SolrQueryIndex implements F
 
     @Override
     public String getPlan(Filter filter, NodeState nodeState) {
-        return getQuery(filter).toString();
+        return FilterQueryParser.getQuery(filter, configuration).toString();
     }
 
-    private SolrQuery getQuery(Filter filter) {
-
-        SolrQuery solrQuery = new SolrQuery();
-        setDefaults(solrQuery);
-
-        StringBuilder queryBuilder = new StringBuilder();
-
-        FullTextExpression ft = filter.getFullTextConstraint();
-        if (ft != null) {
-            queryBuilder.append(getFullTextQuery(ft));
-            queryBuilder.append(' ');
-        } else if (filter.getFulltextConditions() != null) {
-            Collection<String> fulltextConditions = filter.getFulltextConditions();
-            for (String fulltextCondition : fulltextConditions) {
-                queryBuilder.append(fulltextCondition).append(" ");
-            }
-        }
-
-        Collection<Filter.PropertyRestriction> propertyRestrictions = filter.getPropertyRestrictions();
-        if (propertyRestrictions != null && !propertyRestrictions.isEmpty()) {
-            for (Filter.PropertyRestriction pr : propertyRestrictions) {
-                if (pr.isNullRestriction()) {
-                    // can not use full "x is null"
-                    continue;
-                }
-                // native query support
-                if (NATIVE_SOLR_QUERY.equals(pr.propertyName) || NATIVE_LUCENE_QUERY.equals(pr.propertyName)) {
-                    String nativeQueryString = String.valueOf(pr.first.getValue(pr.first.getType()));
-                    if (isSupportedHttpRequest(nativeQueryString)) {
-                        // pass through the native HTTP Solr request
-                        String requestHandlerString = nativeQueryString.substring(0, nativeQueryString.indexOf('?'));
-                        if (!"select".equals(requestHandlerString)) {
-                            if (requestHandlerString.charAt(0) != '/') {
-                                requestHandlerString = "/" + requestHandlerString;
-                            }
-                            solrQuery.setRequestHandler(requestHandlerString);
-                        }
-                        String parameterString = nativeQueryString.substring(nativeQueryString.indexOf('?') + 1);
-                        for (String param : parameterString.split("&")) {
-                            String[] kv = param.split("=");
-                            if (kv.length != 2) {
-                                throw new RuntimeException("Unparsable native HTTP Solr query");
-                            } else {
-                                if ("stream.body".equals(kv[0])) {
-                                    kv[0] = "q";
-                                    String mltFlString = "mlt.fl=";
-                                    int mltFlIndex = parameterString.indexOf(mltFlString);
-                                    if (mltFlIndex > -1) {
-                                        int beginIndex = mltFlIndex + mltFlString.length();
-                                        int endIndex = parameterString.indexOf('&', beginIndex);
-                                        String fields;
-                                        if (endIndex > beginIndex) {
-                                            fields = parameterString.substring(beginIndex, endIndex);
-                                        } else {
-                                            fields = parameterString.substring(beginIndex);
-                                        }
-                                        kv[1] = "_query_:\"{!dismax qf=" + fields + " q.op=OR}" + kv[1] + "\"";
-                                    }
-                                }
-                                solrQuery.setParam(kv[0], kv[1]);
-                            }
-                        }
-                        return solrQuery; // every other restriction is not considered
-                    } else {
-                        queryBuilder.append(nativeQueryString);
-                    }
-                } else {
-                    if (!configuration.useForPropertyRestrictions() // Solr index not used for properties
-                            || pr.propertyName.contains("/") // no child-level property restrictions
-                            || "rep:excerpt".equals(pr.propertyName) // rep:excerpt is handled by the query engine
-                            || configuration.getIgnoredProperties().contains(pr.propertyName) // property is explicitly ignored
-                            ) {
-                        continue;
-                    }
-
-                    String first = null;
-                    if (pr.first != null) {
-                        first = partialEscape(String.valueOf(pr.first.getValue(pr.first.getType()))).toString();
-                    }
-                    String last = null;
-                    if (pr.last != null) {
-                        last = partialEscape(String.valueOf(pr.last.getValue(pr.last.getType()))).toString();
-                    }
-
-                    String prField = configuration.getFieldForPropertyRestriction(pr);
-                    CharSequence fieldName = partialEscape(prField != null ?
-                            prField : pr.propertyName);
-                    if ("jcr\\:path".equals(fieldName.toString())) {
-                        queryBuilder.append(configuration.getPathField());
-                        queryBuilder.append(':');
-                        queryBuilder.append(first);
-                    } else {
-                        if (pr.first != null && pr.last != null && pr.first.equals(pr.last)) {
-                            queryBuilder.append(fieldName).append(':');
-                            queryBuilder.append(first);
-                        } else if (pr.first == null && pr.last == null) {
-                            if (!queryBuilder.toString().contains(fieldName + ":")) {
-                                queryBuilder.append(fieldName).append(':');
-                                queryBuilder.append('*');
-                            }
-                        } else if ((pr.first != null && pr.last == null) || (pr.last != null && pr.first == null) || (!pr.first.equals(pr.last))) {
-                            // TODO : need to check if this works for all field types (most likely not!)
-                            queryBuilder.append(fieldName).append(':');
-                            queryBuilder.append(createRangeQuery(first, last, pr.firstIncluding, pr.lastIncluding));
-                        } else if (pr.isLike) {
-                            // TODO : the current parameter substitution is not expected to work well
-                            queryBuilder.append(fieldName).append(':');
-                            queryBuilder.append(partialEscape(String.valueOf(pr.first.getValue(pr.first.getType())).replace('%', '*').replace('_', '?')));
-                        } else {
-                            throw new RuntimeException("[unexpected!] not handled case");
-                        }
-                    }
-                }
-                queryBuilder.append(" ");
-            }
-        }
-
-        if (configuration.useForPrimaryTypes()) {
-            String[] pts = filter.getPrimaryTypes().toArray(new String[filter.getPrimaryTypes().size()]);
-            for (int i = 0; i < pts.length; i++) {
-                String pt = pts[i];
-                if (i == 0) {
-                    queryBuilder.append("(");
-                }
-                if (i > 0 && i < pts.length) {
-                    queryBuilder.append("OR ");
-                }
-                queryBuilder.append("jcr\\:primaryType").append(':').append(partialEscape(pt)).append(" ");
-                if (i == pts.length - 1) {
-                    queryBuilder.append(")");
-                    queryBuilder.append(' ');
-                }
-            }
-        }
-
-        if (configuration.useForPathRestrictions()) {
-            Filter.PathRestriction pathRestriction = filter.getPathRestriction();
-            if (pathRestriction != null) {
-                String path = purgePath(filter);
-                String fieldName = configuration.getFieldForPathRestriction(pathRestriction);
-                if (fieldName != null) {
-                    queryBuilder.append(fieldName);
-                    queryBuilder.append(':');
-                    queryBuilder.append(path);
-                }
-            }
-        }
-
-        if (queryBuilder.length() == 0) {
-            queryBuilder.append("*:*");
-        }
-        String escapedQuery = queryBuilder.toString();
-        solrQuery.setQuery(escapedQuery);
-
-        if (log.isDebugEnabled()) {
-            log.debug("JCR query {} has been converted to Solr query {}",
-                    filter.getQueryStatement(), solrQuery.toString());
-        }
-
-        return solrQuery;
-    }
 
-    private String getFullTextQuery(FullTextExpression ft) {
-        final StringBuilder fullTextString = new StringBuilder();
-        ft.accept(new FullTextVisitor() {
-
-            @Override
-            public boolean visit(FullTextOr or) {
-                fullTextString.append('(');
-                for (int i = 0; i < or.list.size(); i++) {
-                    if (i > 0 && i < or.list.size()) {
-                        fullTextString.append(" OR ");
-                    }
-                    FullTextExpression e = or.list.get(i);
-                    String orTerm = getFullTextQuery(e);
-                    fullTextString.append(orTerm);
-                }
-                fullTextString.append(')');
-                fullTextString.append(' ');
-                return true;
-            }
-
-            @Override
-            public boolean visit(FullTextAnd and) {
-                fullTextString.append('(');
-                for (int i = 0; i < and.list.size(); i++) {
-                    if (i > 0 && i < and.list.size()) {
-                        fullTextString.append(" AND ");
-                    }
-                    FullTextExpression e = and.list.get(i);
-                    String andTerm = getFullTextQuery(e);
-                    fullTextString.append(andTerm);
-                }
-                fullTextString.append(')');
-                fullTextString.append(' ');
-                return true;
-            }
-
-            @Override
-            public boolean visit(FullTextTerm term) {
-                if (term.isNot()) {
-                    fullTextString.append('-');
-                }
-                String p = term.getPropertyName();
-                if (p != null && p.indexOf('/') >= 0) {
-                    p = getName(p);
-                }
-                if (p == null || "*".equals(p)) {
-                    p = configuration.getCatchAllField();
-                }
-                fullTextString.append(partialEscape(p));
-                fullTextString.append(':');
-                String termText = term.getText();
-                if (termText.indexOf(' ') > 0) {
-                    fullTextString.append('"');
-                }
-                fullTextString.append(termText.replace("/", "\\/").replace(":", "\\:"));
-                if (termText.indexOf(' ') > 0) {
-                    fullTextString.append('"');
-                }
-                String boost = term.getBoost();
-                if (boost != null) {
-                    fullTextString.append('^');
-                    fullTextString.append(boost);
-                }
-                fullTextString.append(' ');
-                return true;
-            }
-        });
-        return fullTextString.toString();
-    }
 
     /**
      * Get the set of relative paths of a full-text condition. For example, for
@@ -407,63 +184,21 @@ public class SolrQueryIndex implements F
         return relPaths;
     }
 
-    private boolean isSupportedHttpRequest(String nativeQueryString) {
-        // the query string starts with ${supported-handler.selector}?
-        return nativeQueryString.matches("(mlt|query|select|get)\\\\?.*");
-    }
-
-    private void setDefaults(SolrQuery solrQuery) {
-        solrQuery.setParam("q.op", "AND");
-        solrQuery.setParam("fl", configuration.getPathField() + " score");
-        String catchAllField = configuration.getCatchAllField();
-        if (catchAllField != null && catchAllField.length() > 0) {
-            solrQuery.setParam("df", catchAllField);
-        }
-
-        solrQuery.setParam("rows", String.valueOf(configuration.getRows()));
-    }
-
-    private static String createRangeQuery(String first, String last, boolean firstIncluding, boolean lastIncluding) {
-        // TODO : handle inclusion / exclusion of bounds
-        return "[" + (first != null ? first : "*") + " TO " + (last != null ? last : "*") + "]";
-    }
-
-    private static String purgePath(Filter filter) {
-        return partialEscape(filter.getPath()).toString();
-    }
-
-
-    // partially borrowed from SolrPluginUtils#partialEscape
-    private static CharSequence partialEscape(CharSequence s) {
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < s.length(); i++) {
-            char c = s.charAt(i);
-            if (c == '\\' || c == '!' || c == '(' || c == ')' ||
-                    c == ':' || c == '^' || c == '[' || c == ']' || c == '/' ||
-                    c == '{' || c == '}' || c == '~' || c == '*' || c == '?' ||
-                    c == '-' || c == ' ') {
-                sb.append('\\');
-            }
-            sb.append(c);
-        }
-        return sb;
-    }
-
     @Override
-    public Cursor query(final Filter filter, NodeState root) {
+    public Cursor query(final Filter filter, final NodeState root) {
         Cursor cursor;
         try {
-            final Set<String> relPaths = filter.getFullTextConstraint() != null ? getRelativePaths(filter.getFullTextConstraint()) : Collections.<String>emptySet();
+            final Set<String> relPaths = filter.getFullTextConstraint() != null ? getRelativePaths(filter.getFullTextConstraint())
+                    : Collections.<String>emptySet();
             final String parent = relPaths.size() == 0 ? "" : relPaths.iterator().next();
 
             final int parentDepth = getDepth(parent);
 
-
             cursor = new SolrRowCursor(new AbstractIterator<SolrResultRow>() {
                 private final Set<String> seenPaths = Sets.newHashSet();
                 private final Deque<SolrResultRow> queue = Queues.newArrayDeque();
                 private SolrDocument lastDoc;
-                public int offset = 0;
+                private int offset = 0;
                 public long numFound = 0;
 
                 @Override
@@ -509,7 +244,7 @@ public class SolrQueryIndex implements F
                         if (log.isDebugEnabled()) {
                             log.debug("converting filter {}", filter);
                         }
-                        SolrQuery query = getQuery(filter);
+                        SolrQuery query = FilterQueryParser.getQuery(filter, configuration);
                         if (numFound > 0) {
                             offset++;
                             int newOffset = offset * configuration.getRows();
@@ -523,6 +258,8 @@ public class SolrQueryIndex implements F
                         }
                         SolrDocumentList docs = solrServer.query(query).getResults();
 
+                        onRetrievedResults(filter, docs);
+
                         if (log.isDebugEnabled()) {
                             log.debug("getting docs {}", docs);
                         }
@@ -554,14 +291,32 @@ public class SolrQueryIndex implements F
         return cursor;
     }
 
+    void onRetrievedResults(Filter filter, SolrDocumentList docs) {
+        // do nothing
+    }
+
+    private boolean exists(SolrResultRow row, NodeState root) {
+        boolean result = true;
+        NodeState nodeState = root;
+        for (String n : PathUtils.elements(row.path)) {
+            if (nodeState.hasChildNode(n)) {
+                nodeState = nodeState.getChildNode(n);
+            }
+            else {
+                result = false;
+                break;
+            }
+        }
+        return result;
+    }
+
     static class SolrResultRow {
         final String path;
         final double score;
-        SolrDocument doc;
+        final SolrDocument doc;
 
         SolrResultRow(String path, double score) {
-            this.path = path;
-            this.score = score;
+            this(path, score, null);
         }
 
 

Modified: jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexProvider.java?rev=1665181&r1=1665180&r2=1665181&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexProvider.java (original)
+++ jackrabbit/oak/branches/1.0/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexProvider.java Mon Mar  9 10:56:29 2015
@@ -21,6 +21,7 @@ import java.util.List;
 import javax.annotation.Nonnull;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
 import org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfigurationProvider;
 import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
 import org.apache.jackrabbit.oak.spi.query.QueryIndex;
@@ -45,9 +46,17 @@ public class SolrQueryIndexProvider impl
 
     private final OakSolrConfigurationProvider oakSolrConfigurationProvider;
 
-    public SolrQueryIndexProvider(SolrServerProvider solrServerProvider, OakSolrConfigurationProvider oakSolrConfigurationProvider) {
+    private final NodeAggregator aggregator;
+
+    public SolrQueryIndexProvider(SolrServerProvider solrServerProvider, OakSolrConfigurationProvider oakSolrConfigurationProvider,
+                                  NodeAggregator nodeAggregator) {
         this.oakSolrConfigurationProvider = oakSolrConfigurationProvider;
         this.solrServerProvider = solrServerProvider;
+        this.aggregator = nodeAggregator;
+    }
+
+    public SolrQueryIndexProvider(SolrServerProvider solrServerProvider, OakSolrConfigurationProvider oakSolrConfigurationProvider) {
+        this(solrServerProvider, oakSolrConfigurationProvider, null);
     }
 
     @Nonnull
@@ -64,17 +73,15 @@ public class SolrQueryIndexProvider impl
             PropertyState type = definition.getProperty(TYPE_PROPERTY_NAME);
             if (type != null
                     && SolrQueryIndex.TYPE.equals(type.getValue(Type.STRING))) {
-                if (log.isDebugEnabled()) {
-                    log.debug("found a Solr index definition {}", entry.getName());
-                }
                 try {
                     SolrServer solrServer = solrServerProvider.getSolrServer();
                     // the query engine should be returned only if the server is alive, otherwise other indexes should be used
                     if (solrServer != null && 0 == solrServer.ping().getStatus()) {
-                        tempIndexes.add(new SolrQueryIndex(
+                        tempIndexes.add(new AdvancedSolrQueryIndex(
                                 entry.getName(),
                                 solrServer,
-                                oakSolrConfigurationProvider.getConfiguration()));
+                                oakSolrConfigurationProvider.getConfiguration(),
+                                aggregator));
                     }
                     else {
                         if (log.isWarnEnabled()) {

Modified: jackrabbit/oak/branches/1.0/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/jcr/SolrOakRepositoryStub.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/jcr/SolrOakRepositoryStub.java?rev=1665181&r1=1665180&r2=1665181&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/jcr/SolrOakRepositoryStub.java (original)
+++ jackrabbit/oak/branches/1.0/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/jcr/SolrOakRepositoryStub.java Mon Mar  9 10:56:29 2015
@@ -72,9 +72,7 @@ public class SolrOakRepositoryStub exten
         };
         OakSolrConfigurationProvider oakSolrConfigurationProvider = new DefaultSolrConfigurationProvider(configuration);
         jcr.with(new SolrIndexInitializer(false))
-                //FIXME OAK-2168 - Enable it again once we do support AggregateIndex and AdvanceQueryIndex
-//                .with(AggregateIndexProvider.wrap(new SolrQueryIndexProvider(solrServerProvider, oakSolrConfigurationProvider)))
-                .with(new SolrQueryIndexProvider(solrServerProvider, oakSolrConfigurationProvider))
+                .with(AggregateIndexProvider.wrap(new SolrQueryIndexProvider(solrServerProvider, oakSolrConfigurationProvider)))
                 .with(new SolrIndexEditorProvider(solrServerProvider, oakSolrConfigurationProvider));
     }
 }

Modified: jackrabbit/oak/branches/1.0/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexTest.java?rev=1665181&r1=1665180&r2=1665181&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexTest.java (original)
+++ jackrabbit/oak/branches/1.0/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexTest.java Mon Mar  9 10:56:29 2015
@@ -256,4 +256,29 @@ public class SolrQueryIndexTest {
         assertNotNull(plan);
         assertTrue(plan.contains("q=name%3Ahello")); // query gets converted to a fielded query on name field
     }
+
+    @Test
+    public void testUnion() throws Exception {
+        NodeState root = mock(NodeState.class);
+        when(root.getNames(any(String.class))).thenReturn(Collections.<String>emptySet());
+        SelectorImpl selector = new SelectorImpl(root, "a");
+        String sqlQuery = "select [jcr:path], [jcr:score], [rep:excerpt] from [nt:hierarchyNode] as a where" +
+                " isdescendantnode(a, '/content') and contains([jcr:content/*], 'founded') union select [jcr:path]," +
+                " [jcr:score], [rep:excerpt] from [nt:hierarchyNode] as a where isdescendantnode(a, '/content') and " +
+                "contains([jcr:content/jcr:title], 'founded') union select [jcr:path], [jcr:score], [rep:excerpt]" +
+                " from [nt:hierarchyNode] as a where isdescendantnode(a, '/content') and " +
+                "contains([jcr:content/jcr:description], 'founded') order by [jcr:score] desc";
+        SolrServer solrServer = TestUtils.createSolrServer();
+        OakSolrConfiguration configuration = new DefaultSolrConfiguration() {
+            @Override
+            public boolean useForPropertyRestrictions() {
+                return true;
+            }
+        };
+        SolrQueryIndex solrQueryIndex = new SolrQueryIndex("solr", solrServer, configuration);
+        FilterImpl filter = new FilterImpl(selector, sqlQuery, new QueryEngineSettings());
+        Cursor cursor = solrQueryIndex.query(filter, root);
+        assertNotNull(cursor);
+
+    }
 }