Search in sources :

Example 1 with IndexTokenisationMode

use of org.alfresco.repo.dictionary.IndexTokenisationMode 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");
    }
}
Also used : Locale(java.util.Locale) BooleanQuery(org.apache.lucene.search.BooleanQuery) Builder(org.apache.lucene.search.BooleanQuery.Builder) ArrayList(java.util.ArrayList) ArrayList(java.util.ArrayList) NamedList(org.apache.solr.common.util.NamedList) List(java.util.List) LinkedList(java.util.LinkedList) PropertyDefinition(org.alfresco.service.cmr.dictionary.PropertyDefinition) IndexTokenisationMode(org.alfresco.repo.dictionary.IndexTokenisationMode) Builder(org.apache.lucene.search.BooleanQuery.Builder)

Example 2 with IndexTokenisationMode

use of org.alfresco.repo.dictionary.IndexTokenisationMode 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();
    }
}
Also used : Locale(java.util.Locale) BooleanQuery(org.apache.lucene.search.BooleanQuery) Set(java.util.Set) OrderedHashSet(org.antlr.misc.OrderedHashSet) HashSet(java.util.HashSet) Query(org.apache.lucene.search.Query) RegexpQuery(org.apache.lucene.search.RegexpQuery) MatchAllDocsQuery(org.apache.lucene.search.MatchAllDocsQuery) ConstantScoreQuery(org.apache.lucene.search.ConstantScoreQuery) SpanNearQuery(org.apache.lucene.search.spans.SpanNearQuery) SpanOrQuery(org.apache.lucene.search.spans.SpanOrQuery) MultiTermQuery(org.apache.lucene.search.MultiTermQuery) SpanTermQuery(org.apache.lucene.search.spans.SpanTermQuery) SpanQuery(org.apache.lucene.search.spans.SpanQuery) TermQuery(org.apache.lucene.search.TermQuery) BooleanQuery(org.apache.lucene.search.BooleanQuery) TermRangeQuery(org.apache.lucene.search.TermRangeQuery) IndexedField(org.alfresco.solr.AlfrescoSolrDataModel.IndexedField) QName(org.alfresco.service.namespace.QName) Builder(org.apache.lucene.search.BooleanQuery.Builder) ArrayList(java.util.ArrayList) Builder(org.apache.lucene.search.BooleanQuery.Builder) PropertyDefinition(org.alfresco.service.cmr.dictionary.PropertyDefinition) IndexTokenisationMode(org.alfresco.repo.dictionary.IndexTokenisationMode) SAXPathException(org.jaxen.saxpath.SAXPathException) ParseException(org.apache.lucene.queryparser.classic.ParseException) FTSQueryException(org.alfresco.repo.search.impl.parsers.FTSQueryException) IOException(java.io.IOException) SchemaField(org.apache.solr.schema.SchemaField) Collection(java.util.Collection) FieldInstance(org.alfresco.solr.AlfrescoSolrDataModel.FieldInstance) Pair(org.alfresco.util.Pair)

Example 3 with IndexTokenisationMode

use of org.alfresco.repo.dictionary.IndexTokenisationMode in project SearchServices by Alfresco.

the class Solr4QueryParser method attributeQueryBuilder.

