diff --git a/config/alfresco/subsystems/Search/solr/cmis-api-context.xml b/config/alfresco/subsystems/Search/solr/cmis-api-context.xml
index e21c7c909d..8750318b7b 100644
--- a/config/alfresco/subsystems/Search/solr/cmis-api-context.xml
+++ b/config/alfresco/subsystems/Search/solr/cmis-api-context.xml
@@ -4,7 +4,21 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/config/alfresco/subsystems/Search/solr/opencmis-context.xml b/config/alfresco/subsystems/Search/solr/opencmis-context.xml
index c07b32a0d5..d354764c60 100644
--- a/config/alfresco/subsystems/Search/solr/opencmis-context.xml
+++ b/config/alfresco/subsystems/Search/solr/opencmis-context.xml
@@ -4,36 +4,11 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- cmis-strict
-
-
-
-
-
-
-
-
-
-
+
@@ -42,6 +17,23 @@
cmis-alfresco
+
+
+
+
+
+
+
+
+
+
+
+
+ cmis-strict
+
+
+
+
\ No newline at end of file
diff --git a/config/alfresco/subsystems/Search/solr/solr-search-context.xml b/config/alfresco/subsystems/Search/solr/solr-search-context.xml
index 0fcbc6cbe4..258b83f4d3 100644
--- a/config/alfresco/subsystems/Search/solr/solr-search-context.xml
+++ b/config/alfresco/subsystems/Search/solr/solr-search-context.xml
@@ -130,35 +130,6 @@
-
-
-
-
-
-
-
-
- cmis-alfrecso
-
-
-
-
-
-
-
-
-
-
-
-
-
- cmis-strict
-
-
-
-
-
-
diff --git a/source/java/org/alfresco/cmis/CMISQueryOptions.java b/source/java/org/alfresco/cmis/CMISQueryOptions.java
index 6b9d1b037a..8773fe1368 100644
--- a/source/java/org/alfresco/cmis/CMISQueryOptions.java
+++ b/source/java/org/alfresco/cmis/CMISQueryOptions.java
@@ -22,7 +22,11 @@ import java.util.Locale;
import org.springframework.extensions.surf.util.I18NUtil;
import org.alfresco.repo.search.impl.querymodel.QueryOptions;
+import org.alfresco.repo.search.impl.querymodel.QueryOptions.Connective;
import org.alfresco.service.cmr.repository.StoreRef;
+import org.alfresco.service.cmr.search.LimitBy;
+import org.alfresco.service.cmr.search.SearchParameters;
+import org.alfresco.service.cmr.search.SearchService;
/**
* The options for a CMIS query
@@ -39,6 +43,35 @@ public class CMISQueryOptions extends QueryOptions
private CMISQueryMode queryMode = CMISQueryMode.CMS_STRICT;
+
+ public static CMISQueryOptions create(SearchParameters searchParameters)
+ {
+ String sql = searchParameters.getQuery();
+
+ CMISQueryOptions options = new CMISQueryOptions(sql, searchParameters.getStores().get(0));
+ options.setIncludeInTransactionData(!searchParameters.excludeDataInTheCurrentTransaction());
+ options.setDefaultFTSConnective(searchParameters.getDefaultOperator() == SearchParameters.Operator.OR ? Connective.OR : Connective.AND);
+ options.setDefaultFTSFieldConnective(searchParameters.getDefaultOperator() == SearchParameters.Operator.OR ? Connective.OR : Connective.AND);
+ options.setSkipCount(searchParameters.getSkipCount());
+ options.setMaxPermissionChecks(searchParameters.getMaxPermissionChecks());
+ options.setMaxPermissionCheckTimeMillis(searchParameters.getMaxPermissionCheckTimeMillis());
+ if (searchParameters.getLimitBy() == LimitBy.FINAL_SIZE)
+ {
+ options.setMaxItems(searchParameters.getLimit());
+ }
+ else
+ {
+ options.setMaxItems(searchParameters.getMaxItems());
+ }
+ options.setMlAnalaysisMode(searchParameters.getMlAnalaysisMode());
+ options.setLocales(searchParameters.getLocales());
+ options.setStores(searchParameters.getStores());
+ //options.setQuery(); Done on conbstruction
+ //options.setQueryMode(); Should set afterwards
+ options.setQueryParameterDefinitions(searchParameters.getQueryParameterDefinitions());
+ options.setDefaultFieldName(searchParameters.getDefaultFieldName());
+ return options;
+ }
/**
* Create a CMISQueryOptions instance with the default options other than the query and store ref.
* The query will be run using the locale returned by I18NUtil.getLocale()
@@ -84,6 +117,33 @@ public class CMISQueryOptions extends QueryOptions
{
this.queryMode = queryMode;
}
+ /**
+ * @return
+ */
+ public SearchParameters getAsSearchParmeters()
+ {
+ SearchParameters searchParameters = new SearchParameters();
+ searchParameters.setDefaultFieldName(this.getDefaultFieldName());
+ searchParameters.setDefaultFTSFieldConnective(this.getDefaultFTSFieldConnective() == Connective.OR ? SearchParameters.Operator.OR : SearchParameters.Operator.AND);
+ searchParameters.setDefaultFTSOperator(this.getDefaultFTSConnective() == Connective.OR ? SearchParameters.Operator.OR : SearchParameters.Operator.AND);
+ searchParameters.setDefaultOperator(this.getDefaultFTSConnective() == Connective.OR ? SearchParameters.Operator.OR : SearchParameters.Operator.AND);
+ searchParameters.setLanguage(SearchService.LANGUAGE_CMIS_ALFRESCO);
+ if(this.getMaxItems() > 0)
+ {
+ searchParameters.setLimit(this.getMaxItems());
+ searchParameters.setLimitBy(LimitBy.FINAL_SIZE);
+ searchParameters.setMaxItems(this.getMaxItems());
+ }
+ searchParameters.setMaxPermissionChecks(this.getMaxPermissionChecks());
+ searchParameters.setMaxPermissionCheckTimeMillis(this.getMaxPermissionCheckTimeMillis());
+ searchParameters.setMlAnalaysisMode(this.getMlAnalaysisMode());
+ //searchParameters.setNamespace() TODO: Fix
+ //searchParameters.setPermissionEvaluation()
+ searchParameters.setQuery(this.getQuery());
+ searchParameters.setSkipCount(this.getSkipCount());
+
+ return searchParameters;
+ }
}
diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneAlfrescoFtsQueryLanguage.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneAlfrescoFtsQueryLanguage.java
index 45d7073911..b8c2888db0 100644
--- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneAlfrescoFtsQueryLanguage.java
+++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneAlfrescoFtsQueryLanguage.java
@@ -79,25 +79,7 @@ public class LuceneAlfrescoFtsQueryLanguage extends AbstractLuceneQueryLanguage
AlfrescoFunctionEvaluationContext context = new AlfrescoFunctionEvaluationContext(admLuceneSearcher.getNamespacePrefixResolver(), admLuceneSearcher.getDictionaryService(),
searchParameters.getNamespace());
- QueryOptions options = new QueryOptions(searchParameters.getQuery(), null);
- options.setIncludeInTransactionData(!searchParameters.excludeDataInTheCurrentTransaction());
- options.setDefaultFTSConnective(searchParameters.getDefaultOperator() == SearchParameters.Operator.OR ? Connective.OR : Connective.AND);
- options.setDefaultFTSFieldConnective(searchParameters.getDefaultOperator() == SearchParameters.Operator.OR ? Connective.OR : Connective.AND);
- options.setSkipCount(searchParameters.getSkipCount());
- options.setMaxPermissionChecks(searchParameters.getMaxPermissionChecks());
- options.setMaxPermissionCheckTimeMillis(searchParameters.getMaxPermissionCheckTimeMillis());
- options.setDefaultFieldName(searchParameters.getDefaultFieldName());
- if (searchParameters.getLimitBy() == LimitBy.FINAL_SIZE)
- {
- options.setMaxItems(searchParameters.getLimit());
- }
- else
- {
- options.setMaxItems(searchParameters.getMaxItems());
- }
- options.setMlAnalaysisMode(searchParameters.getMlAnalaysisMode());
- options.setLocales(searchParameters.getLocales());
- options.setStores(searchParameters.getStores());
+ QueryOptions options = QueryOptions.create(searchParameters);
FTSParser.Mode mode;
@@ -109,7 +91,7 @@ public class LuceneAlfrescoFtsQueryLanguage extends AbstractLuceneQueryLanguage
{
mode = FTSParser.Mode.DEFAULT_DISJUNCTION;
}
-
+
Constraint constraint = FTSQueryParser.buildFTS(ftsExpression, factory, context, null, null, mode, options.getDefaultFTSFieldConnective(),
searchParameters.getQueryTemplates(), options.getDefaultFieldName());
org.alfresco.repo.search.impl.querymodel.Query query = factory.createQuery(null, null, constraint, buildOrderings(factory, searchParameters));
diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneAlfrescoSqlQueryLanguage.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneAlfrescoSqlQueryLanguage.java
index 2dc3ccd278..691886f033 100644
--- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneAlfrescoSqlQueryLanguage.java
+++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneAlfrescoSqlQueryLanguage.java
@@ -58,30 +58,8 @@ public class LuceneAlfrescoSqlQueryLanguage extends AbstractLuceneQueryLanguage
public ResultSet executeQuery(SearchParameters searchParameters, ADMLuceneSearcherImpl admLuceneSearcher)
{
- String sql = searchParameters.getQuery();
-
- CMISQueryOptions options = new CMISQueryOptions(sql, searchParameters.getStores().get(0));
- options.setIncludeInTransactionData(!searchParameters.excludeDataInTheCurrentTransaction());
- options.setDefaultFTSConnective(searchParameters.getDefaultOperator() == SearchParameters.Operator.OR ? Connective.OR : Connective.AND);
- options.setDefaultFTSFieldConnective(searchParameters.getDefaultOperator() == SearchParameters.Operator.OR ? Connective.OR : Connective.AND);
- options.setSkipCount(searchParameters.getSkipCount());
- options.setMaxPermissionChecks(searchParameters.getMaxPermissionChecks());
- options.setMaxPermissionCheckTimeMillis(searchParameters.getMaxPermissionCheckTimeMillis());
- options.setDefaultFieldName(searchParameters.getDefaultFieldName());
- if (searchParameters.getLimitBy() == LimitBy.FINAL_SIZE)
- {
- options.setMaxItems(searchParameters.getLimit());
- }
- else
- {
- options.setMaxItems(searchParameters.getMaxItems());
- }
- options.setMlAnalaysisMode(searchParameters.getMlAnalaysisMode());
- options.setLocales(searchParameters.getLocales());
- options.setStores(searchParameters.getStores());
-
+ CMISQueryOptions options = CMISQueryOptions.create(searchParameters);
options.setQueryMode(CMISQueryMode.CMS_WITH_ALFRESCO_EXTENSIONS);
-
return new ResultSetSPIWrapper(cmisQueryService.query(options));
}
diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneCmisStrictSqlQueryLanguage.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneCmisStrictSqlQueryLanguage.java
index ce5edac5cc..7568b616e7 100644
--- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneCmisStrictSqlQueryLanguage.java
+++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneCmisStrictSqlQueryLanguage.java
@@ -58,29 +58,8 @@ public class LuceneCmisStrictSqlQueryLanguage extends AbstractLuceneQueryLanguag
public ResultSet executeQuery(SearchParameters searchParameters, ADMLuceneSearcherImpl admLuceneSearcher)
{
- String sql = searchParameters.getQuery();
-
- CMISQueryOptions options = new CMISQueryOptions(sql, searchParameters.getStores().get(0));
- options.setIncludeInTransactionData(!searchParameters.excludeDataInTheCurrentTransaction());
- options.setDefaultFTSConnective(searchParameters.getDefaultOperator() == SearchParameters.Operator.OR ? Connective.OR : Connective.AND);
- options.setDefaultFTSFieldConnective(searchParameters.getDefaultOperator() == SearchParameters.Operator.OR ? Connective.OR : Connective.AND);
- options.setSkipCount(searchParameters.getSkipCount());
- options.setMaxPermissionChecks(searchParameters.getMaxPermissionChecks());
- options.setMaxPermissionCheckTimeMillis(searchParameters.getMaxPermissionCheckTimeMillis());
- if (searchParameters.getLimitBy() == LimitBy.FINAL_SIZE)
- {
- options.setMaxItems(searchParameters.getLimit());
- }
- else
- {
- options.setMaxItems(searchParameters.getMaxItems());
- }
- options.setMlAnalaysisMode(searchParameters.getMlAnalaysisMode());
- options.setLocales(searchParameters.getLocales());
- options.setStores(searchParameters.getStores());
-
+ CMISQueryOptions options = CMISQueryOptions.create(searchParameters);
options.setQueryMode(CMISQueryMode.CMS_STRICT);
-
return new ResultSetSPIWrapper(cmisQueryService.query(options));
}
diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneOpenCMISAlfrescoSqlQueryLanguage.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneOpenCMISAlfrescoSqlQueryLanguage.java
index 709b1e50e0..cc69884472 100644
--- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneOpenCMISAlfrescoSqlQueryLanguage.java
+++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneOpenCMISAlfrescoSqlQueryLanguage.java
@@ -59,31 +59,8 @@ public class LuceneOpenCMISAlfrescoSqlQueryLanguage extends AbstractLuceneQueryL
public ResultSet executeQuery(SearchParameters searchParameters, ADMLuceneSearcherImpl admLuceneSearcher)
{
- String sql = searchParameters.getQuery();
-
- CMISQueryOptions options = new CMISQueryOptions(sql, searchParameters.getStores().get(0));
- options.setIncludeInTransactionData(!searchParameters.excludeDataInTheCurrentTransaction());
- options.setDefaultFTSConnective(searchParameters.getDefaultOperator() == SearchParameters.Operator.OR ? Connective.OR
- : Connective.AND);
- options.setDefaultFTSFieldConnective(searchParameters.getDefaultOperator() == SearchParameters.Operator.OR ? Connective.OR
- : Connective.AND);
- options.setSkipCount(searchParameters.getSkipCount());
- options.setMaxPermissionChecks(searchParameters.getMaxPermissionChecks());
- options.setMaxPermissionCheckTimeMillis(searchParameters.getMaxPermissionCheckTimeMillis());
- options.setDefaultFieldName(searchParameters.getDefaultFieldName());
- if (searchParameters.getLimitBy() == LimitBy.FINAL_SIZE)
- {
- options.setMaxItems(searchParameters.getLimit());
- } else
- {
- options.setMaxItems(searchParameters.getMaxItems());
- }
- options.setMlAnalaysisMode(searchParameters.getMlAnalaysisMode());
- options.setLocales(searchParameters.getLocales());
- options.setStores(searchParameters.getStores());
-
+ CMISQueryOptions options = CMISQueryOptions.create(searchParameters);
options.setQueryMode(CMISQueryMode.CMS_WITH_ALFRESCO_EXTENSIONS);
-
return new ResultSetSPIWrapper(cmisQueryService.query(options));
}
}
diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneOpenCMISStrictSqlQueryLanguage.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneOpenCMISStrictSqlQueryLanguage.java
index 7fc4a535bd..385f360572 100644
--- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneOpenCMISStrictSqlQueryLanguage.java
+++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneOpenCMISStrictSqlQueryLanguage.java
@@ -59,30 +59,8 @@ public class LuceneOpenCMISStrictSqlQueryLanguage extends AbstractLuceneQueryLan
public ResultSet executeQuery(SearchParameters searchParameters, ADMLuceneSearcherImpl admLuceneSearcher)
{
- String sql = searchParameters.getQuery();
-
- CMISQueryOptions options = new CMISQueryOptions(sql, searchParameters.getStores().get(0));
- options.setIncludeInTransactionData(!searchParameters.excludeDataInTheCurrentTransaction());
- options.setDefaultFTSConnective(searchParameters.getDefaultOperator() == SearchParameters.Operator.OR ? Connective.OR
- : Connective.AND);
- options.setDefaultFTSFieldConnective(searchParameters.getDefaultOperator() == SearchParameters.Operator.OR ? Connective.OR
- : Connective.AND);
- options.setSkipCount(searchParameters.getSkipCount());
- options.setMaxPermissionChecks(searchParameters.getMaxPermissionChecks());
- options.setMaxPermissionCheckTimeMillis(searchParameters.getMaxPermissionCheckTimeMillis());
- if (searchParameters.getLimitBy() == LimitBy.FINAL_SIZE)
- {
- options.setMaxItems(searchParameters.getLimit());
- } else
- {
- options.setMaxItems(searchParameters.getMaxItems());
- }
- options.setMlAnalaysisMode(searchParameters.getMlAnalaysisMode());
- options.setLocales(searchParameters.getLocales());
- options.setStores(searchParameters.getStores());
-
+ CMISQueryOptions options = CMISQueryOptions.create(searchParameters);
options.setQueryMode(CMISQueryMode.CMS_STRICT);
-
return new ResultSetSPIWrapper(cmisQueryService.query(options));
}
}
diff --git a/source/java/org/alfresco/repo/search/impl/solr/SolrCMISQueryServiceImpl.java b/source/java/org/alfresco/repo/search/impl/solr/SolrCMISQueryServiceImpl.java
index b7a2f645c3..4350392ee1 100644
--- a/source/java/org/alfresco/repo/search/impl/solr/SolrCMISQueryServiceImpl.java
+++ b/source/java/org/alfresco/repo/search/impl/solr/SolrCMISQueryServiceImpl.java
@@ -18,12 +18,30 @@
*/
package org.alfresco.repo.search.impl.solr;
-import org.alfresco.opencmis.search.CMISQueryOptions;
-import org.alfresco.opencmis.search.CMISQueryService;
-import org.alfresco.opencmis.search.CMISResultSet;
-import org.alfresco.service.cmr.repository.StoreRef;
-import org.apache.chemistry.opencmis.commons.enums.CapabilityJoin;
-import org.apache.chemistry.opencmis.commons.enums.CapabilityQuery;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.alfresco.cmis.CMISDictionaryService;
+import org.alfresco.cmis.CMISJoinEnum;
+import org.alfresco.cmis.CMISQueryEnum;
+import org.alfresco.cmis.CMISQueryOptions;
+import org.alfresco.cmis.CMISQueryService;
+import org.alfresco.cmis.CMISResultSet;
+import org.alfresco.cmis.CMISScope;
+import org.alfresco.cmis.CMISServices;
+import org.alfresco.cmis.CMISQueryOptions.CMISQueryMode;
+import org.alfresco.cmis.search.CMISQueryParser;
+import org.alfresco.cmis.search.CMISResultSetImpl;
+import org.alfresco.cmis.search.CmisFunctionEvaluationContext;
+import org.alfresco.repo.search.impl.querymodel.Query;
+import org.alfresco.repo.search.impl.querymodel.QueryEngineResults;
+import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryModelFactory;
+import org.alfresco.service.cmr.dictionary.DictionaryService;
+import org.alfresco.service.cmr.repository.NodeService;
+import org.alfresco.service.cmr.search.LimitBy;
+import org.alfresco.service.cmr.search.ResultSet;
+import org.alfresco.service.cmr.search.SearchParameters;
/**
* @author Andy
@@ -31,45 +49,126 @@ import org.apache.chemistry.opencmis.commons.enums.CapabilityQuery;
*/
public class SolrCMISQueryServiceImpl implements CMISQueryService
{
+ private CMISServices cmisService;
+
+ private SolrQueryLanguage solrQueryLanguage;
+
+ private CMISDictionaryService cmisDictionaryService;
+
+ private NodeService nodeService;
+
+ private DictionaryService alfrescoDictionaryService;
+
+ public void setCmisService(CMISServices cmisService)
+ {
+ this.cmisService = cmisService;
+ }
+
+ public void setSolrQueryLanguage(SolrQueryLanguage solrQueryLanguage)
+ {
+ this.solrQueryLanguage = solrQueryLanguage;
+ }
+
+ public void setCmisDictionaryService(CMISDictionaryService cmisDictionaryService)
+ {
+ this.cmisDictionaryService = cmisDictionaryService;
+ }
+
+ public void setNodeService(NodeService nodeService)
+ {
+ this.nodeService = nodeService;
+ }
+
+ public void setAlfrescoDictionaryService(DictionaryService alfrescoDictionaryService)
+ {
+ this.alfrescoDictionaryService = alfrescoDictionaryService;
+ }
/* (non-Javadoc)
- * @see org.alfresco.opencmis.search.CMISQueryService#query(org.alfresco.opencmis.search.CMISQueryOptions)
+ * @see org.alfresco.cmis.CMISQueryService#query(org.alfresco.cmis.CMISQueryOptions)
*/
@Override
public CMISResultSet query(CMISQueryOptions options)
{
- // TODO Auto-generated method stub
- return null;
+ ResultSet rs = solrQueryLanguage.executeQuery(options.getAsSearchParmeters(), null);
+
+ CMISJoinEnum joinSupport = getJoinSupport();
+ if(options.getQueryMode() == CMISQueryOptions.CMISQueryMode.CMS_WITH_ALFRESCO_EXTENSIONS)
+ {
+ joinSupport = CMISJoinEnum.INNER_JOIN_SUPPORT;
+ }
+
+ // TODO: Refactor to avoid duplication of valid scopes here and in CMISQueryParser
+
+ CMISScope[] validScopes = (options.getQueryMode() == CMISQueryMode.CMS_STRICT) ? CmisFunctionEvaluationContext.STRICT_SCOPES : CmisFunctionEvaluationContext.ALFRESCO_SCOPES;
+ CmisFunctionEvaluationContext functionContext = new CmisFunctionEvaluationContext();
+ functionContext.setCmisDictionaryService(cmisDictionaryService);
+ functionContext.setNodeService(nodeService);
+ functionContext.setValidScopes(validScopes);
+
+ CMISQueryParser parser = new CMISQueryParser(options, cmisDictionaryService, joinSupport);
+ Query query = parser.parse(new LuceneQueryModelFactory(), functionContext);
+
+ Map wrapped = new HashMap();
+ for (Set group : query.getSource().getSelectorGroups(functionContext))
+ {
+ for (String selector : group)
+ {
+ wrapped.put(selector, rs);
+ }
+ }
+ LimitBy limitBy = null;
+ limitBy = rs.getResultSetMetaData().getLimitedBy();
+
+ CMISResultSet cmis = new CMISResultSetImpl(wrapped, options, limitBy, nodeService, query, cmisDictionaryService, alfrescoDictionaryService);
+ return cmis;
}
/* (non-Javadoc)
- * @see org.alfresco.opencmis.search.CMISQueryService#query(java.lang.String, org.alfresco.service.cmr.repository.StoreRef)
+ * @see org.alfresco.cmis.CMISQueryService#query(java.lang.String)
*/
@Override
- public CMISResultSet query(String query, StoreRef storeRef)
+ public CMISResultSet query(String query)
{
- CMISQueryOptions options = new CMISQueryOptions(query, storeRef);
+ CMISQueryOptions options = new CMISQueryOptions(query, cmisService.getDefaultRootStoreRef());
return query(options);
}
- public boolean getPwcSearchable()
+ /* (non-Javadoc)
+ * @see org.alfresco.cmis.CMISQueryService#getQuerySupport()
+ */
+ @Override
+ public CMISQueryEnum getQuerySupport()
{
- return true;
+ return CMISQueryEnum.BOTH_COMBINED;
}
+ /* (non-Javadoc)
+ * @see org.alfresco.cmis.CMISQueryService#getJoinSupport()
+ */
+ @Override
+ public CMISJoinEnum getJoinSupport()
+ {
+ return CMISJoinEnum.NO_JOIN_SUPPORT;
+ }
+
+ /* (non-Javadoc)
+ * @see org.alfresco.cmis.CMISQueryService#getPwcSearchable()
+ */
+ @Override
+ public boolean getPwcSearchable()
+ {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.alfresco.cmis.CMISQueryService#getAllVersionsSearchable()
+ */
+ @Override
public boolean getAllVersionsSearchable()
{
return false;
}
- public CapabilityQuery getQuerySupport()
- {
- return CapabilityQuery.BOTHCOMBINED;
- }
-
- public CapabilityJoin getJoinSupport()
- {
- return CapabilityJoin.NONE;
- }
-
+
}
diff --git a/source/java/org/alfresco/repo/search/impl/solr/SolrOpenCMISQueryServiceImpl.java b/source/java/org/alfresco/repo/search/impl/solr/SolrOpenCMISQueryServiceImpl.java
new file mode 100644
index 0000000000..d134abe476
--- /dev/null
+++ b/source/java/org/alfresco/repo/search/impl/solr/SolrOpenCMISQueryServiceImpl.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2005-2010 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+package org.alfresco.repo.search.impl.solr;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+
+import org.alfresco.cmis.CMISScope;
+import org.alfresco.opencmis.dictionary.CMISDictionaryService;
+import org.alfresco.opencmis.search.CMISQueryOptions;
+import org.alfresco.opencmis.search.CMISQueryOptions.CMISQueryMode;
+import org.alfresco.opencmis.search.CMISQueryParser;
+import org.alfresco.opencmis.search.CMISQueryService;
+import org.alfresco.opencmis.search.CMISResultSet;
+import org.alfresco.opencmis.search.CmisFunctionEvaluationContext;
+import org.alfresco.repo.search.impl.querymodel.Query;
+import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryModelFactory;
+import org.alfresco.service.cmr.dictionary.DictionaryService;
+import org.alfresco.service.cmr.repository.NodeService;
+import org.alfresco.service.cmr.repository.StoreRef;
+import org.alfresco.service.cmr.search.LimitBy;
+import org.alfresco.service.cmr.search.ResultSet;
+import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
+import org.apache.chemistry.opencmis.commons.enums.CapabilityJoin;
+import org.apache.chemistry.opencmis.commons.enums.CapabilityQuery;
+
+/**
+ * @author Andy
+ *
+ */
+public class SolrOpenCMISQueryServiceImpl implements CMISQueryService
+{
+
+ private SolrQueryLanguage solrQueryLanguage;
+
+ private NodeService nodeService;
+
+ private DictionaryService alfrescoDictionaryService;
+
+ private CMISDictionaryService cmisDictionaryService;
+
+
+ public void setSolrQueryLanguage(SolrQueryLanguage solrQueryLanguage)
+ {
+ this.solrQueryLanguage = solrQueryLanguage;
+ }
+
+ public void setNodeService(NodeService nodeService)
+ {
+ this.nodeService = nodeService;
+ }
+
+ public void setAlfrescoDictionaryService(DictionaryService alfrescoDictionaryService)
+ {
+ this.alfrescoDictionaryService = alfrescoDictionaryService;
+ }
+
+ public void setCmisDictionaryService(CMISDictionaryService cmisDictionaryService)
+ {
+ this.cmisDictionaryService = cmisDictionaryService;
+ }
+
+ /* (non-Javadoc)
+ * @see org.alfresco.opencmis.search.CMISQueryService#query(org.alfresco.opencmis.search.CMISQueryOptions)
+ */
+ @Override
+ public CMISResultSet query(CMISQueryOptions options)
+ {
+ ResultSet rs = solrQueryLanguage.executeQuery(options.getAsSearchParmeters(), null);
+
+ CapabilityJoin joinSupport = getJoinSupport();
+ if(options.getQueryMode() == CMISQueryOptions.CMISQueryMode.CMS_WITH_ALFRESCO_EXTENSIONS)
+ {
+ joinSupport = CapabilityJoin.INNERONLY;
+ }
+
+ // TODO: Refactor to avoid duplication of valid scopes here and in CMISQueryParser
+
+ BaseTypeId[] validScopes = (options.getQueryMode() == CMISQueryMode.CMS_STRICT) ? CmisFunctionEvaluationContext.STRICT_SCOPES : CmisFunctionEvaluationContext.ALFRESCO_SCOPES;
+ CmisFunctionEvaluationContext functionContext = new CmisFunctionEvaluationContext();
+ functionContext.setCmisDictionaryService(cmisDictionaryService);
+ functionContext.setNodeService(nodeService);
+ functionContext.setValidScopes(validScopes);
+
+ CMISQueryParser parser = new CMISQueryParser(options, cmisDictionaryService, joinSupport);
+ Query query = parser.parse(new LuceneQueryModelFactory(), functionContext);
+
+ Map wrapped = new HashMap();
+ for (Set group : query.getSource().getSelectorGroups(functionContext))
+ {
+ for (String selector : group)
+ {
+ wrapped.put(selector, rs);
+ }
+ }
+ LimitBy limitBy = null;
+ limitBy = rs.getResultSetMetaData().getLimitedBy();
+
+ CMISResultSet cmis = new CMISResultSet(wrapped, options, limitBy, nodeService, query, cmisDictionaryService, alfrescoDictionaryService);
+ return cmis;
+ }
+
+ /* (non-Javadoc)
+ * @see org.alfresco.opencmis.search.CMISQueryService#query(java.lang.String, org.alfresco.service.cmr.repository.StoreRef)
+ */
+ @Override
+ public CMISResultSet query(String query, StoreRef storeRef)
+ {
+ CMISQueryOptions options = new CMISQueryOptions(query, storeRef);
+ return query(options);
+ }
+
+ public boolean getPwcSearchable()
+ {
+ return true;
+ }
+
+ public boolean getAllVersionsSearchable()
+ {
+ return false;
+ }
+
+ public CapabilityQuery getQuerySupport()
+ {
+ return CapabilityQuery.BOTHCOMBINED;
+ }
+
+ public CapabilityJoin getJoinSupport()
+ {
+ return CapabilityJoin.NONE;
+ }
+
+}