package com.silverforge.elasticsearchrawclient.utils;
import com.silverforge.elasticsearchrawclient.model.GeoPoint;
import com.silverforge.elasticsearchrawclient.model.QueryTypeItem;
import com.silverforge.elasticsearchrawclient.definition.Functionable;
import com.silverforge.elasticsearchrawclient.definition.MultiTermQueryable;
import com.silverforge.elasticsearchrawclient.definition.Queryable;
import com.silverforge.elasticsearchrawclient.definition.Sortable;
import com.silverforge.elasticsearchrawclient.definition.SpanQueryable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import static br.com.zbra.androidlinq.Linq.stream;
public class QueryTypeArrayList<T extends QueryTypeItem>
extends ArrayList<T> {
public boolean containsKey(String fieldName) {
boolean retValue = false;
Iterator<T> iterator = iterator();
if (size() > 0) {
while (iterator.hasNext()) {
T item = iterator.next();
if (item.getName().toLowerCase().equals(fieldName.toLowerCase())) {
retValue = true;
break;
}
}
}
return retValue;
}
public T getByKey(String fieldName) {
T retValue = null;
Iterator<T> iterator = iterator();
if (size() > 0) {
while (iterator.hasNext()) {
T item = iterator.next();
if (item.getName().toLowerCase().equals(fieldName.toLowerCase())) {
retValue = item;
break;
}
}
}
return retValue;
}
public boolean hasKeys(String... keys) {
boolean hasValues = false;
HashMap<String, Boolean> wordCheckTable = new HashMap<>();
for (String word : keys) {
wordCheckTable.put(word, false);
}
Iterator<T> iterator = iterator();
if (size() > 0) {
while (iterator.hasNext()) {
T item = iterator.next();
for (Map.Entry<String, Boolean> entry : wordCheckTable.entrySet()) {
if (item.getName().equals(entry.getKey()))
entry.setValue(true);
}
}
hasValues = !wordCheckTable.containsValue(false);
}
return hasValues;
}
public boolean hasAtLeastOneKey(String... keys) {
boolean hasValues = false;
HashMap<String, Boolean> wordCheckTable = new HashMap<>();
for (String word : keys) {
wordCheckTable.put(word, false);
}
Iterator<T> iterator = iterator();
if (size() > 0) {
while (iterator.hasNext()) {
T item = iterator.next();
for (Map.Entry<String, Boolean> entry : wordCheckTable.entrySet()) {
if (item.getName().equals(entry.getKey()))
entry.setValue(true);
}
}
hasValues = wordCheckTable.containsValue(true);
}
return hasValues;
}
@SuppressWarnings("unchecked")
public void addParentItem(String key, String value) {
if (!containsKey(key))
add((T) T
.builder()
.name(key)
.value(StringUtils.ensureNotNull(value))
.isParent(true)
.build());
}
@SuppressWarnings("unchecked")
public void addItem(String key, String value) {
if (!containsKey(key))
add((T) T
.builder()
.name(key)
.value(StringUtils.ensureNotNull(value))
.build());
}
@SuppressWarnings("unchecked")
public void addItem(String key, boolean value) {
if (!containsKey(key))
add((T) T
.builder()
.name(key)
.value(BooleanUtils.booleanValue(value))
.build());
}
@SuppressWarnings("unchecked")
public void addItem(String key, byte value) {
if (!containsKey(key))
add((T) T
.builder()
.name(key)
.value(Byte.toString(value))
.build());
}
@SuppressWarnings("unchecked")
public void addItem(String key, short value) {
if (!containsKey(key))
add((T) T
.builder()
.name(key)
.value(Short.toString(value))
.build());
}
@SuppressWarnings("unchecked")
public void addItem(String key, int value) {
if (!containsKey(key))
add((T) T
.builder()
.name(key)
.value(Integer.toString(value))
.build());
}
@SuppressWarnings("unchecked")
public void addItem(String key, long value) {
if (!containsKey(key))
add((T) T
.builder()
.name(key)
.value(Long.toString(value))
.build());
}
@SuppressWarnings("unchecked")
public void addItem(String key, float value) {
if (!containsKey(key))
add((T) T
.builder()
.name(key)
.value(Float.toString(value))
.build());
}
@SuppressWarnings("unchecked")
public void addItem(String key, double value) {
if (!containsKey(key))
add((T) T
.builder()
.name(key)
.value(Double.toString(value))
.build());
}
@SuppressWarnings("unchecked")
public void addItem(String key, String... values) {
if (values != null && values.length > 0 && !containsKey(key)) {
List<String> valuesList = new ArrayList<>();
for(String i : values) {
valuesList.add(i);
}
add((T) T
.builder()
.name(key)
.value(valuesList.toString())
.build());
}
}
@SuppressWarnings("unchecked")
public void addItem(String key, Date value, String format) {
if (!containsKey(key)) {
SimpleDateFormat formatter = new SimpleDateFormat(format);
add((T) T
.builder()
.name(key)
.value(formatter.format(value))
.build());
}
}
@SuppressWarnings("unchecked")
public void addItem(String key, GeoPoint geoPoint) {
if (!containsKey(key)) {
String value = String.format("[%s,%s]", geoPoint.getLongitude(), geoPoint.getLatitude());
add((T) T
.builder()
.name(key)
.value(value)
.build());
}
}
@SuppressWarnings("unchecked")
public void addItem(String key, GeoPoint... geoPoints) {
if (!containsKey(key)) {
List<String> geoPointStrings = stream(geoPoints)
.select(gp -> String.format("[%s,%s]", gp.getLongitude(), gp.getLatitude()))
.toList();
String value = "[" + StringUtils.makeCommaSeparatedList(geoPointStrings) + "]";
add((T) T
.builder()
.name(key)
.value(value)
.build());
}
}
@SuppressWarnings("unchecked")
public void addItem(String key, Queryable value) {
if (value != null && !containsKey(key)) {
add((T) T
.builder()
.name(key)
.value(value.getQueryString())
.build());
}
}
@SuppressWarnings("unchecked")
public void addItem(String key, SpanQueryable value) {
if (value != null && !containsKey(key)) {
add((T) T
.builder()
.name(key)
.value(value.getQueryString())
.build());
}
}
@SuppressWarnings("unchecked")
public void addItem(String key, MultiTermQueryable value) {
if (value != null && !containsKey(key)) {
add((T) T
.builder()
.name(key)
.value(value.getQueryString())
.build());
}
}
@SuppressWarnings("unchecked")
public void addItem(String key, Queryable... values) {
if (values != null && values.length > 0 && !containsKey(key)) {
String[] queries = stream(values)
.select(q -> q.getQueryString())
.toList()
.toArray(new String[]{});
String joinedQueries = StringUtils.makeCommaSeparatedList(queries);
add((T) T
.builder()
.name(key)
.value("[" + joinedQueries + "]")
.build());
}
}
@SuppressWarnings("unchecked")
public void addItem(String key, SpanQueryable... values) {
if (values != null && values.length > 0 && !containsKey(key)) {
String[] queries = stream(values)
.select(q -> q.getQueryString())
.toList()
.toArray(new String[]{});
String joinedQueries = StringUtils.makeCommaSeparatedList(queries);
add((T) T
.builder()
.name(key)
.value("[" + joinedQueries + "]")
.build());
}
}
@SuppressWarnings("unchecked")
public void addItem(String key, Functionable value) {
if (value != null && !containsKey(key)) {
add((T) T
.builder()
.name(key)
.value(value.getFunctionString())
.build());
}
}
@SuppressWarnings("unchecked")
public void addItem(String key, Functionable... values) {
if (values != null && values.length > 0 && !containsKey(key)) {
String[] queries = stream(values)
.select(q -> q.getFunctionString())
.toList()
.toArray(new String[]{});
String joinedQueries = StringUtils.makeCommaSeparatedList(queries);
add((T) T
.builder()
.name(key)
.value("[" + joinedQueries + "]")
.build());
}
}
@SuppressWarnings("unchecked")
public void addItemsWithParenthesis(String key, String... values) {
if (values != null && values.length > 0 && !containsKey(key)) {
String joinedQueries = StringUtils.makeCommaSeparatedListWithQuotationMark(values);
add((T) T
.builder()
.name(key)
.value("[" + joinedQueries + "]")
.build());
}
}
@SuppressWarnings("unchecked")
public void addItem(String key, Map<String, ?> value) {
if (value != null && value.size() > 0 && !containsKey(key)) {
String[] params = stream(value)
.select(q -> q.getKey() + "\"" + ":" + "\"" + q.getValue())
.toList()
.toArray(new String[]{});
String joinedParams = StringUtils.makeCommaSeparatedListWithQuotationMark(params);
add((T) T
.builder()
.name(key)
.value("{" + joinedParams + "}")
.build());
}
}
@SuppressWarnings("unchecked")
public void addPercentageItem(String key, int value) {
if (!containsKey(key))
add((T) T
.builder()
.name(key)
.value(value + "%")
.build());
}
@SuppressWarnings("unchecked")
public void addPercentageItem(String key, float value) {
if (!containsKey(key)) {
String percentage = (value * 100) + "%";
add((T) T
.builder()
.name(key)
.value(percentage)
.build());
}
}
@SuppressWarnings("unchecked")
public void addItem(String key, Sortable sortable) {
if (!containsKey(key)) {
add((T) T
.builder()
.name(key)
.value(sortable.getSortableQuery())
.build());
}
}
@SuppressWarnings("unchecked")
public void addItem(String key, Sortable... sortables) {
if (sortables != null && sortables.length > 0 && !containsKey(key)) {
String[] queries = stream(sortables)
.select(q -> q.getSortableQuery())
.toList()
.toArray(new String[]{});
String joinedQueries = StringUtils.makeCommaSeparatedList(queries);
add((T) T
.builder()
.name(key)
.value("[" + joinedQueries + "]")
.build());
}
}
}