private Query attributeQueryBuilder(String field, String queryText, SubQuery subQueryBuilder, AnalysisMode analysisMode, LuceneFunction luceneFunction) throws ParseException {
    // TODO: Fix duplicate token generation for mltext, content and text.
    // -locale expansion here and in tokeisation -> duplicates
    // Get type info etc
    // TODO: additional suffixes
    Pair<String, String> fieldNameAndEnding = QueryParserUtils.extractFieldNameAndEnding(field);
    String expandedFieldName = null;
    QName propertyQName;
    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;
        }
        propertyQName = propertyDef.getName();
    } else {
        expandedFieldName = expandAttributeFieldName(field);
        propertyQName = QName.createQName(fieldNameAndEnding.getFirst());
    }
    if (isAllStar(queryText)) {
        return createTermQuery(FIELD_PROPERTIES, propertyQName.toString());
    }
    if (luceneFunction != LuceneFunction.FIELD) {
        if ((tokenisationMode == IndexTokenisationMode.FALSE) || (tokenisationMode == IndexTokenisationMode.BOTH)) {
            if (luceneFunction == LuceneFunction.LOWER) {
                if (false == queryText.toLowerCase().equals(queryText)) {
                    return createNoMatchQuery();
                }
            }
            if (luceneFunction == LuceneFunction.UPPER) {
                if (false == queryText.toUpperCase().equals(queryText)) {
                    return createNoMatchQuery();
                }
            }
            return functionQueryBuilder(expandedFieldName, fieldNameAndEnding.getSecond(), propertyQName, propertyDef, tokenisationMode, queryText, luceneFunction);
        }
    }
    // Mime type
    if (fieldNameAndEnding.getSecond().equals(FIELD_MIMETYPE_SUFFIX)) {
        if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) {
            return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyQName, ContentFieldType.MIMETYPE, FieldUse.ID).getFields().get(0).getField(), queryText, analysisMode, luceneFunction);
        }
    } else if (fieldNameAndEnding.getSecond().equals(FIELD_SIZE_SUFFIX)) {
        if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) {
            return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyQName, ContentFieldType.SIZE, FieldUse.ID).getFields().get(0).getField(), queryText, analysisMode, luceneFunction);
        }
    } else if (fieldNameAndEnding.getSecond().equals(FIELD_LOCALE_SUFFIX)) {
        if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) {
            return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyQName, ContentFieldType.LOCALE, FieldUse.ID).getFields().get(0).getField(), queryText, analysisMode, luceneFunction);
        }
    } else if (fieldNameAndEnding.getSecond().equals(FIELD_ENCODING_SUFFIX)) {
        if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) {
            return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyQName, ContentFieldType.ENCODING, FieldUse.ID).getFields().get(0).getField(), queryText, analysisMode, luceneFunction);
        }
    } else if (fieldNameAndEnding.getSecond().equals(FIELD_TRANSFORMATION_STATUS_SUFFIX)) {
        if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) {
            return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyQName, ContentFieldType.TRANSFORMATION_STATUS, FieldUse.ID).getFields().get(0).getField(), queryText, analysisMode, luceneFunction);
        }
    } else if (fieldNameAndEnding.getSecond().equals(FIELD_TRANSFORMATION_TIME_SUFFIX)) {
        if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) {
            return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyQName, ContentFieldType.TRANSFORMATION_TIME, FieldUse.ID).getFields().get(0).getField(), queryText, analysisMode, luceneFunction);
        }
    } else if (fieldNameAndEnding.getSecond().equals(FIELD_TRANSFORMATION_EXCEPTION_SUFFIX)) {
        if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) {
            return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyQName, ContentFieldType.TRANSFORMATION_EXCEPTION, FieldUse.ID).getFields().get(0).getField(), queryText, analysisMode, luceneFunction);
        }
    }
    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)) {
            addMLTextAttributeQuery(field, propertyDef, queryText, subQueryBuilder, analysisMode, luceneFunction, expandedFieldName, propertyDef, tokenisationMode, booleanQuery, locale);
        }
        return getNonEmptyBooleanQuery(booleanQuery.build());
    } else // Content
    if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) {
        // Identifier request are ignored for content
        // Build a sub query for each locale and or the results together -
        // - add an explicit condition for the locale
        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 addContentAttributeQuery(propertyDef, queryText, subQueryBuilder, analysisMode, luceneFunction, expandedFieldName, expandedLocales);
    } else if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.TEXT))) {
        // if (propertyQName.equals(ContentModel.PROP_USER_USERNAME) ||
        // propertyQName.equals(ContentModel.PROP_USERNAME) ||
        // propertyQName.equals(ContentModel.PROP_AUTHORITY_NAME))
        // {
        // // nasty work around for solr support for user and group look up
        // as we can not support lowercased identifiers in the model
        // if(isLucene())
        // {
        // return subQueryBuilder.getQuery(expandedFieldName, queryText,
        // analysisMode, luceneFunction);
        // }
        // }
        boolean withWildCards = propertyQName.equals(ContentModel.PROP_USER_USERNAME) || propertyQName.equals(ContentModel.PROP_USERNAME) || propertyQName.equals(ContentModel.PROP_AUTHORITY_NAME);
        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, withWildCards));
        }
        for (Locale locale : (((expandedLocales == null) || (expandedLocales.size() == 0)) ? Collections.singletonList(I18NUtil.getLocale()) : expandedLocales)) {
            Locale fixedLocale = locale;
            if (fixedLocale.getLanguage().equals("*")) {
                fixedLocale = new Locale("??");
            }
            addTextAttributeQuery(field, propertyDef, queryText, subQueryBuilder, analysisMode, luceneFunction, expandedFieldName, tokenisationMode, booleanQuery, fixedLocale);
        }
        return getNonEmptyBooleanQuery(booleanQuery.build());
    } else {
        // Date does not support like
        if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.DATETIME))) {
            if (analysisMode == AnalysisMode.LIKE) {
                throw new UnsupportedOperationException("Wild cards are not supported for the datetime type");
            }
        }
        // expand date for loose date parsing
        if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.DATETIME) || propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE))) {
            Pair<Date, Integer> dateAndResolution = parseDateString(queryText);
            BooleanQuery.Builder bQuery = new BooleanQuery.Builder();
            IndexedField indexedField = AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyDef.getName(), null, FieldUse.FTS);
            for (FieldInstance instance : indexedField.getFields()) {
                if (dateAndResolution != null) {
                    Query query = newRangeQuery(instance.getField(), getDateStart(dateAndResolution), getDateEnd(dateAndResolution), true, true);
                    if (query != null) {
                        bQuery.add(query, Occur.SHOULD);
                    }
                } else {
                    Query query = subQueryBuilder.getQuery(instance.getField(), queryText, AnalysisMode.DEFAULT, luceneFunction);
                    if (query != null) {
                        bQuery.add(query, Occur.SHOULD);
                    }
                }
            }
            if (bQuery.build().clauses().size() > 0) {
                return bQuery.build();
            } else {
                return createNoMatchQuery();
            }
        }
        if ((propertyDef != null) && (tenantService.isTenantUser()) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.NODE_REF)) && (queryText.contains(StoreRef.URI_FILLER))) {
            // ALF-6202
            queryText = tenantService.getName(new NodeRef(queryText)).toString();
        }
        // Dates are not special in this case
        if (propertyDef != null) {
            BooleanQuery.Builder bQuery = new BooleanQuery.Builder();
            IndexedField indexedField = AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyDef.getName(), null, FieldUse.FTS);
            for (FieldInstance instance : indexedField.getFields()) {
                Query query = subQueryBuilder.getQuery(instance.getField(), queryText, AnalysisMode.DEFAULT, luceneFunction);
                if (query != null) {
                    bQuery.add(query, Occur.SHOULD);
                }
            }
            if (bQuery.build().clauses().size() > 0) {
                return bQuery.build();
            } else {
                return createNoMatchQuery();
            }
        } else {
            Query query = subQueryBuilder.getQuery(expandedFieldName, queryText, AnalysisMode.DEFAULT, luceneFunction);
            if (query != null) {
                return query;
            } else {
                return createNoMatchQuery();
            }
        }
    }
}
Also used : Locale(java.util.Locale) BooleanQuery(org.apache.lucene.search.BooleanQuery) Query(org.apache.lucene.search.Query) RegexpQuery(org.apache.lucene.search.RegexpQuery) MatchAllDocsQuery(org.apache.lucene.search.MatchAllDocsQuery) ConstantScoreQuery(org.apache.lucene.search.ConstantScoreQuery) SpanNearQuery(org.apache.lucene.search.spans.SpanNearQuery) SpanOrQuery(org.apache.lucene.search.spans.SpanOrQuery) MultiTermQuery(org.apache.lucene.search.MultiTermQuery) SpanTermQuery(org.apache.lucene.search.spans.SpanTermQuery) SpanQuery(org.apache.lucene.search.spans.SpanQuery) TermQuery(org.apache.lucene.search.TermQuery) BooleanQuery(org.apache.lucene.search.BooleanQuery) TermRangeQuery(org.apache.lucene.search.TermRangeQuery) QName(org.alfresco.service.namespace.QName) IndexedField(org.alfresco.solr.AlfrescoSolrDataModel.IndexedField) Builder(org.apache.lucene.search.BooleanQuery.Builder) ArrayList(java.util.ArrayList) PropertyDefinition(org.alfresco.service.cmr.dictionary.PropertyDefinition) IndexTokenisationMode(org.alfresco.repo.dictionary.IndexTokenisationMode) Builder(org.apache.lucene.search.BooleanQuery.Builder) Date(java.util.Date) NodeRef(org.alfresco.service.cmr.repository.NodeRef) ArrayList(java.util.ArrayList) NamedList(org.apache.solr.common.util.NamedList) List(java.util.List) LinkedList(java.util.LinkedList) FieldInstance(org.alfresco.solr.AlfrescoSolrDataModel.FieldInstance)

