package com.constellio.model.services.schemas.calculators;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.constellio.data.utils.AccentApostropheCleaner;
import com.constellio.model.entities.calculators.CalculatorParameters;
import com.constellio.model.entities.calculators.DynamicDependencyValues;
import com.constellio.model.entities.calculators.MetadataValueCalculator;
import com.constellio.model.entities.calculators.dependencies.Dependency;
import com.constellio.model.entities.calculators.dependencies.DynamicLocalDependency;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataValueType;
public class AutocompleteFieldCalculator implements MetadataValueCalculator<List<String>> {
DynamicLocalDependency autocompleteMetadatasDependency = new LocalAutocompleteMetadatasDependency();
@Override
public List<String> calculate(CalculatorParameters parameters) {
Set<String> words = new HashSet<>();
splitInLowerCasedTermsRemovingAccents(words, parameters.get(autocompleteMetadatasDependency));
List<String> returnedWords = new ArrayList<>(words);
Collections.sort(returnedWords);
return returnedWords;
}
public static void splitInLowerCasedTermsRemovingAccents(Set<String> words,
DynamicDependencyValues autocompleteMetadatasValues) {
for (Metadata metadata : autocompleteMetadatasValues.getAvailableMetadatasWithAValue().onlySchemaAutocomplete()) {
splitInLowerCasedTermsRemovingAccents(words, autocompleteMetadatasValues.getValue(metadata));
}
}
public static void splitInLowerCasedTermsRemovingAccents(Set<String> words, Object value) {
if (value instanceof List) {
for (String item : (List<String>) value) {
splitInLowerCasedTermsRemovingAccents(words, item);
}
} else if (value instanceof String) {
splitInLowerCasedTermsRemovingAccents(words, (String) value);
}
}
public static void splitInLowerCasedTermsRemovingAccents(Set<String> words, String value) {
if (value != null) {
String cleanedValue = AccentApostropheCleaner.removeAccents(value).toLowerCase();
for (String word : cleanedValue.split(" ")) {
words.add(word);
}
}
}
@Override
public List<String> getDefaultValue() {
return new ArrayList<>();
}
@Override
public MetadataValueType getReturnType() {
return MetadataValueType.STRING;
}
@Override
public boolean isMultiValue() {
return true;
}
@Override
public List<? extends Dependency> getDependencies() {
return asList(autocompleteMetadatasDependency);
}
public static class LocalAutocompleteMetadatasDependency extends DynamicLocalDependency {
@Override
public boolean isDependentOf(Metadata metadata) {
return metadata.isSchemaAutocomplete() && metadata.getType().isStringOrText();
}
@Override
public boolean isIncludingGlobalMetadatas() {
return true;
}
}
}