use of org.alfresco.service.cmr.dictionary.PropertyDefinition in project SearchServices by Alfresco.
the class Solr4QueryParser method spanQueryBuilder.
private Query spanQueryBuilder(String field, String first, String last, int slop, boolean inOrder) throws ParseException {
String propertyFieldName = field.substring(1);
String expandedFieldName = null;
PropertyDefinition propertyDef = QueryParserUtils.matchPropertyDefinition(searchParameters.getNamespace(), namespacePrefixResolver, dictionaryService, propertyFieldName);
IndexTokenisationMode tokenisationMode = IndexTokenisationMode.TRUE;
if (propertyDef != null) {
tokenisationMode = propertyDef.getIndexTokenisationMode();
if (tokenisationMode == null) {
tokenisationMode = IndexTokenisationMode.TRUE;
}
} else {
expandedFieldName = expandAttributeFieldName(field);
}
if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.MLTEXT))) {
// Build a sub query for each locale and or the results together -
// the analysis will take care of
// cross language matching for each entry
BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
List<Locale> locales = searchParameters.getLocales();
List<Locale> expandedLocales = new ArrayList<Locale>();
for (Locale locale : (((locales == null) || (locales.size() == 0)) ? Collections.singletonList(I18NUtil.getLocale()) : locales)) {
expandedLocales.addAll(MLAnalysisMode.getLocales(mlAnalysisMode, locale, false));
}
for (Locale locale : (((expandedLocales == null) || (expandedLocales.size() == 0)) ? Collections.singletonList(I18NUtil.getLocale()) : expandedLocales)) {
addMLTextSpanQuery(field, propertyDef, first, last, slop, inOrder, expandedFieldName, propertyDef, tokenisationMode, booleanQuery, locale);
}
return booleanQuery.build();
} else // Content
if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) {
List<Locale> locales = searchParameters.getLocales();
List<Locale> expandedLocales = new ArrayList<Locale>();
for (Locale locale : (((locales == null) || (locales.size() == 0)) ? Collections.singletonList(I18NUtil.getLocale()) : locales)) {
expandedLocales.addAll(MLAnalysisMode.getLocales(mlAnalysisMode, locale, addContentCrossLocaleWildcards()));
}
return addContentSpanQuery(field, propertyDef, first, last, slop, inOrder, expandedFieldName, expandedLocales);
} else if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.TEXT))) {
BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
List<Locale> locales = searchParameters.getLocales();
List<Locale> expandedLocales = new ArrayList<Locale>();
for (Locale locale : (((locales == null) || (locales.size() == 0)) ? Collections.singletonList(I18NUtil.getLocale()) : locales)) {
expandedLocales.addAll(MLAnalysisMode.getLocales(mlAnalysisMode, locale, false));
}
for (Locale locale : (((expandedLocales == null) || (expandedLocales.size() == 0)) ? Collections.singletonList(I18NUtil.getLocale()) : expandedLocales)) {
addTextSpanQuery(field, propertyDef, first, last, slop, inOrder, expandedFieldName, tokenisationMode, booleanQuery, locale);
}
return booleanQuery.build();
} else {
throw new UnsupportedOperationException("Span queries are only supported for d:text, d:mltext and d:content data types");
}
}
use of org.alfresco.service.cmr.dictionary.PropertyDefinition in project SearchServices by Alfresco.
the class Solr4QueryParser method createIsNotNull.
protected Query createIsNotNull(String queryText, AnalysisMode analysisMode, LuceneFunction luceneFunction) throws ParseException {
PropertyDefinition pd = QueryParserUtils.matchPropertyDefinition(searchParameters.getNamespace(), namespacePrefixResolver, dictionaryService, queryText);
if (pd != null) {
BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(createTermQuery(FIELD_PROPERTIES, pd.getName().toString()), Occur.MUST);
query.add(createTermQuery(FIELD_NULLPROPERTIES, pd.getName().toString()), Occur.MUST_NOT);
;
return query.build();
} else {
BooleanQuery.Builder query = new BooleanQuery.Builder();
Query presenceQuery = getWildcardQuery(queryText, "*");
if (presenceQuery != null) {
query.add(presenceQuery, Occur.MUST);
}
return query.build();
}
}
use of org.alfresco.service.cmr.dictionary.PropertyDefinition in project SearchServices by Alfresco.
the class Solr4QueryParser method createExistsQuery.
protected Query createExistsQuery(String queryText, AnalysisMode analysisMode, LuceneFunction luceneFunction) throws ParseException {
PropertyDefinition pd = QueryParserUtils.matchPropertyDefinition(searchParameters.getNamespace(), namespacePrefixResolver, dictionaryService, queryText);
if (pd != null) {
return createTermQuery(FIELD_PROPERTIES, pd.getName().toString());
} else {
BooleanQuery.Builder query = new BooleanQuery.Builder();
Query presenceQuery = getWildcardQuery(queryText, "*");
if (presenceQuery != null) {
query.add(createIsNodeQuery("T"), Occur.MUST);
query.add(presenceQuery, Occur.MUST_NOT);
}
return query.build();
}
}
use of org.alfresco.service.cmr.dictionary.PropertyDefinition in project SearchServices by Alfresco.
the class Solr4QueryParser method getRangeQuery.
/**
* @param field
* @param part1
* @param part2
* @param includeLower
* @param includeUpper
* @param analysisMode
* @param luceneFunction
* @return the query
* @exception ParseException
* throw in overridden method to disallow
*/
public Query getRangeQuery(String field, String part1, String part2, boolean includeLower, boolean includeUpper, AnalysisMode analysisMode, LuceneFunction luceneFunction) throws ParseException {
if (field.equals(FIELD_PATH)) {
throw new UnsupportedOperationException("Range Queries are not support for " + FIELD_PATH);
} else if (field.equals(FIELD_PATHWITHREPEATS)) {
throw new UnsupportedOperationException("Range Queries are not support for " + FIELD_PATHWITHREPEATS);
} else if (field.equals(FIELD_TEXT)) {
Set<String> text = searchParameters.getTextAttributes();
if ((text == null) || (text.size() == 0)) {
Query query = getRangeQuery(PROPERTY_FIELD_PREFIX + ContentModel.PROP_CONTENT.toString(), part1, part2, includeLower, includeUpper, analysisMode, luceneFunction);
if (query == null) {
return createNoMatchQuery();
}
return query;
} else {
BooleanQuery.Builder query = new BooleanQuery.Builder();
for (String fieldName : text) {
Query part = getRangeQuery(fieldName, part1, part2, includeLower, includeUpper, analysisMode, luceneFunction);
if (part != null) {
query.add(part, Occur.SHOULD);
} else {
query.add(createNoMatchQuery(), Occur.SHOULD);
}
}
return query.build();
}
} else if (field.equals(FIELD_CASCADETX)) {
SchemaField sf = schema.getField(FIELD_CASCADETX);
if (sf != null) {
String start = null;
try {
analyzeMultitermTerm(FIELD_CASCADETX, part1);
start = part1;
} catch (Exception e) {
}
String end = null;
try {
analyzeMultitermTerm(FIELD_CASCADETX, part2);
end = part2;
} catch (Exception e) {
}
return sf.getType().getRangeQuery(null, sf, start, end, includeLower, includeUpper);
} else {
throw new UnsupportedOperationException();
}
}
// FIELD_TYPE uses the default
if (isPropertyField(field)) {
Pair<String, String> fieldNameAndEnding = QueryParserUtils.extractFieldNameAndEnding(field);
String expandedFieldName = null;
PropertyDefinition propertyDef = QueryParserUtils.matchPropertyDefinition(searchParameters.getNamespace(), namespacePrefixResolver, dictionaryService, fieldNameAndEnding.getFirst());
IndexTokenisationMode tokenisationMode = IndexTokenisationMode.TRUE;
if (propertyDef != null) {
tokenisationMode = propertyDef.getIndexTokenisationMode();
if (tokenisationMode == null) {
tokenisationMode = IndexTokenisationMode.TRUE;
}
} else {
expandedFieldName = expandAttributeFieldName(field);
}
if (propertyDef != null) {
// LOWER AND UPPER
if (luceneFunction != LuceneFunction.FIELD) {
if (luceneFunction == LuceneFunction.LOWER) {
if ((false == part1.toLowerCase().equals(part1)) || (false == part2.toLowerCase().equals(part2))) {
return createNoMatchQuery();
}
}
if (luceneFunction == LuceneFunction.UPPER) {
if ((false == part1.toUpperCase().equals(part1)) || (false == part2.toUpperCase().equals(part2))) {
return createNoMatchQuery();
}
}
if (propertyDef.getDataType().getName().equals(DataTypeDefinition.TEXT)) {
BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
List<Locale> locales = searchParameters.getLocales();
List<Locale> expandedLocales = new ArrayList<Locale>();
for (Locale locale : (((locales == null) || (locales.size() == 0)) ? Collections.singletonList(I18NUtil.getLocale()) : locales)) {
expandedLocales.addAll(MLAnalysisMode.getLocales(mlAnalysisMode, locale, false));
}
for (Locale locale : (((expandedLocales == null) || (expandedLocales.size() == 0)) ? Collections.singletonList(I18NUtil.getLocale()) : expandedLocales)) {
addLocaleSpecificUntokenisedTextRangeFunction(expandedFieldName, propertyDef, part1, part2, includeLower, includeUpper, luceneFunction, booleanQuery, locale, tokenisationMode);
}
return booleanQuery.build();
} else {
throw new UnsupportedOperationException("Lucene Function");
}
}
if (propertyDef.getDataType().getName().equals(DataTypeDefinition.MLTEXT)) {
return buildTextMLTextOrContentRange(field, part1, part2, includeLower, includeUpper, analysisMode, expandedFieldName, propertyDef, tokenisationMode);
} else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT)) {
String solrField = null;
switch(fieldNameAndEnding.getSecond()) {
case FIELD_SIZE_SUFFIX:
solrField = AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyDef.getName(), ContentFieldType.SIZE, FieldUse.ID).getFields().get(0).getField();
break;
case FIELD_MIMETYPE_SUFFIX:
solrField = AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyDef.getName(), ContentFieldType.MIMETYPE, FieldUse.ID).getFields().get(0).getField();
break;
case FIELD_ENCODING_SUFFIX:
solrField = AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyDef.getName(), ContentFieldType.ENCODING, FieldUse.ID).getFields().get(0).getField();
break;
case FIELD_LOCALE_SUFFIX:
solrField = AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyDef.getName(), ContentFieldType.LOCALE, FieldUse.ID).getFields().get(0).getField();
break;
}
if (solrField != null) {
String start = null;
try {
analyzeMultitermTerm(solrField, part1);
start = part1;
} catch (Exception e) {
}
String end = null;
try {
analyzeMultitermTerm(solrField, part2);
end = part2;
} catch (Exception e) {
}
SchemaField sf = schema.getField(solrField);
return sf.getType().getRangeQuery(null, sf, start, end, includeLower, includeUpper);
} else {
return buildTextMLTextOrContentRange(field, part1, part2, includeLower, includeUpper, analysisMode, expandedFieldName, propertyDef, tokenisationMode);
}
} else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.TEXT)) {
return buildTextMLTextOrContentRange(field, part1, part2, includeLower, includeUpper, analysisMode, expandedFieldName, propertyDef, tokenisationMode);
} else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.DATETIME) || propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE)) {
Pair<Date, Integer> dateAndResolution1 = parseDateString(part1);
Pair<Date, Integer> dateAndResolution2 = parseDateString(part2);
BooleanQuery.Builder bQuery = new BooleanQuery.Builder();
IndexedField indexedField = AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyDef.getName(), null, FieldUse.ID);
for (FieldInstance instance : indexedField.getFields()) {
String start = dateAndResolution1 == null ? part1 : (includeLower ? getDateStart(dateAndResolution1) : getDateEnd(dateAndResolution1));
String end = dateAndResolution2 == null ? part2 : (includeUpper ? getDateEnd(dateAndResolution2) : getDateStart(dateAndResolution2));
if (start.equals("*")) {
start = null;
}
if (end.equals("*")) {
end = null;
}
SchemaField sf = schema.getField(instance.getField());
Query query = sf.getType().getRangeQuery(null, sf, start, end, includeLower, includeUpper);
if (query != null) {
bQuery.add(query, Occur.SHOULD);
}
}
return bQuery.build();
} else {
String solrField = AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyDef.getName(), null, FieldUse.ID).getFields().get(0).getField();
String start = null;
try {
analyzeMultitermTerm(solrField, part1);
start = part1;
} catch (Exception e) {
}
String end = null;
try {
analyzeMultitermTerm(solrField, part2);
end = part2;
} catch (Exception e) {
}
SchemaField sf = schema.getField(solrField);
return sf.getType().getRangeQuery(null, sf, start, end, includeLower, includeUpper);
}
} else {
throw new UnsupportedOperationException();
}
} else if (field.equals(FIELD_ALL)) {
Set<String> all = searchParameters.getAllAttributes();
if ((all == null) || (all.size() == 0)) {
Collection<QName> contentAttributes = dictionaryService.getAllProperties(null);
BooleanQuery.Builder query = new BooleanQuery.Builder();
for (QName qname : contentAttributes) {
Query part = getRangeQuery(PROPERTY_FIELD_PREFIX + qname.toString(), part1, part2, includeLower, includeUpper, analysisMode, luceneFunction);
query.add(part, Occur.SHOULD);
}
return query.build();
} else {
BooleanQuery.Builder query = new BooleanQuery.Builder();
for (String fieldName : all) {
Query part = getRangeQuery(fieldName, part1, part2, includeLower, includeUpper, analysisMode, luceneFunction);
query.add(part, Occur.SHOULD);
}
return query.build();
}
} else // FIELD_EXISTS uses the default
if (QueryParserUtils.matchDataTypeDefinition(searchParameters.getNamespace(), namespacePrefixResolver, dictionaryService, field) != null) {
Collection<QName> contentAttributes = dictionaryService.getAllProperties(QueryParserUtils.matchDataTypeDefinition(searchParameters.getNamespace(), namespacePrefixResolver, dictionaryService, field).getName());
BooleanQuery.Builder query = new BooleanQuery.Builder();
for (QName qname : contentAttributes) {
Query part = getRangeQuery(PROPERTY_FIELD_PREFIX + qname.toString(), part1, part2, includeLower, includeUpper, analysisMode, luceneFunction);
query.add(part, Occur.SHOULD);
}
return query.build();
}
// FIELD_FTSSTATUS uses the default
if (field.equals(FIELD_TAG)) {
throw new UnsupportedOperationException("Range Queries are not support for " + FIELD_TAG);
} else {
// None property - leave alone
throw new UnsupportedOperationException();
}
}
use of org.alfresco.service.cmr.dictionary.PropertyDefinition in project SearchServices by Alfresco.
the class MetadataTracker method getShardProperty.
public static QName getShardProperty(String field) {
AlfrescoSolrDataModel dataModel = AlfrescoSolrDataModel.getInstance();
NamespaceDAO namespaceDAO = dataModel.getNamespaceDAO();
DictionaryService dictionaryService = dataModel.getDictionaryService(CMISStrictDictionaryService.DEFAULT);
PropertyDefinition propertyDef = QueryParserUtils.matchPropertyDefinition("http://www.alfresco.org/model/content/1.0", namespaceDAO, dictionaryService, field);
return propertyDef.getName();
}
Aggregations