package ru.yandex.market.graphouse.search.tree;
import com.google.common.cache.LoadingCache;
import ru.yandex.market.graphouse.search.MetricStatus;
import java.util.Map;
/**
* @author Dmitry Andreev <a href="mailto:AndreevDm@yandex-team.ru"></a>
* @date 25/01/2017
*/
public class LoadableMetricDir extends MetricDir {
private final LoadingCache<MetricDir, DirContent> dirContentProvider;
public LoadableMetricDir(MetricDir parent, String name, MetricStatus status,
LoadingCache<MetricDir, DirContent> dirContentProvider) {
super(parent, name, status);
this.dirContentProvider = dirContentProvider;
}
private DirContent getContent() {
return dirContentProvider.getUnchecked(this);
}
private DirContent getContentOrEmpty() {
DirContent content = dirContentProvider.getIfPresent(this);
return (content == null) ? DirContent.EMPTY : content;
}
@Override
public Map<String, MetricDir> getDirs() {
return getContent().getDirs();
}
@Override
public Map<String, MetricName> getMetrics() {
return getContent().getMetrics();
}
@Override
public boolean hasDirs() {
return !getDirs().isEmpty();
}
@Override
public boolean hasMetrics() {
return !getMetrics().isEmpty();
}
@Override
public MetricDir maybeGetDir(String name) {
return getContentOrEmpty().getDirs().get(name);
}
@Override
public MetricName maybeGetMetric(String name) {
return getContentOrEmpty().getMetrics().get(name);
}
@Override
public int loadedMetricCount() {
DirContent dirContent = getContentOrEmpty();
int count = dirContent.getMetrics().size();
for (MetricDir metricDir : dirContent.getDirs().values()) {
count += metricDir.loadedMetricCount();
}
return count;
}
@Override
public int loadedDirCount() {
DirContent dirContent = getContentOrEmpty();
int count = dirContent.getDirs().size();
for (MetricDir metricDir : dirContent.getDirs().values()) {
count += metricDir.loadedDirCount();
}
return count;
}
}