mirror of
https://github.com/Alfresco/SearchServices.git
synced 2026-09-16 18:12:56 +00:00
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:
+248
-168
@@ -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());
|
||||
}
|
||||
}
|
||||
+24
-25
@@ -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)));
|
||||
|
||||
+7
-11
@@ -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.
|
||||
|
||||
+32
-18
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user