[ SEARCH-2091 ] first draft (highlighter tests green)

This commit is contained in:
agazzarini
2020-02-11 12:05:28 +01:00
parent 4f83588af3
commit 79daa41755
7 changed files with 1217 additions and 1151 deletions

View File

@@ -776,29 +776,34 @@ public class AlfrescoSolrDataModel implements QueryConstants
}
}
// TODO: make it better
private void addHighlightSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField)
{
FieldInstance field = new FieldInstance("text@s_stored@" + propertyDefinition.getName(), false, false);
indexedField.getFields().add(field);
/*
if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.TRUE)
|| (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH))
QName propertyDataTypeQName = propertyDefinition.getDataType().getName();
StringBuilder builder =
new StringBuilder()
.append(propertyDataTypeQName.getLocalName())
.append("@");
if(propertyDataTypeQName.equals(DataTypeDefinition.MLTEXT))
{
if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName()))
{
indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false);
indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false);
}
else
{
indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false);
}
builder.append('m');
}
else if(propertyDataTypeQName.equals(DataTypeDefinition.CONTENT))
{
builder.append('s');
}
else
{
indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false);
builder.append(propertyDefinition.isMultiValued() ? "m" : "s");
}
*/
builder.append("_stored_lt@").append(propertyDefinition.getName().toString());
System.out.println(propertyDefinition.getName() + " has been mapped to " + builder);
FieldInstance field = new FieldInstance(builder.toString(), true, false);
indexedField.getFields().add(field);
}
/*

View File

@@ -2193,6 +2193,67 @@ public class SolrInformationServer implements InformationServer
"FIELD: Name = " + field.getField() + ", Localised = " + field.localised + ", Sort = " + field.sort;
}
static void mltextProperty(QName propertyQName, MLTextPropertyValue value, final BiConsumer<String, Object> valueHolder)
{
AlfrescoSolrDataModel dataModel = AlfrescoSolrDataModel.getInstance();
List<FieldInstance> fields = dataModel.getIndexedFieldNamesForProperty(propertyQName).getFields();
// TODO: is there a better way to determine if the field is a mltext or not
// (for example) a boolean or a primitive (the default model always associates 1 field to such types)
// Boolean properties (like isIndexed) are caught in this loop because they are classified as StringPropertyValue
if (fields.size() > 1) {
// TODO: this should be got from AlfrescoSolrDataModel
String storedFieldName = "mltext@m_stored_lt@" + propertyQName;
valueHolder.accept(storedFieldName, getLocalisedValues(value));
// mltext Sort fields concatenate multiple values (1 locale - 1 value) in a single string
// we cannot do that using copyfield or update request processor so the only possible approach
// is to send the sort field separately (like we do for doc values "text" fields)
fields.stream()
.filter(FieldInstance::isSort)
.forEach(field -> addMLTextProperty(valueHolder, field, value));
} else {
// Theoretically we should never be in this branch (primitive types are not mltext)
dataModel.getIndexedFieldNamesForProperty(propertyQName).getFields()
.forEach(field -> addMLTextProperty(valueHolder, field, value));
}
}
static void stringProperty(QName propertyQName, StringPropertyValue value, PropertyValue locale, final BiConsumer<String, Object> valueHolder)
{
AlfrescoSolrDataModel dataModel = AlfrescoSolrDataModel.getInstance();
List<FieldInstance> fields = dataModel.getIndexedFieldNamesForProperty(propertyQName).getFields();
// TODO: is there a better way to determine if the field is a text/mltext/content or not
// (for example) a boolean or a primitive (the default model always associates 1 field to such types)
// Boolean properties (like isIndexed) are caught in this loop because they are classified as StringPropertyValue
if (fields.size() > 1) {
// TODO: this should be got from AlfrescoSolrDataModel
String storedFieldName = "text@s_stored_lt@" + propertyQName;
valueHolder.accept(storedFieldName, getLocalisedValue((StringPropertyValue) value, locale));
/* the schema have been changed so all the stored field above is copied on every text@...@ fields
The only exception is the text@sd___@ which has docvalues enabled. We can't copy the stored field
there because the locale prefix cannot be removed (as it happens with the other non-localised text@ fields)
*/
dataModel.getIndexedFieldNamesForProperty(propertyQName).getFields()
.stream()
.filter(field -> field.getField().startsWith("text@sd___@"))
.forEach(field -> addStringProperty(valueHolder, field, (StringPropertyValue) value, locale));
} else {
// OLD CODE: this relates to primitive/non-text fields/properties (like LID, APATH or boolean@...)
dataModel.getIndexedFieldNamesForProperty(propertyQName).getFields()
.forEach(field -> addStringProperty(valueHolder, field, (StringPropertyValue) value, locale));
}
}
static void populateProperties(
Map<QName, PropertyValue> properties,
boolean contentIndexingHasBeenRequestedForThisNode,
@@ -2211,6 +2272,8 @@ public class SolrInformationServer implements InformationServer
final BiConsumer<String, Object> setValue = document::setField;
final BiConsumer<String, Object> addValue = document::addField;
final BiConsumer<String, Object> collectName = (name, value) -> addFieldIfNotSet(document, name);
final BiConsumer<String, Object> setAndCollect = setValue.andThen(collectName);
final BiConsumer<String, Object> addAndCollect = addValue.andThen(collectName);
for (Entry<QName, PropertyValue> property : properties.entrySet())
{
@@ -2221,54 +2284,22 @@ public class SolrInformationServer implements InformationServer
PropertyValue value = property.getValue();
if(value != null)
{
AlfrescoSolrDataModel dataModel = AlfrescoSolrDataModel.getInstance();
if (value instanceof StringPropertyValue)
{
/*
*
* Boolean properties (like isIndexed) are classified are StringPropertyValue
*/
List<FieldInstance> fields = dataModel.getIndexedFieldNamesForProperty(propertyQName).getFields();
if (fields.size() > 1) {
System.out.println(propertyQName + "=>" + dataModel.getIndexedFieldNamesForProperty(propertyQName).getFields().size());
String storedFieldName = "text@s_stored@" + propertyQName;
System.out.println(storedFieldName);
document.setField(storedFieldName, getLocalisedValue((StringPropertyValue) value, properties));
/* the schema have been changed so all the stored field above is copied on every text@...@ fields
The only exception is the text@sd___@ which has docvalues enabled. We can't copy the stored field
there because the locale prefix cannot be removed (as it happens with the other non-localised text@ fields)
*/
dataModel.getIndexedFieldNamesForProperty(propertyQName).getFields()
.stream()
.filter(field -> field.getField().startsWith("text@sd___@"))
.forEach(field -> addStringProperty(setValue.andThen(collectName), field, (StringPropertyValue) value, properties));
} else {
// OLD CODE
dataModel.getIndexedFieldNamesForProperty(propertyQName).getFields()
.stream()
//.peek(field -> System.out.println(propertyToString(document.get("DBID"), "Single StringPropertyValue", propertyQName, value, field)))
.forEach(field -> addStringProperty(setValue.andThen(collectName), field, (StringPropertyValue) value, properties));
}
stringProperty(propertyQName, (StringPropertyValue) value, properties.get(ContentModel.PROP_LOCALE), setAndCollect);
}
else if (value instanceof MLTextPropertyValue)
{
dataModel.getIndexedFieldNamesForProperty(propertyQName).getFields()
.stream()
//.peek(field -> System.out.println(propertyToString(document.get("id"), "Single MLTextPropertyValue", propertyQName, value, field)))
.forEach(field -> addMLTextProperty(setValue.andThen(collectName), field, (MLTextPropertyValue) value));
mltextProperty(propertyQName,(MLTextPropertyValue) value, setAndCollect);
}
else if (value instanceof ContentPropertyValue)
{
addContentProperty(setValue.andThen(collectName), document, propertyQName, (ContentPropertyValue) value, contentIndexingIsEnabled);
addContentProperty(setAndCollect, document, propertyQName, (ContentPropertyValue) value, contentIndexingIsEnabled);
}
else if (value instanceof MultiPropertyValue)
{
MultiPropertyValue typedValue = (MultiPropertyValue) value;
AlfrescoSolrDataModel dataModel = AlfrescoSolrDataModel.getInstance();
clearFields(
document,
dataModel.getIndexedFieldNamesForProperty(propertyQName).getFields()
@@ -2280,20 +2311,15 @@ public class SolrInformationServer implements InformationServer
{
if (singleValue instanceof StringPropertyValue)
{
dataModel.getIndexedFieldNamesForProperty(propertyQName).getFields()
.stream()
.peek(field -> System.out.println(propertyToString(document.get("DBID"), "Multiple StringPropertyValue", propertyQName, value, field)))
.forEach(field -> addStringProperty(addValue.andThen(collectName), field, (StringPropertyValue) singleValue, properties));
stringProperty(propertyQName, (StringPropertyValue) singleValue, properties.get(ContentModel.PROP_LOCALE), addAndCollect);
}
else if (singleValue instanceof MLTextPropertyValue)
{
dataModel.getIndexedFieldNamesForProperty(propertyQName).getFields()
.stream()
.peek(field -> System.out.println(propertyToString(document.get("DBID"), "Multiple MLTextPropertyValue", propertyQName, value, field))) .forEach(field -> addMLTextProperty(addValue.andThen(collectName), field, (MLTextPropertyValue) singleValue));
mltextProperty(propertyQName,(MLTextPropertyValue) singleValue, addAndCollect);
}
else if (singleValue instanceof ContentPropertyValue)
{
addContentProperty(addValue.andThen(collectName), document, propertyQName, (ContentPropertyValue) singleValue, contentIndexingIsEnabled);
addContentProperty(addAndCollect, document, propertyQName, (ContentPropertyValue) singleValue, contentIndexingIsEnabled);
}
}
}
@@ -2630,18 +2656,37 @@ public class SolrInformationServer implements InformationServer
this.getTrackerStats().addDocTransformationTime(System.nanoTime() - start);
dataModel.getIndexedFieldNamesForProperty(propertyQName).getFields()
.stream()
.peek(field -> doc.removeField(field.getField()))
.forEach(field -> {
doc.addField(
field.getField(),
field.isLocalised()
? "\u0000" + locale + "\u0000" + textContent
: textContent);
// TODO: The field name should be retrieved from AlfrescoSolrDataModel
String storedField = "content@s_stored_lt@" + propertyQName;
addFieldIfNotSet(doc, field.getField());
});
doc.setField(storedField, "\u0000" + locale + "\u0000" + textContent);
dataModel.getIndexedFieldNamesForProperty(propertyQName)
.getFields()
.forEach(field -> addFieldIfNotSet(doc, field.getField()));
}
private static List<String> getLocalisedValues(MLTextPropertyValue mlTextPropertyValue)
{
if (mlTextPropertyValue == null)
{
return Collections.emptyList();
}
List<String> values = new ArrayList<>();
for (Locale locale : mlTextPropertyValue.getLocales())
{
final String propValue = mlTextPropertyValue.getValue(locale);
if((locale == null) || propValue == null)
{
continue;
}
StringBuilder builder = new StringBuilder(propValue.length() + 16);
builder.append("\u0000").append(locale.toString()).append("\u0000").append(propValue);
values.add(builder.toString());
}
return values;
}
private static void addMLTextProperty(BiConsumer<String, Object> consumer, FieldInstance field, MLTextPropertyValue mlTextPropertyValue)
@@ -3820,10 +3865,10 @@ public class SolrInformationServer implements InformationServer
}
}
private static String getLocalisedValue(StringPropertyValue property, Map<QName, PropertyValue> properties)
private static String getLocalisedValue(StringPropertyValue property, PropertyValue localeProperty)
{
Locale locale =
ofNullable(properties.get(ContentModel.PROP_LOCALE))
ofNullable(localeProperty)
.map(StringPropertyValue.class::cast)
.map(StringPropertyValue::getValue)
.map(value -> DefaultTypeConverter.INSTANCE.convert(Locale.class, value))
@@ -3832,23 +3877,9 @@ public class SolrInformationServer implements InformationServer
return "\u0000" + locale.toString() + "\u0000" + property.getValue();
}
private static void addStringProperty(BiConsumer<String, Object> consumer, FieldInstance field, StringPropertyValue property, Map<QName, PropertyValue> properties)
private static void addStringProperty(BiConsumer<String, Object> consumer, FieldInstance field, StringPropertyValue property, PropertyValue localeProperty)
{
if(field.isLocalised())
{
Locale locale =
ofNullable(properties.get(ContentModel.PROP_LOCALE))
.map(StringPropertyValue.class::cast)
.map(StringPropertyValue::getValue)
.map(value -> DefaultTypeConverter.INSTANCE.convert(Locale.class, value))
.orElse(I18NUtil.getLocale());
consumer.accept(field.getField(), "\u0000" + locale.toString() + "\u0000" + property.getValue());
}
else
{
consumer.accept(field.getField(), property.getValue());
}
consumer.accept(field.getField(), field.isLocalised() ? getLocalisedValue(property, localeProperty) : property.getValue());
}
private static void addFieldIfNotSet(SolrInputDocument doc, String name)

View File

@@ -241,6 +241,7 @@ public class AlfrescoSolrHighlighter extends DefaultSolrHighlighter implements P
// Additional mappings coming from this 2nd round
Map<String, String> additionalMappings = new HashMap<>();
/*
identifiers.keySet()
.forEach(id -> {
final NamedList<Object> docHighlighting = (NamedList<Object>) highlightingResponse.get(id);
@@ -257,7 +258,8 @@ public class AlfrescoSolrHighlighter extends DefaultSolrHighlighter implements P
mappings.putAll(additionalMappings);
withDebug(mappings);
*/
/*
// We are going to re-call the highlight for those documents/fields which didnt' produce any result in the
// previous step. In order to do that we need
// - a (Solr) field name: the second-level choice coming from Alfresco Data Model
@@ -295,6 +297,8 @@ public class AlfrescoSolrHighlighter extends DefaultSolrHighlighter implements P
.filter(notNullAndNotEmpty)
.collect(toList());
// Combine (actually reduce) the highlight response coming from the first try, with each
// partial highlight response coming from subsequent calls
NamedList<Object> responseBeforeRenamingFields = partialHighlightingResponses.stream()
@@ -315,9 +319,10 @@ public class AlfrescoSolrHighlighter extends DefaultSolrHighlighter implements P
});
return accumulator;
});
*/
// Final step: under each document section, highlight snippets are associated with Solr field names,
NamedList<Object> responseBeforeRenamingFields = highlightingResponse;
// Final step: under each document section, highlight snippets are associated with Solr field names,
// so we need to replace them with fields actually requested
// In addition, beside the snippets we want to have the document DBID as well.
NamedList<Object> response = new SimpleOrderedMap<>();

View File

@@ -219,7 +219,7 @@ public class AlfrescoSolrUtils
nodeMetaData.setAncestors(ancestors);
Map<QName, PropertyValue> props = new HashMap<>();
props.put(ContentModel.PROP_IS_INDEXED, new StringPropertyValue("true"));
props.put(ContentModel.PROP_CONTENT, new ContentPropertyValue(Locale.US, 0l, "UTF-8", "text/plain", null));
props.put(ContentModel.PROP_CONTENT, new ContentPropertyValue(Locale.US, 0L, "UTF-8", "text/plain", null));
nodeMetaData.setProperties(props);
//If create createError is true then we leave out the nodeRef which will cause an error
if(!createError) {

View File

@@ -70,7 +70,7 @@ public class AlfrescoHighlighterIT extends AbstractAlfrescoSolrIT
List<Map<String, String>> data = asList(
of(NAME_METADATA_ATTRIBUTE, "some very long name",
DESCRIPTION_METADATA_ATTRIBUTE, "mydesc",
DESCRIPTION_METADATA_ATTRIBUTE, "is this a long description? No, I do not think is so long",
TITLE_METADATA_ATTRIBUTE, "title1 is very long"),
of(NAME_METADATA_ATTRIBUTE, long_text,
TITLE_METADATA_ATTRIBUTE, "title2"),
@@ -180,7 +180,7 @@ public class AlfrescoHighlighterIT extends AbstractAlfrescoSolrIT
SolrServletRequest req = areq(params("q", "name:long", "qt", "/afts", "start", "0", "rows", "5",
HighlightParams.HIGHLIGHT, "true",
HighlightParams.Q, "long",
HighlightParams.FIELDS, "content,name,title",
HighlightParams.FIELDS, "content,name,title,description",
HighlightParams.SNIPPETS, "4",
HighlightParams.FRAGSIZE, "40"),
"{" +
@@ -190,12 +190,14 @@ public class AlfrescoHighlighterIT extends AbstractAlfrescoSolrIT
assertQ(req,
"*[count(//lst[@name='highlighting']/lst)=2]",
"//lst[@name='highlighting']/lst[1]/arr[@name='name']/str[.='some very <em>long</em> name']",
"//lst[@name='highlighting']/lst[1]/arr[@name='title']/str[.='title1 is very <em>long</em>']",
"//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.='this is some <em>long</em> text. It has the']",
"//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.=' word <em>long</em> in many places. In fact, it has']",
"//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.=' <em>long</em> on some different fragments. Let us']",
"//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.=' see what happens to <em>long</em> in this case.']");
"//lst[@name='highlighting']/lst[1]/arr[@name='name']/str[.='this is some <em>long</em> text. It has the']",
"//lst[@name='highlighting']/lst[1]/arr[@name='name']/str[.=' word <em>long</em> in many places. In fact, it has']",
"//lst[@name='highlighting']/lst[1]/arr[@name='name']/str[.=' <em>long</em> on some different fragments. Let us']",
"//lst[@name='highlighting']/lst[1]/arr[@name='name']/str[.=' see what happens to <em>long</em> in this case.']",
"//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.='some very <em>long</em> name']",
"//lst[@name='highlighting']/lst[2]/arr[@name='description']/str[.='is this a <em>long</em> description? No, I do']",
"//lst[@name='highlighting']/lst[2]/arr[@name='description']/str[.=' not think is so <em>long</em>']",
"//lst[@name='highlighting']/lst[2]/arr[@name='title']/str[.='title1 is very <em>long</em>']");
}
@Test
@@ -246,8 +248,8 @@ public class AlfrescoHighlighterIT extends AbstractAlfrescoSolrIT
assertQ(req,
"*[count(//lst[@name='highlighting']/lst)=2]",
"*[count(//lst[@name='highlighting']/lst/arr[@name='name'])=2]",
"//lst[@name='highlighting']/lst[1]/arr[@name='name']/str[.='some very {long} name']",
"//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.='this is some {long}']");
"//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.='some very {long} name']",
"//lst[@name='highlighting']/lst[1]/arr[@name='name']/str[.='this is some {long}']");
}
@Test
@@ -288,13 +290,13 @@ public class AlfrescoHighlighterIT extends AbstractAlfrescoSolrIT
assertQ(req,
"*[count(//lst[@name='highlighting']/lst/arr[@name='name'])=2]",
"*[count(//lst[@name='highlighting']/lst/str[@name='DBID'])=2]",
"//lst[@name='highlighting']/lst[1]/arr[@name='name']/str[.='some very [long] name']",
"//lst[@name='highlighting']/lst[1]/arr[@name='title']/str[.='title1 is very (long)']",
"//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.='this is some [long] text. It has the word [long] in many places. In fact, it has [long] on some']");
"//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.='some very [long] name']",
"//lst[@name='highlighting']/lst[2]/arr[@name='title']/str[.='title1 is very (long)']",
"//lst[@name='highlighting']/lst[1]/arr[@name='name']/str[.='this is some [long] text. It has the word [long] in many places. In fact, it has [long] on some']");
}
@Test
public void highlightingRequiredFieldsTest()
public void highlightingRequiredFields()
{
SolrServletRequest req = areq(params("q", "name:long", "qt", "/afts", "start", "0", "rows", "5",
HighlightParams.HIGHLIGHT, "true",
@@ -307,7 +309,7 @@ public class AlfrescoHighlighterIT extends AbstractAlfrescoSolrIT
assertQ(req,
"*[count(//lst[@name='highlighting']/lst)=2]",
"*[count(//lst[@name='highlighting']/lst/arr[@name='title'])=1]",
"//lst[@name='highlighting']/lst[1]/arr[@name='title']/str[.='title1 is very {long}']");
"//lst[@name='highlighting']/lst[2]/arr[@name='title']/str[.='title1 is very {long}']");
req = areq(params("q", "name:long OR title:long", "qt", "/afts", "start", "0", "rows", "5",
HighlightParams.HIGHLIGHT, "true",
@@ -322,7 +324,7 @@ public class AlfrescoHighlighterIT extends AbstractAlfrescoSolrIT
"*[count(//lst[@name='highlighting']/lst)=2]",
"*[count(//lst[@name='highlighting']/lst/arr[@name='title'])=1]",
"*[count(//lst[@name='highlighting']/lst/arr[@name='name'])=0]",
"//lst[@name='highlighting']/lst[1]/arr[@name='title']/str[.='title1 is very {long}']");
"//lst[@name='highlighting']/lst[2]/arr[@name='title']/str[.='title1 is very {long}']");
}
@Test
@@ -330,7 +332,7 @@ public class AlfrescoHighlighterIT extends AbstractAlfrescoSolrIT
{
SolrServletRequest req = areq(params("q", "name:long", "qt", "/afts", "start", "0", "rows", "5",
HighlightParams.HIGHLIGHT, "true",
HighlightParams.Q, "long",
HighlightParams.Q, "world",
HighlightParams.FIELDS, "content,name,title",
HighlightParams.SIMPLE_PRE, "<al>",
HighlightParams.SIMPLE_POST, "<fresco>",
@@ -340,12 +342,11 @@ public class AlfrescoHighlighterIT extends AbstractAlfrescoSolrIT
assertQ(req,
"*[count(//lst[@name='highlighting']/lst)=2]",
"//lst[@name='highlighting']/lst[1]/arr[@name='name']/str[.='some very <al>long<fresco> name']",
"//lst[@name='highlighting']/lst[1]/arr[@name='title']/str[.='title1 is very <al>long<fresco>']",
"//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.='this is some <al>long<fresco> text. It has the']",
"//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.=' word <al>long<fresco> in many places. In fact, it has']",
"//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.=' <al>long<fresco> on some different fragments. Let us']",
"//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.=' see what happens to <al>long<fresco> in this case.']");
"//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.='some very <al>long<fresco> name']",
"//lst[@name='highlighting']/lst[2]/arr[@name='title']/str[.='title1 is very <al>long<fresco>']",
"//lst[@name='highlighting']/lst[1]/arr[@name='name']/str[.='this is some <al>long<fresco> text']",
"//lst[@name='highlighting']/lst[1]/arr[@name='name']/str[.='. It has the word <al>long<fresco> in many places. In fact, it has <al>long<fresco>']",
"//lst[@name='highlighting']/lst[1]/arr[@name='name']/str[.=' on some different fragments. Let us see what happens to <al>long<fresco> in this case.']");
}
@Test
@@ -373,7 +374,6 @@ public class AlfrescoHighlighterIT extends AbstractAlfrescoSolrIT
{
SolrServletRequest req = areq(params("q", "name:plural", "qt", "/afts", "start", "0", "rows", "5",
HighlightParams.HIGHLIGHT, "true",
//HighlightParams.Q, "lon*",
HighlightParams.FIELDS, NAME_METADATA_ATTRIBUTE,
HighlightParams.HIGHLIGHT_MULTI_TERM, "false",
HighlightParams.SIMPLE_PRE, "{",

View File

@@ -1,28 +1,28 @@
/*
* #%L
* Alfresco Solr Client
* %%
* Copyright (C) 2005 - 2016 Alfresco Software Limited
* %%
* This file is part of the Alfresco software.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
/*
* #%L
* Alfresco Solr Client
* %%
* Copyright (C) 2005 - 2016 Alfresco Software Limited
* %%
* This file is part of the Alfresco software.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
package org.alfresco.solr.client;
import java.util.ArrayList;
@@ -35,17 +35,15 @@ import java.util.List;
*/
public class MultiPropertyValue extends PropertyValue
{
private List<PropertyValue> values;
private final List<PropertyValue> values;
public MultiPropertyValue()
{
super();
this.values = new ArrayList<PropertyValue>(10);
this.values = new ArrayList<>();
}
public MultiPropertyValue(List<PropertyValue> values)
{
super();
this.values = values;
}
@@ -64,4 +62,4 @@ public class MultiPropertyValue extends PropertyValue
{
return "MultiPropertyValue [values=" + values + "]";
}
}
}