/**
* Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT
* All rights reserved. Use is subject to license terms. See LICENSE.TXT
*/
package org.diirt.datasource.expression;
import org.diirt.datasource.ReadFunction;
import org.diirt.datasource.QueueCollector;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* A function that takes a set of inputs and transforms them in a new map.
*
* @author carcassi
*/
class MapOfReadFunction<T> implements ReadFunction<Map<String, T>> {
private final Map<String, ReadFunction<T>> functions = new HashMap<>();
private final QueueCollector<MapUpdate<T>> mapUpdateCollector;
private Map<String, T> previousValue;
public MapOfReadFunction(QueueCollector<MapUpdate<T>> mapUpdateCollector) {
this.mapUpdateCollector = mapUpdateCollector;
}
@Override
public Map<String, T> readValue() {
for (MapUpdate<T> mapUpdate : mapUpdateCollector.readValue()) {
for (String name : mapUpdate.getExpressionsToDelete()) {
functions.remove(name);
}
functions.putAll(mapUpdate.getReadFunctionsToAdd());
previousValue = null;
}
Map<String, T> map = new HashMap<String, T>();
for (Map.Entry<String, ReadFunction<T>> entry : functions.entrySet()) {
String name = entry.getKey();
T value = entry.getValue().readValue();
if (value != null) {
map.put(name, value);
}
}
if (Objects.equals(previousValue, map)) {
return previousValue;
}
previousValue = map;
return map;
}
public QueueCollector<MapUpdate<T>> getMapUpdateCollector() {
return mapUpdateCollector;
}
}