Search in sources :

Example 1 with IndexedField

use of org.alfresco.solr.AlfrescoSolrDataModel.IndexedField in project SearchServices by Alfresco.

the class Solr4QueryParser method addMLTextOrTextSpanQuery.

private void addMLTextOrTextSpanQuery(String afield, PropertyDefinition pDef, String first, String last, int slop, boolean inOrder, String expandedFieldName, IndexTokenisationMode tokenisationMode, Builder booleanQuery, Locale locale) {
    try {
        if (locale.toString().length() == 0) {
            IndexedField indexedField = AlfrescoSolrDataModel.getInstance().getQueryableFields(pDef.getName(), null, FieldUse.FTS);
            for (FieldInstance field : indexedField.getFields()) {
                if (!field.isLocalised()) {
                    SpanQuery firstQuery = buildSpanOrQuery(first, field);
                    SpanQuery lastQuery = buildSpanOrQuery(last, field);
                    SpanNearQuery result = new SpanNearQuery(new SpanQuery[] { firstQuery, lastQuery }, slop, inOrder);
                    booleanQuery.add(result, Occur.SHOULD);
                }
            }
        } else {
            IndexedField indexedField = AlfrescoSolrDataModel.getInstance().getQueryableFields(pDef.getName(), null, FieldUse.FTS);
            for (FieldInstance field : indexedField.getFields()) {
                if (field.isLocalised()) {
                    SpanQuery firstQuery = buildSpanOrQuery(getLocalePrefixedText(first, locale), field);
                    SpanQuery lastQuery = buildSpanOrQuery(getLocalePrefixedText(last, locale), field);
                    SpanNearQuery result = new SpanNearQuery(new SpanQuery[] { firstQuery, lastQuery }, slop, inOrder);
                    booleanQuery.add(result, Occur.SHOULD);
                }
            }
        }
    } catch (IOException ioe) {
    }
}
Also used : IndexedField(org.alfresco.solr.AlfrescoSolrDataModel.IndexedField) IOException(java.io.IOException) FieldInstance(org.alfresco.solr.AlfrescoSolrDataModel.FieldInstance) SpanNearQuery(org.apache.lucene.search.spans.SpanNearQuery) SpanQuery(org.apache.lucene.search.spans.SpanQuery)

Example 2 with IndexedField

use of org.alfresco.solr.AlfrescoSolrDataModel.IndexedField in project SearchServices by Alfresco.

the class Solr4QueryParser method addContentSpanQuery.

protected org.apache.lucene.search.Query addContentSpanQuery(String afield, PropertyDefinition pDef, String first, String last, int slop, boolean inOrder, String expandedFieldName, List<Locale> expandedLocales) {
    try {
        BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
        for (Locale locale : expandedLocales) {
            if (locale.toString().length() == 0) {
                IndexedField indexedField = AlfrescoSolrDataModel.getInstance().getQueryableFields(pDef.getName(), null, FieldUse.FTS);
                for (FieldInstance field : indexedField.getFields()) {
                    if (!field.isLocalised()) {
                        SpanQuery firstQuery = buildSpanOrQuery(first, field);
                        SpanQuery lastQuery = buildSpanOrQuery(last, field);
                        SpanNearQuery result = new SpanNearQuery(new SpanQuery[] { firstQuery, lastQuery }, slop, inOrder);
                        booleanQuery.add(result, Occur.SHOULD);
                    }
                }
            } else {
                IndexedField indexedField = AlfrescoSolrDataModel.getInstance().getQueryableFields(pDef.getName(), null, FieldUse.FTS);
                for (FieldInstance field : indexedField.getFields()) {
                    if (field.isLocalised()) {
                        SpanQuery firstQuery = buildSpanOrQuery(getLocalePrefixedText(first, locale), field);
                        SpanQuery lastQuery = buildSpanOrQuery(getLocalePrefixedText(last, locale), field);
                        SpanNearQuery result = new SpanNearQuery(new SpanQuery[] { firstQuery, lastQuery }, slop, inOrder);
                        booleanQuery.add(result, Occur.SHOULD);
                    }
                }
            }
        }
        return getNonEmptyBooleanQuery(booleanQuery.build());
    } catch (IOException ioe) {
        return createNoMatchQuery();
    }
}
Also used : Locale(java.util.Locale) BooleanQuery(org.apache.lucene.search.BooleanQuery) IndexedField(org.alfresco.solr.AlfrescoSolrDataModel.IndexedField) Builder(org.apache.lucene.search.BooleanQuery.Builder) IOException(java.io.IOException) FieldInstance(org.alfresco.solr.AlfrescoSolrDataModel.FieldInstance) Builder(org.apache.lucene.search.BooleanQuery.Builder) SpanNearQuery(org.apache.lucene.search.spans.SpanNearQuery) SpanQuery(org.apache.lucene.search.spans.SpanQuery)