Aggregations

ArrayList (java.util.ArrayList)3 Locale (java.util.Locale)3 IndexTokenisationMode (org.alfresco.repo.dictionary.IndexTokenisationMode)3 PropertyDefinition (org.alfresco.service.cmr.dictionary.PropertyDefinition)3 BooleanQuery (org.apache.lucene.search.BooleanQuery)3 Builder (org.apache.lucene.search.BooleanQuery.Builder)3 LinkedList (java.util.LinkedList)2 List (java.util.List)2 QName (org.alfresco.service.namespace.QName)2 FieldInstance (org.alfresco.solr.AlfrescoSolrDataModel.FieldInstance)2 IndexedField (org.alfresco.solr.AlfrescoSolrDataModel.IndexedField)2 ConstantScoreQuery (org.apache.lucene.search.ConstantScoreQuery)2 MatchAllDocsQuery (org.apache.lucene.search.MatchAllDocsQuery)2 MultiTermQuery (org.apache.lucene.search.MultiTermQuery)2 Query (org.apache.lucene.search.Query)2 RegexpQuery (org.apache.lucene.search.RegexpQuery)2 TermQuery (org.apache.lucene.search.TermQuery)2 TermRangeQuery (org.apache.lucene.search.TermRangeQuery)2 SpanNearQuery (org.apache.lucene.search.spans.SpanNearQuery)2 SpanOrQuery (org.apache.lucene.search.spans.SpanOrQuery)2