Merge branch 'feature/SEARCH-2166_DateFunctionWhere' into 'master'

Feature/search 2166 date function where

See merge request search_discovery/insightengine!531
This commit is contained in:
Andrea Gazzarini
2020-06-08 12:46:20 +01:00
5 changed files with 312 additions and 223 deletions
@@ -116,6 +116,12 @@ import org.springframework.beans.BeansException;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import static java.util.Optional.ofNullable;
import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_DAY_FIELD_SUFFIX;
import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_HOUR_FIELD_SUFFIX;
import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_MINUTE_FIELD_SUFFIX;
import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_MONTH_FIELD_SUFFIX;
import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_SECOND_FIELD_SUFFIX;
import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_YEAR_FIELD_SUFFIX;
/**
* @author Andy
@@ -150,33 +156,41 @@ 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@";
static final String PART_FIELDNAME_PREFIX = "part@sd@";
static final Set<String> DATE_PART_SUFFIXES =
Set.of(UNIT_OF_TIME_YEAR_FIELD_SUFFIX,
UNIT_OF_TIME_MONTH_FIELD_SUFFIX,
UNIT_OF_TIME_DAY_FIELD_SUFFIX,
UNIT_OF_TIME_HOUR_FIELD_SUFFIX,
UNIT_OF_TIME_MINUTE_FIELD_SUFFIX,
UNIT_OF_TIME_SECOND_FIELD_SUFFIX);
/**
* Infix used for denoting a primitive single valued field with no doc values enabled
*
* @see #getFieldForText
*/
private static final String SINGLE_VALUE_WITHOUT_DOC_VALUES_MARKER = "@s_@";
/**
* Infix used for denoting a primitive single valued field with no doc values enabled
*
* @see #getFieldForText
*/
private static final String SINGLE_VALUE_WITH_DOC_VALUES_MARKER = "@sd@";
@@ -192,26 +206,22 @@ public class AlfrescoSolrDataModel implements QueryConstants
private final static AlfrescoSolrDataModel INSTANCE = new AlfrescoSolrDataModel();
private TenantService tenantService;
private final TenantService tenantService;
private NamespaceDAO namespaceDAO;
private final NamespaceDAO namespaceDAO;
private DictionaryDAOImpl dictionaryDAO;
private final DictionaryDAOImpl dictionaryDAO;
private Map<String,DictionaryComponent> dictionaryServices;
private final Map<String,DictionaryComponent> dictionaryServices;
private Map<DictionaryKey,CMISAbstractDictionaryService> cmisDictionaryServices;
private final Map<DictionaryKey,CMISAbstractDictionaryService> cmisDictionaryServices;
private Map<String, Set<String>> modelErrors = new HashMap<>();
private Set<QName> suggestableProperties = new HashSet<>();
private Set<QName> crossLocaleSearchDataTypes = new HashSet<>();
private Set<QName> crossLocaleSearchProperties = new HashSet<>();
private Set<QName> identifierProperties = new HashSet<>();
private ThreadPoolExecutor threadPool;
private final Map<String, Set<String>> modelErrors = new HashMap<>();
private final Set<QName> suggestableProperties = new HashSet<>();
private final Set<QName> crossLocaleSearchDataTypes = new HashSet<>();
private final Set<QName> crossLocaleSearchProperties = new HashSet<>();
private final Set<QName> identifierProperties = new HashSet<>();
private final ThreadPoolExecutor threadPool;
public void close() {
threadPool.shutdown();
@@ -604,7 +614,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);
@@ -629,19 +639,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:
@@ -656,21 +666,29 @@ public class AlfrescoSolrDataModel implements QueryConstants
default:
break;
}
builder.append('@');
builder.append(propertyQName);
indexedField.addField(builder.toString(), false, false);
}
else if (isDateOrDatetime(dataTypeDefinition))
{
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();
@@ -704,7 +722,7 @@ public class AlfrescoSolrDataModel implements QueryConstants
break;
case EXACT:
addExactSearchFields(propertyDefinition, indexedField);
break;
break;
case MULTI_FACET:
addMultiSearchFields(propertyDefinition, indexedField);
break;
@@ -979,6 +997,11 @@ public class AlfrescoSolrDataModel implements QueryConstants
public String getStoredTextField(QName propertyQName)
{
return getStoredTextField(propertyQName, null);
}
public String getStoredTextField(QName propertyQName, String suffix)
{
PropertyDefinition propertyDefinition = getPropertyDefinition(propertyQName);
@@ -1004,11 +1027,21 @@ public class AlfrescoSolrDataModel implements QueryConstants
sb.append("@");
sb.append(propertyDefinition.getName().toString());
if (suffix != null)
{
sb.append(suffix);
}
return sb.toString();
}
public String getStoredMLTextField(QName propertyQName)
{
return getStoredMLTextField(propertyQName, null);
}
public String getStoredMLTextField(QName propertyQName, String suffix)
{
PropertyDefinition propertyDefinition = getPropertyDefinition(propertyQName);
@@ -1032,11 +1065,21 @@ public class AlfrescoSolrDataModel implements QueryConstants
sb.append("@");
sb.append(propertyDefinition.getName().toString());
if (suffix != null)
{
sb.append(suffix);
}
return sb.toString();
}
public String getStoredContentField(QName propertyQName)
{
return getStoredContentField(propertyQName, null);
}
public String getStoredContentField(QName propertyQName, String suffix)
{
PropertyDefinition propertyDefinition = getPropertyDefinition(propertyQName);
@@ -1060,10 +1103,42 @@ public class AlfrescoSolrDataModel implements QueryConstants
sb.append("@");
sb.append(propertyDefinition.getName().toString());
if (suffix != null)
{
sb.append(suffix);
}
return sb.toString();
}
public String getDateDerivedField(QName propertyQName, String suffix)
{
PropertyDefinition propertyDefinition = getPropertyDefinition(propertyQName);
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
@@ -1211,43 +1286,6 @@ public class AlfrescoSolrDataModel implements QueryConstants
}
}
private boolean isPrimitive(DataTypeDefinition dataType)
{
if(dataType.getName().equals(DataTypeDefinition.INT))
{
return true;
}
else if(dataType.getName().equals(DataTypeDefinition.LONG))
{
return true;
}
else if(dataType.getName().equals(DataTypeDefinition.FLOAT))
{
return true;
}
else if(dataType.getName().equals(DataTypeDefinition.DOUBLE))
{
return true;
}
else if(dataType.getName().equals(DataTypeDefinition.DATE))
{
return true;
}
else if(dataType.getName().equals(DataTypeDefinition.DATETIME))
{
return true;
}
else if(dataType.getName().equals(DataTypeDefinition.BOOLEAN))
{
return true;
}
else if(dataType.getName().equals(DataTypeDefinition.CATEGORY))
{
return true;
}
else return dataType.getName().equals(DataTypeDefinition.NODE_REF);
}
public String getFieldForNonText(PropertyDefinition propertyDefinition)
{
StringBuilder builder = new StringBuilder();
@@ -1334,30 +1372,6 @@ public class AlfrescoSolrDataModel implements QueryConstants
dictionaryDAO.removeModel(modelQName);
}
private Set<String> validateModel(M2Model model)
{
try
{
dictionaryDAO.getCompiledModel(QName.createQName(model.getName(), namespaceDAO));
}
catch (DictionaryException | NamespaceException exception)
{
// No model to diff
return Collections.emptySet();
}
// namespace unknown - no model
List<M2ModelDiff> modelDiffs = dictionaryDAO.diffModelIgnoringConstraints(model);
return modelDiffs.stream()
.filter(diff -> diff.getDiffType().equals(M2ModelDiff.DIFF_UPDATED))
.map(diff ->
String.format("Model not updated: %s Failed to validate model update - found non-incrementally updated %s '%s'",
model.getName(),
diff.getElementType(),
diff.getElementName()))
.collect(Collectors.toSet());
}
M2Model getM2Model(QName modelQName)
{
return dictionaryDAO.getCompiledModel(modelQName).getM2Model();
@@ -1663,28 +1677,39 @@ public class AlfrescoSolrDataModel implements QueryConstants
}
}
if (propertyDef == null || propertyDef.getName() == null){
if (propertyDef == null || propertyDef.getName() == null)
{
return mapNonPropertyFields(luceneField);
}
if (propertyDef.getName().equals(DataTypeDefinition.TEXT))
if (isDateOrDatetime(propertyDef.getDataType()) && isDerivedDateField(fieldNameAndEnding.getSecond()))
{
return getStoredTextField(propertyDef.getName());
return getDateDerivedField(propertyDef.getName(), fieldNameAndEnding.getSecond());
}
else if (propertyDef.getName().equals(DataTypeDefinition.MLTEXT))
else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.TEXT))
{
return getStoredMLTextField(propertyDef.getName());
return getStoredTextField(propertyDef.getName(), fieldNameAndEnding.getSecond());
}
else if (propertyDef.getName().equals(DataTypeDefinition.CONTENT))
else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.MLTEXT))
{
return getStoredContentField(propertyDef.getName());
return getStoredMLTextField(propertyDef.getName(), fieldNameAndEnding.getSecond());
}
else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))
{
return getStoredContentField(propertyDef.getName(), fieldNameAndEnding.getSecond());
}
else
{
return mapAlfrescoField(FieldUse.FTS, 0, fieldNameAndEnding, luceneField, propertyDef);
return mapAlfrescoField(FieldUse.FTS, 0, fieldNameAndEnding, luceneField, propertyDef)
+ fieldNameAndEnding.getSecond();
}
}
public boolean isDerivedDateField(String suffix)
{
return DATE_PART_SUFFIXES.contains(suffix);
}
public String mapProperty(String potentialProperty, FieldUse fieldUse, SolrQueryRequest req, int position)
{
if(potentialProperty.equals("asc") || potentialProperty.equals("desc") || potentialProperty.equals("_docid_"))
@@ -1727,7 +1752,107 @@ public class AlfrescoSolrDataModel implements QueryConstants
return solrSortField;
}
private String mapAlfrescoField(FieldUse fieldUse, int position, Pair<String, String> fieldNameAndEnding, String luceneField, PropertyDefinition propertyDef) {
public String mapNonPropertyFields(String queryField)
{
switch(queryField)
{
case "ID":
return "LID";
case "EXACTTYPE":
return "TYPE";
default:
return queryField;
}
}
/**
* @param ending String
* @return SpecializedFieldType
*/
public SpecializedFieldType getTextField(String ending)
{
switch(ending)
{
case FIELD_MIMETYPE_SUFFIX:
return SpecializedFieldType.CONTENT_MIMETYPE;
case FIELD_SIZE_SUFFIX:
return SpecializedFieldType.CONTENT_SIZE;
case FIELD_LOCALE_SUFFIX:
return SpecializedFieldType.CONTENT_LOCALE;
case FIELD_ENCODING_SUFFIX:
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:
default:
return null;
}
}
public void setCMDefaultUri()
{
if(getNamespaceDAO().getURIs().contains(NamespaceService.CONTENT_MODEL_1_0_URI))
{
getNamespaceDAO().addPrefix("", NamespaceService.CONTENT_MODEL_1_0_URI);
}
}
/**
* Returns the prefix used for denoting a field which is meant to represent a constituent part of a
* date or datetime (e.g. year, month, second, minute).
*
* @param sourceFieldName the date/datetime source field name.
* @return the prefix that can be used for denoting a date or datetime part
*/
public String destructuredDateTimePartFieldNamePrefix(String sourceFieldName) {
// source field name example: datetime@sd@{http://www.alfresco.org/model/content/1.0}created
// prefix: datetime
String prefix = sourceFieldName.substring(0, sourceFieldName.indexOf("@"));
// prefix, docValues disabled option: datetime@s_@
String sourceFieldNamePrefixWithoutDocValues = prefix + SINGLE_VALUE_WITHOUT_DOC_VALUES_MARKER;
// prefix, docValues enabled option: datetime@sd@
String sourceFieldNamePrefixWithDocValues = prefix + SINGLE_VALUE_WITH_DOC_VALUES_MARKER;
return sourceFieldName.replace(sourceFieldNamePrefixWithoutDocValues, PART_FIELDNAME_PREFIX)
.replace(sourceFieldNamePrefixWithDocValues, PART_FIELDNAME_PREFIX);
}
private boolean isDateOrDatetime(DataTypeDefinition dataType)
{
return dataType.getName().equals(DataTypeDefinition.DATE) ||
dataType.getName().equals(DataTypeDefinition.DATETIME);
}
private boolean isPrimitive(DataTypeDefinition dataType)
{
QName name = dataType.getName();
return name.equals(DataTypeDefinition.INT)
|| name.equals(DataTypeDefinition.LONG)
|| name.equals(DataTypeDefinition.FLOAT)
|| name.equals(DataTypeDefinition.DOUBLE)
|| isDateOrDatetime(dataType)
|| name.equals(DataTypeDefinition.BOOLEAN)
|| name.equals(DataTypeDefinition.CATEGORY)
|| name.equals(DataTypeDefinition.NODE_REF);
}
private String mapAlfrescoField(FieldUse fieldUse, int position, Pair<String, String> fieldNameAndEnding, String luceneField, PropertyDefinition propertyDef)
{
String solrSortField;
if(propertyDef != null)
{
@@ -1756,72 +1881,27 @@ public class AlfrescoSolrDataModel implements QueryConstants
return solrSortField;
}
public String mapNonPropertyFields(String queryField)
private Set<String> validateModel(M2Model model)
{
switch(queryField)
try
{
case "ID":
return "LID";
case "EXACTTYPE":
return "TYPE";
default:
return queryField;
dictionaryDAO.getCompiledModel(QName.createQName(model.getName(), namespaceDAO));
}
}
/**
* @param ending String
* @return ContentFieldType
*/
public ContentFieldType getTextField(String ending)
{
switch(ending)
catch (DictionaryException | NamespaceException exception)
{
case FIELD_MIMETYPE_SUFFIX:
return ContentFieldType.MIMETYPE;
case FIELD_SIZE_SUFFIX:
return ContentFieldType.SIZE;
case FIELD_LOCALE_SUFFIX:
return ContentFieldType.LOCALE;
case FIELD_ENCODING_SUFFIX:
return ContentFieldType.ENCODING;
case FIELD_TRANSFORMATION_STATUS_SUFFIX:
case FIELD_TRANSFORMATION_TIME_SUFFIX:
case FIELD_TRANSFORMATION_EXCEPTION_SUFFIX:
default:
return null;
// No model to diff
return Collections.emptySet();
}
}
public void setCMDefaultUri()
{
if(getNamespaceDAO().getURIs().contains(NamespaceService.CONTENT_MODEL_1_0_URI))
{
getNamespaceDAO().addPrefix("", NamespaceService.CONTENT_MODEL_1_0_URI);
}
}
/**
* Returns the prefix used for denoting a field which is meant to represent a constituent part of a
* date or datetime (e.g. year, month, second, minute).
*
* @param sourceFieldName the date/datetime source field name.
* @param sourceDataTypeDefinition the datatype of the source field name (date or datetime)
* @return the prefix that can be used for denoting a date or datetime part
*/
public String destructuredDateTimePartFieldNamePrefix(String sourceFieldName, DataTypeDefinition sourceDataTypeDefinition) {
// source field name example: datetime@sd@{http://www.alfresco.org/model/content/1.0}created
// prefix: datetime
String prefix = sourceFieldName.substring(0, sourceFieldName.indexOf("@"));
// prefix, docValues disabled option: datetime@s_@
String sourceFieldNamePrefixWithoutDocValues = prefix + SINGLE_VALUE_WITHOUT_DOC_VALUES_MARKER;
// prefix, docValues enabled option: datetime@sd@
String sourceFieldNamePrefixWithDocValues = prefix + SINGLE_VALUE_WITH_DOC_VALUES_MARKER;
return sourceFieldName.replace(sourceFieldNamePrefixWithoutDocValues, PART_FIELDNAME_PREFIX)
.replace(sourceFieldNamePrefixWithDocValues, PART_FIELDNAME_PREFIX);
// namespace unknown - no model
List<M2ModelDiff> modelDiffs = dictionaryDAO.diffModelIgnoringConstraints(model);
return modelDiffs.stream()
.filter(diff -> diff.getDiffType().equals(M2ModelDiff.DIFF_UPDATED))
.map(diff ->
String.format("Model not updated: %s Failed to validate model update - found non-incrementally updated %s '%s'",
model.getName(),
diff.getElementType(),
diff.getElementName()))
.collect(Collectors.toSet());
}
}
@@ -380,12 +380,12 @@ public class SolrInformationServer implements InformationServer
public static final String CASCADE_TRACKER_ENABLED = "alfresco.cascade.tracker.enabled";
private static final String UNIT_OF_TIME_FIELD_INFIX = "_unit_of_time";
static final String UNIT_OF_TIME_YEAR_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_year";
static final String UNIT_OF_TIME_MONTH_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_month";
static final String UNIT_OF_TIME_DAY_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_day";
static final String UNIT_OF_TIME_HOUR_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_hour";
static final String UNIT_OF_TIME_MINUTE_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_minute";
static final String UNIT_OF_TIME_SECOND_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_second";
public static final String UNIT_OF_TIME_YEAR_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_year";
public static final String UNIT_OF_TIME_MONTH_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_month";
public static final String UNIT_OF_TIME_DAY_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_day";
public static final String UNIT_OF_TIME_HOUR_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_hour";
public static final String UNIT_OF_TIME_MINUTE_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_minute";
public static final String UNIT_OF_TIME_SECOND_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_second";
private final static Function<String, List<Object>> LAZY_EMPTY_MUTABLE_LIST = key -> new ArrayList<>();
@@ -2427,10 +2427,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)
@@ -2455,27 +2455,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
@@ -2598,11 +2598,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)
{
@@ -2654,9 +2654,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);
@@ -3826,7 +3826,7 @@ public class SolrInformationServer implements InformationServer
{
try
{
String fieldNamePrefix = dataModel.destructuredDateTimePartFieldNamePrefix(sourceFieldName, dataType);
String fieldNamePrefix = dataModel.destructuredDateTimePartFieldNamePrefix(sourceFieldName);
ZonedDateTime dateTime = ZonedDateTime.parse(value, DateTimeFormatter.ISO_ZONED_DATE_TIME);
consumer.accept(fieldNamePrefix + UNIT_OF_TIME_YEAR_FIELD_SUFFIX, dateTime.getYear());
consumer.accept(fieldNamePrefix + UNIT_OF_TIME_MONTH_FIELD_SUFFIX, dateTime.getMonth().getValue());
@@ -3953,7 +3953,6 @@ public class SolrInformationServer implements InformationServer
*/
private Optional<Collection<NodeMetaData>> getNodesMetaDataFromRepository(NodeMetaDataParameters parameters)
{
Collection<NodeMetaData> nodeMetaDataCollection = null;
try
{
return Optional.of(notNullOrEmpty(repositoryClient.getNodesMetaData(parameters)));
@@ -32,19 +32,15 @@ import org.apache.solr.common.params.SolrParams;
import org.apache.solr.handler.component.ResponseBuilder;
import org.apache.solr.handler.component.SearchComponent;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.transform.DocTransformer;
import org.apache.solr.search.SolrReturnFields;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import static java.util.Optional.ofNullable;
import static org.alfresco.solr.AlfrescoSolrDataModel.FieldUse.FACET;
import static org.alfresco.solr.AlfrescoSolrDataModel.FieldUse.FTS;
import static org.alfresco.solr.AlfrescoSolrDataModel.FieldUse.ID;
import static org.alfresco.solr.AlfrescoSolrDataModel.FieldUse.SORT;
/**
* @Author elia
@@ -75,7 +71,7 @@ public class RewriteFieldListComponent extends SearchComponent {
String originalFieldList = req.getParams().get("fl");
boolean cacheTransformer = ofNullable(solrReturnFields.getTransformer())
.map(t -> t.getName())
.map(DocTransformer::getName)
.map(name -> name.contains("fmap"))
.orElse(false);
@@ -89,7 +85,7 @@ public class RewriteFieldListComponent extends SearchComponent {
{
fieldListSet.addAll(solrReturnFields.getLuceneFieldNames()
.stream()
.filter(field -> allowedNonCachedFields.contains(field))
.filter(allowedNonCachedFields::contains)
.collect(Collectors.toSet()));
}
@@ -98,7 +94,7 @@ public class RewriteFieldListComponent extends SearchComponent {
fieldListSet.addAll(defaultNonCachedFields);
}
params.set("fl", fieldListSet.stream().collect(Collectors.joining(",")));
params.set("fl", String.join(",", fieldListSet));
}
else
{
@@ -111,7 +107,7 @@ public class RewriteFieldListComponent extends SearchComponent {
fieldListSet.addAll(solrReturnFields.getLuceneFieldNames().stream()
.map( field -> AlfrescoSolrDataModel.getInstance()
.mapStoredProperty(field, req))
.filter(schemaFieldName -> schemaFieldName != null)
.filter(Objects::nonNull)
.map(schemaFieldName -> schemaFieldName.chars()
.mapToObj(c -> (char) c)
.map(c -> Character.isJavaIdentifierPart(c)? c : '?')
@@ -120,7 +116,7 @@ public class RewriteFieldListComponent extends SearchComponent {
.collect(Collectors.toSet()));
}
params.add("fl", fieldListSet.stream().collect(Collectors.joining(",")));
params.add("fl", String.join(",", fieldListSet));
}
// This is added for filtering the fields in the cached transformer.
@@ -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;
@@ -3074,22 +3074,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;
}
@@ -3125,8 +3125,9 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
{
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))
} else if ((propertyDef.getDataType().getName().equals(DataTypeDefinition.DATETIME)
|| propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE)) &&
!AlfrescoSolrDataModel.getInstance().isDerivedDateField(fieldNameAndEnding.getSecond()))
{
Pair<Date, Integer> dateAndResolution1 = parseDateString(part1);
Pair<Date, Integer> dateAndResolution2 = parseDateString(part2);
@@ -3158,10 +3159,14 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
}
}
return bQuery.build();
} else
}
else
{
String solrField = AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyDef.getName(), null, FieldUse.ID).getFields().get(0).getField();
.getQueryableFields(propertyDef.getName(),
AlfrescoSolrDataModel.getInstance().getTextField(fieldNameAndEnding.getSecond()),
FieldUse.ID)
.getFields().get(0).getField();
String start = null;
try
@@ -4159,7 +4164,7 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT)))
{
return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyQName, ContentFieldType.MIMETYPE, FieldUse.ID).getFields().get(0)
.getQueryableFields(propertyQName, SpecializedFieldType.CONTENT_MIMETYPE, FieldUse.ID).getFields().get(0)
.getField(), queryText, analysisMode, luceneFunction);
}
@@ -4168,7 +4173,7 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT)))
{
return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyQName, ContentFieldType.SIZE, FieldUse.ID).getFields().get(0)
.getQueryableFields(propertyQName, SpecializedFieldType.CONTENT_SIZE, FieldUse.ID).getFields().get(0)
.getField(), queryText, analysisMode, luceneFunction);
}
@@ -4178,7 +4183,7 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT)))
{
return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyQName, ContentFieldType.LOCALE, FieldUse.ID).getFields().get(0)
.getQueryableFields(propertyQName, SpecializedFieldType.CONTENT_LOCALE, FieldUse.ID).getFields().get(0)
.getField(), queryText, analysisMode, luceneFunction);
}
@@ -4188,7 +4193,7 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT)))
{
return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyQName, ContentFieldType.ENCODING, FieldUse.ID).getFields().get(0)
.getQueryableFields(propertyQName, SpecializedFieldType.CONTENT_ENCODING, FieldUse.ID).getFields().get(0)
.getField(), queryText, analysisMode, luceneFunction);
}
@@ -4200,7 +4205,7 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
return subQueryBuilder
.getQuery(
AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyQName, ContentFieldType.TRANSFORMATION_STATUS,
.getQueryableFields(propertyQName, SpecializedFieldType.TRANSFORMATION_STATUS,
FieldUse.ID)
.getFields().get(0).getField(),
queryText, analysisMode, luceneFunction);
@@ -4214,7 +4219,7 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
return subQueryBuilder
.getQuery(
AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyQName, ContentFieldType.TRANSFORMATION_TIME,
.getQueryableFields(propertyQName, SpecializedFieldType.TRANSFORMATION_TIME,
FieldUse.ID)
.getFields().get(0).getField(),
queryText, analysisMode, luceneFunction);
@@ -4227,7 +4232,7 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
{
return subQueryBuilder.getQuery(
AlfrescoSolrDataModel.getInstance()
.getQueryableFields(propertyQName, ContentFieldType.TRANSFORMATION_EXCEPTION,
.getQueryableFields(propertyQName, SpecializedFieldType.TRANSFORMATION_EXCEPTION,
FieldUse.ID)
.getFields().get(0).getField(),
queryText, analysisMode, luceneFunction);
@@ -4235,6 +4240,17 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
}
}
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);
}
}
// Already in expanded form
@@ -5548,6 +5564,4 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants
query.setRewriteMethod(MultiTermQuery.CONSTANT_SCORE_REWRITE);
return query;
}
}
@@ -22,7 +22,7 @@
</distributionManagement>
<properties>
<dependency.alfresco-data-model.version>8.112</dependency.alfresco-data-model.version>
<dependency.alfresco-data-model.version>8.115</dependency.alfresco-data-model.version>
<dependency.jackson.version>2.10.3</dependency.jackson.version>
</properties>