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);
+
+ }
}