cancel
Showing results for 
Search instead for 
Did you mean: 

CONTAINS keyword usage in CMIS queries

charlie_k
Champ in-the-making
Champ in-the-making
Hello,

I have CONTAINS keyword usage question. I am using Alfresco 5.0.d and trying to query my custom type objects via CMIS like this:
SELECT * FROM custom:type WHERE CONTAINS('test')


I tested this query via OpenCMIS Workbench. I expected to get all custom:type entries where at least one of my custom attributes has the text 'test'. But I guess I misunderstood how CONTAINS keyword works with CMIS - I get no results.

I found this earlier post which describes similar problem:
http://forums.alfresco.com/forum/developer-discussions/alfresco-api/cmis-contains-not-finding-docume...
And I thought that this was fixed in version 3.4.3.. but it appears it is not the case.

I also tried this (same results as before):
SELECT * FROM custom:type WHERE CONTAINS('TEXT:test')

and this (I get an exception):
SELECT * FROM custom:type WHERE CONTAINS('ALL:test')

The latter query resulted in an error in workbench ("runtime: 08091542 Request failed 500 /solr4/alfresco/cmis…") and in alfresco logs:

ERROR [solr.core.SolrCore] [http-bio-8443-exec-3] java.lang.UnsupportedOperationException
   at org.alfresco.solr.query.Solr4QueryParser.createAllQuery(Solr4QueryParser.java:1005)
   at org.alfresco.solr.query.Solr4QueryParser.getFieldQuery(Solr4QueryParser.java:615)
   at org.alfresco.solr.query.Lucene4QueryParserAdaptor.getFieldQuery(Lucene4QueryParserAdaptor.java:67)
   at org.alfresco.solr.query.Lucene4QueryParserAdaptor.getFieldQuery(Lucene4QueryParserAdaptor.java:48)
   at org.alfresco.repo.search.impl.querymodel.impl.lucene.functions.LuceneFTSTerm.addComponent(LuceneFTSTerm.java:68)
   at org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneFunctionalConstraint.addComponent(LuceneFunctionalConstraint.java:57)
   at org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQuery.buildQuery(LuceneQuery.java:105)
   at org.alfresco.solr.AlfrescoSolrDataModel.getCMISQuery(AlfrescoSolrDataModel.java:2004)
   at org.alfresco.solr.query.CmisQParserPlugin$CmisQParser.parse(CmisQParserPlugin.java:189)
   at org.apache.solr.search.QParser.getQuery(QParser.java:141)


So the questions at hand are:
How should CONTAINS keyword work?
Is it possible to achieve my requirement (search in all attributes, without specifying all of them in the query)?

Charlie
1 REPLY 1

s_palyukh
Star Contributor
Star Contributor
Unfortunately, you will not be able to use pseudo-field "ALL", because it isn't implemented on alfresco side. Take a look at sources of method createAllQuery of class org.alfresco.solr.query.Solr4QueryParser:


protected Query createAllQuery(String queryText, AnalysisMode analysisMode, LuceneFunction luceneFunction) throws ParseException {
// Set<String> all = searchParameters.getAllAttributes();
// if ((all null) || (all.size() 0))
// {
// Collection<QName> contentAttributes = dictionaryService.getAllProperties(null);
// BooleanQuery query = new BooleanQuery();
// for (QName qname : contentAttributes)
// {
// // The super implementation will create phrase queries etc if required
// Query part = getFieldQuery(PROPERTY_FIELD_PREFIX + qname.toString(), queryText, analysisMode, luceneFunction);
// if (part != null)
// {
// query.add(part, Occur.SHOULD);
// }
// else
// {
// query.add(createNoMatchQuery(), Occur.SHOULD);
// }
// }
// return query;
// }
// else
// {
// BooleanQuery query = new BooleanQuery();
// for (String fieldName : all)
// {
// Query part = getFieldQuery(fieldName, queryText, analysisMode, luceneFunction);
// if (part != null)
// {
// query.add(part, Occur.SHOULD);
// }
// else
// {
// query.add(createNoMatchQuery(), Occur.SHOULD);
// }
// }
// return query;
// }
throw new UnsupportedOperationException();
}


So, you always receive UnsupportedOperationException, because other lines are commented.