/* * Copyright 2015 Hewlett-Packard Development Company, L.P. * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. */ package com.hp.autonomy.frontend.find.core.savedsearches; import com.hp.autonomy.aci.content.fieldtext.FieldText; import com.hp.autonomy.aci.content.fieldtext.MATCH; import com.hp.autonomy.aci.content.fieldtext.NRANGE; import com.hp.autonomy.aci.content.fieldtext.RANGE; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Component; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @Component public class FieldTextParserImpl implements FieldTextParser { // WARNING: This logic is duplicated in the client side SelectedValuesCollection @Override public String toFieldText(final SavedSearch<?, ?> savedSearch) { final Set<FieldAndValue> parametricValues = savedSearch.getParametricValues(); final Set<ParametricRange> parametricRanges = savedSearch.getParametricRanges(); final FieldText valuesFieldText = valuesToFieldText(parametricValues); final FieldText rangesFieldText = rangesToFieldText(parametricRanges); if (valuesFieldText == null && rangesFieldText == null) { return ""; } return (valuesFieldText != null && rangesFieldText != null ? valuesFieldText.AND(rangesFieldText) : valuesFieldText != null ? valuesFieldText : rangesFieldText).toString(); } private FieldText valuesToFieldText(final Collection<FieldAndValue> parametricValues) { if (CollectionUtils.isEmpty(parametricValues)) { return null; } else { final Map<String, List<String>> fieldToValues = new HashMap<>(); for (final FieldAndValue fieldAndValue : parametricValues) { final List<String> values = fieldToValues.computeIfAbsent(fieldAndValue.getField(), key -> new LinkedList<>()); values.add(fieldAndValue.getValue()); } final Iterator<Map.Entry<String, List<String>>> iterator = fieldToValues.entrySet().iterator(); FieldText fieldText = fieldAndValuesToFieldText(iterator.next()); while (iterator.hasNext()) { fieldText = fieldText.AND(fieldAndValuesToFieldText(iterator.next())); } return fieldText; } } private FieldText rangesToFieldText(final Collection<ParametricRange> parametricRanges) { if (CollectionUtils.isEmpty(parametricRanges)) { return null; } else { final Iterator<ParametricRange> iterator = parametricRanges.iterator(); FieldText fieldText = rangeToFieldText(iterator.next()); while (iterator.hasNext()) { fieldText = fieldText.AND(rangeToFieldText(iterator.next())); } return fieldText; } } private FieldText fieldAndValuesToFieldText(final Map.Entry<String, List<String>> fieldAndValues) { return new MATCH(fieldAndValues.getKey(), fieldAndValues.getValue()); } private FieldText rangeToFieldText(final ParametricRange range) { FieldText fieldText = null; switch (range.getType()) { case Date: // RANGE.Type.EPOCH expects milliseconds // Cast to long as they should be timestamps fieldText = new RANGE(range.getField(), (long) range.getMin() * 1000, (long) range.getMax() * 1000, RANGE.Type.EPOCH); break; case Numeric: fieldText = new NRANGE(range.getField(), range.getMin(), range.getMax()); break; } return fieldText; } }