Example 3 with IndexedField

use of org.alfresco.solr.AlfrescoSolrDataModel.IndexedField 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 4 with IndexedField

use of org.alfresco.solr.AlfrescoSolrDataModel.IndexedField in project SearchServices by Alfresco.

the class SolrInformationServer method getSolrFieldNameForContentPropertyMetadata.

/**
 * Gets the field name used in Solr for the specified content property.
 * Assumes that the first defined field in Solr is the "right one".
 * @param propertyQName the content property qualified name
 * @param type the content property field type, i.e. DOCID
 * @return a String representing the name of the field in Solr or null if not found
 */
private static String getSolrFieldNameForContentPropertyMetadata(QName propertyQName, AlfrescoSolrDataModel.ContentFieldType type) {
    IndexedField indexedField = AlfrescoSolrDataModel.getInstance().getIndexedFieldForContentPropertyMetadata(propertyQName, type);
    List<FieldInstance> fields = indexedField.getFields();
    String fieldName = null;
    if (fields != null && !fields.isEmpty()) {
        FieldInstance instance = fields.get(0);
        if (instance != null) {
            fieldName = instance.getField();
        }
    }
    return fieldName;
}
Also used : IndexedField(org.alfresco.solr.AlfrescoSolrDataModel.IndexedField) FieldInstance(org.alfresco.solr.AlfrescoSolrDataModel.FieldInstance)

Example 5 with IndexedField

use of org.alfresco.solr.AlfrescoSolrDataModel.IndexedField 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

FieldInstance (org.alfresco.solr.AlfrescoSolrDataModel.FieldInstance)6 IndexedField (org.alfresco.solr.AlfrescoSolrDataModel.IndexedField)6 SpanNearQuery (org.apache.lucene.search.spans.SpanNearQuery)5 SpanQuery (org.apache.lucene.search.spans.SpanQuery)5 Locale (java.util.Locale)4 BooleanQuery (org.apache.lucene.search.BooleanQuery)4 Builder (org.apache.lucene.search.BooleanQuery.Builder)4 IOException (java.io.IOException)3 ConstantScoreQuery (org.apache.lucene.search.ConstantScoreQuery)3 MatchAllDocsQuery (org.apache.lucene.search.MatchAllDocsQuery)3 MultiTermQuery (org.apache.lucene.search.MultiTermQuery)3 Query (org.apache.lucene.search.Query)3 RegexpQuery (org.apache.lucene.search.RegexpQuery)3 TermQuery (org.apache.lucene.search.TermQuery)3 TermRangeQuery (org.apache.lucene.search.TermRangeQuery)3 SpanOrQuery (org.apache.lucene.search.spans.SpanOrQuery)3 SpanTermQuery (org.apache.lucene.search.spans.SpanTermQuery)3 ArrayList (java.util.ArrayList)2 IndexTokenisationMode (org.alfresco.repo.dictionary.IndexTokenisationMode)2 PropertyDefinition (org.alfresco.service.cmr.dictionary.PropertyDefinition)2