[SEARCH-2166]

added support for order by
code refactoring
This commit is contained in:
eliaporciani
2020-05-20 22:56:22 +02:00
parent 62b7324b58
commit bac0ed28aa
3 changed files with 128 additions and 184 deletions
@@ -155,16 +155,22 @@ public class AlfrescoSolrDataModel implements QueryConstants
HIGHLIGHT
}
public enum ContentFieldType
public enum SpecializedFieldType
{
DOCID,
SIZE,
LOCALE,
MIMETYPE,
ENCODING,
CONTENT_DOCID,
CONTENT_SIZE,
CONTENT_LOCALE,
CONTENT_MIMETYPE,
CONTENT_ENCODING,
TRANSFORMATION_STATUS,
TRANSFORMATION_TIME,
TRANSFORMATION_EXCEPTION
TRANSFORMATION_EXCEPTION,
UNIT_OF_TIME_SECOND,
UNIT_OF_TIME_MINUTE,
UNIT_OF_TIME_HOUR,
UNIT_OF_TIME_DAY,
UNIT_OF_TIME_MONTH,
UNIT_OF_TIME_YEAR
}
public static final String CONTENT_S_LOCALE_PREFIX = "content@s__locale@";
@@ -615,7 +621,7 @@ public class AlfrescoSolrDataModel implements QueryConstants
return dictionaryComponent;
}
public IndexedField getIndexedFieldForContentPropertyMetadata(QName propertyQName, ContentFieldType type)
public IndexedField getIndexedFieldForSpecializedPropertyMetadata(QName propertyQName, SpecializedFieldType type)
{
IndexedField indexedField = new IndexedField();
PropertyDefinition propertyDefinition = getPropertyDefinition(propertyQName);
@@ -640,19 +646,19 @@ public class AlfrescoSolrDataModel implements QueryConstants
builder.append('_');
switch (type)
{
case DOCID:
case CONTENT_DOCID:
builder.append("docid");
break;
case ENCODING:
case CONTENT_ENCODING:
builder.append("encoding");
break;
case LOCALE:
case CONTENT_LOCALE:
builder.append("locale");
break;
case MIMETYPE:
case CONTENT_MIMETYPE:
builder.append("mimetype");
break;
case SIZE:
case CONTENT_SIZE:
builder.append("size");
break;
case TRANSFORMATION_EXCEPTION:
@@ -667,21 +673,30 @@ public class AlfrescoSolrDataModel implements QueryConstants
default:
break;
}
builder.append('@');
builder.append(propertyQName);
indexedField.addField(builder.toString(), false, false);
}
else if (dataTypeDefinition.getName().equals(DataTypeDefinition.DATE) ||
dataTypeDefinition.getName().equals(DataTypeDefinition.DATETIME))
{
String dateDerivedSuffix = getDateDerivedSuffix(type);
if (dateDerivedSuffix != null)
{
indexedField.addField(getDateDerivedField(propertyQName, dateDerivedSuffix), false, true);
}
}
return indexedField;
}
public IndexedField getQueryableFields(QName propertyQName, ContentFieldType type, FieldUse fieldUse)
public IndexedField getQueryableFields(QName propertyQName, SpecializedFieldType type, FieldUse fieldUse)
{
if(type != null)
{
return getIndexedFieldForContentPropertyMetadata(propertyQName, type);
return getIndexedFieldForSpecializedPropertyMetadata(propertyQName, type);
}
IndexedField indexedField = new IndexedField();
@@ -1082,6 +1097,27 @@ public class AlfrescoSolrDataModel implements QueryConstants
return "part@sd@" + propertyDefinition.getName().toString() + suffix;
}
public String getDateDerivedSuffix(SpecializedFieldType type)
{
switch (type)
{
case UNIT_OF_TIME_SECOND:
return UNIT_OF_TIME_SECOND_FIELD_SUFFIX;
case UNIT_OF_TIME_MINUTE:
return UNIT_OF_TIME_MINUTE_FIELD_SUFFIX;
case UNIT_OF_TIME_HOUR:
return UNIT_OF_TIME_HOUR_FIELD_SUFFIX;
case UNIT_OF_TIME_DAY:
return UNIT_OF_TIME_DAY_FIELD_SUFFIX;
case UNIT_OF_TIME_MONTH:
return UNIT_OF_TIME_MONTH_FIELD_SUFFIX;
case UNIT_OF_TIME_YEAR:
return UNIT_OF_TIME_YEAR_FIELD_SUFFIX;
default:
return null;
}
}
/**
* Get all the field names into which we must copy the source data
@@ -1803,20 +1839,32 @@ public class AlfrescoSolrDataModel implements QueryConstants
/**
* @param ending String
* @return ContentFieldType
* @return SpecializedFieldType
*/
public ContentFieldType getTextField(String ending)
public SpecializedFieldType getTextField(String ending)
{
switch(ending)
{
case FIELD_MIMETYPE_SUFFIX:
return ContentFieldType.MIMETYPE;
return SpecializedFieldType.CONTENT_MIMETYPE;
case FIELD_SIZE_SUFFIX:
return ContentFieldType.SIZE;
return SpecializedFieldType.CONTENT_SIZE;
case FIELD_LOCALE_SUFFIX:
return ContentFieldType.LOCALE;
return SpecializedFieldType.CONTENT_LOCALE;
case FIELD_ENCODING_SUFFIX:
return ContentFieldType.ENCODING;
return SpecializedFieldType.CONTENT_ENCODING;
case UNIT_OF_TIME_SECOND_FIELD_SUFFIX:
return SpecializedFieldType.UNIT_OF_TIME_SECOND;
case UNIT_OF_TIME_MINUTE_FIELD_SUFFIX:
return SpecializedFieldType.UNIT_OF_TIME_MINUTE;
case UNIT_OF_TIME_HOUR_FIELD_SUFFIX:
return SpecializedFieldType.UNIT_OF_TIME_HOUR;
case UNIT_OF_TIME_DAY_FIELD_SUFFIX:
return SpecializedFieldType.UNIT_OF_TIME_DAY;
case UNIT_OF_TIME_MONTH_FIELD_SUFFIX:
return SpecializedFieldType.UNIT_OF_TIME_MONTH;
case UNIT_OF_TIME_YEAR_FIELD_SUFFIX:
return SpecializedFieldType.UNIT_OF_TIME_YEAR;
case FIELD_TRANSFORMATION_STATUS_SUFFIX:
case FIELD_TRANSFORMATION_TIME_SUFFIX:
case FIELD_TRANSFORMATION_EXCEPTION_SUFFIX:
@@ -2412,10 +2412,10 @@ public class SolrInformationServer implements InformationServer
private void addContentPropertyMetadata(
SolrInputDocument doc,
QName propertyQName,
AlfrescoSolrDataModel.ContentFieldType type,
AlfrescoSolrDataModel.SpecializedFieldType type,
GetTextContentResponse textContentResponse)
{
IndexedField indexedField = dataModel.getIndexedFieldForContentPropertyMetadata(propertyQName, type);
IndexedField indexedField = dataModel.getIndexedFieldForSpecializedPropertyMetadata(propertyQName, type);
for (FieldInstance fieldInstance : indexedField.getFields())
{
switch(type)
@@ -2440,27 +2440,27 @@ public class SolrInformationServer implements InformationServer
BiConsumer<String, Object> consumer,
QName propertyQName,
ContentPropertyValue contentPropertyValue,
AlfrescoSolrDataModel.ContentFieldType type)
AlfrescoSolrDataModel.SpecializedFieldType type)
{
IndexedField indexedField =
AlfrescoSolrDataModel.getInstance().getIndexedFieldForContentPropertyMetadata(propertyQName, type);
AlfrescoSolrDataModel.getInstance().getIndexedFieldForSpecializedPropertyMetadata(propertyQName, type);
for (FieldInstance fieldInstance : indexedField.getFields())
{
switch(type)
{
case DOCID:
case CONTENT_DOCID:
consumer.accept(fieldInstance.getField(), contentPropertyValue.getId());
break;
case ENCODING:
case CONTENT_ENCODING:
consumer.accept(fieldInstance.getField(), contentPropertyValue.getEncoding());
break;
case LOCALE:
case CONTENT_LOCALE:
consumer.accept(fieldInstance.getField(), contentPropertyValue.getLocale().toString());
break;
case MIMETYPE:
case CONTENT_MIMETYPE:
consumer.accept(fieldInstance.getField(), contentPropertyValue.getMimetype());
break;
case SIZE:
case CONTENT_SIZE:
consumer.accept(fieldInstance.getField(), contentPropertyValue.getLength());
break;
// Skips the ones that require the text content response
@@ -2583,11 +2583,11 @@ public class SolrInformationServer implements InformationServer
ContentPropertyValue propertyValue,
boolean contentIndexingEnabled)
{
addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.ContentFieldType.DOCID);
addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.ContentFieldType.SIZE);
addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.ContentFieldType.LOCALE);
addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.ContentFieldType.MIMETYPE);
addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.ContentFieldType.ENCODING);
addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.SpecializedFieldType.CONTENT_DOCID);
addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.SpecializedFieldType.CONTENT_SIZE);
addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.SpecializedFieldType.CONTENT_LOCALE);
addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.SpecializedFieldType.CONTENT_MIMETYPE);
addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.SpecializedFieldType.CONTENT_ENCODING);
if (contentIndexingEnabled)
{
@@ -2639,9 +2639,9 @@ public class SolrInformationServer implements InformationServer
// Expensive call to be done with ContentTracker
try (GetTextContentResponse response = repositoryClient.getTextContent(dbId, propertyQName, null)) {
addContentPropertyMetadata(doc, propertyQName, AlfrescoSolrDataModel.ContentFieldType.TRANSFORMATION_STATUS, response);
addContentPropertyMetadata(doc, propertyQName, AlfrescoSolrDataModel.ContentFieldType.TRANSFORMATION_EXCEPTION, response);
addContentPropertyMetadata(doc, propertyQName, AlfrescoSolrDataModel.ContentFieldType.TRANSFORMATION_TIME, response);
addContentPropertyMetadata(doc, propertyQName, AlfrescoSolrDataModel.SpecializedFieldType.TRANSFORMATION_STATUS, response);
addContentPropertyMetadata(doc, propertyQName, AlfrescoSolrDataModel.SpecializedFieldType.TRANSFORMATION_EXCEPTION, response);
addContentPropertyMetadata(doc, propertyQName, AlfrescoSolrDataModel.SpecializedFieldType.TRANSFORMATION_TIME, response);
final String textContent = textContentFrom(response);
@@ -52,7 +52,7 @@ import org.alfresco.service.namespace.NamespacePrefixResolver;
import org.alfresco.service.namespace.QName;
import org.alfresco.solr.AlfrescoAnalyzerWrapper;
import org.alfresco.solr.AlfrescoSolrDataModel;
import org.alfresco.solr.AlfrescoSolrDataModel.ContentFieldType;
import org.alfresco.solr.AlfrescoSolrDataModel.SpecializedFieldType;
import org.alfresco.solr.AlfrescoSolrDataModel.FieldInstance;
import org.alfresco.solr.AlfrescoSolrDataModel.FieldUse;
import org.alfresco.solr.AlfrescoSolrDataModel.IndexedField;
@@ -3064,22 +3064,22 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
{
case FIELD_SIZE_SUFFIX:
solrField = AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyDef.getName(), ContentFieldType.SIZE, FieldUse.ID)
.getQueryableFields(propertyDef.getName(), SpecializedFieldType.CONTENT_SIZE, FieldUse.ID)
.getFields().get(0).getField();
break;
case FIELD_MIMETYPE_SUFFIX:
solrField = AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyDef.getName(), ContentFieldType.MIMETYPE, FieldUse.ID)
.getQueryableFields(propertyDef.getName(), SpecializedFieldType.CONTENT_MIMETYPE, FieldUse.ID)
.getFields().get(0).getField();
break;
case FIELD_ENCODING_SUFFIX:
solrField = AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyDef.getName(), ContentFieldType.ENCODING, FieldUse.ID)
.getQueryableFields(propertyDef.getName(), SpecializedFieldType.CONTENT_ENCODING, FieldUse.ID)
.getFields().get(0).getField();
break;
case FIELD_LOCALE_SUFFIX:
solrField = AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyDef.getName(), ContentFieldType.LOCALE, FieldUse.ID)
.getQueryableFields(propertyDef.getName(), SpecializedFieldType.CONTENT_LOCALE, FieldUse.ID)
.getFields().get(0).getField();
break;
}
@@ -3119,61 +3119,44 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
|| propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE)) &&
!AlfrescoSolrDataModel.getInstance().isDerivedDateField(fieldNameAndEnding.getSecond()))
{
if (AlfrescoSolrDataModel.getInstance().isDerivedDateField(fieldNameAndEnding.getSecond()))
{
Pair<Date, Integer> dateAndResolution1 = parseDateString(part1);
Pair<Date, Integer> dateAndResolution2 = parseDateString(part2);
}
else
BooleanQuery.Builder bQuery = new BooleanQuery.Builder();
IndexedField indexedField = AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyDef.getName(), null, FieldUse.ID);
for (FieldInstance instance : indexedField.getFields())
{
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("*"))
{
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);
}
start = null;
}
if (end.equals("*"))
{
end = null;
}
return bQuery.build();
}
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;
if ((propertyDef.getDataType().getName().equals(DataTypeDefinition.DATETIME)
|| propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE)) &&
AlfrescoSolrDataModel.getInstance().isDerivedDateField(fieldNameAndEnding.getSecond()))
{
solrField = AlfrescoSolrDataModel.getInstance().getDateDerivedField(propertyDef.getName(), fieldNameAndEnding.getSecond());
}
else
{
solrField = AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyDef.getName(), null, FieldUse.ID).getFields().get(0).getField();
}
String solrField = AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyDef.getName(),
AlfrescoSolrDataModel.getInstance().getTextField(fieldNameAndEnding.getSecond()),
FieldUse.ID)
.getFields().get(0).getField();
String start = null;
try
@@ -4165,98 +4148,13 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
}
}
// Mime type
if (fieldNameAndEnding.getSecond().equals(FIELD_MIMETYPE_SUFFIX))
if (fieldNameAndEnding.getSecond() != null && propertyDef != null)
{
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);
}
}
else if (AlfrescoSolrDataModel.getInstance().isDerivedDateField(fieldNameAndEnding.getSecond()))
{
if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE)
|| propertyDef.getDataType().getName().equals(DataTypeDefinition.DATETIME )))
{
return subQueryBuilder.getQuery(
AlfrescoSolrDataModel.getInstance()
.getDateDerivedField(propertyQName, fieldNameAndEnding.getSecond()),
queryText, analysisMode, luceneFunction);
}
return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyQName,
AlfrescoSolrDataModel.getInstance().getTextField(fieldNameAndEnding.getSecond()),
FieldUse.ID).getFields().get(0)
.getField(), queryText, analysisMode, luceneFunction);
}
// Already in expanded form
@@ -5535,6 +5433,4 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
query.setRewriteMethod(MultiTermQuery.CONSTANT_SCORE_REWRITE);
return query;
}
}