Skip to content

Commit

Permalink
Added GroupByTransformerAggregator.
Browse files Browse the repository at this point in the history
  • Loading branch information
jsabin committed Feb 22, 2023
1 parent bd830d0 commit a6799c1
Show file tree
Hide file tree
Showing 3 changed files with 142 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
package org.kairosdb.aggregator;


import com.google.inject.Inject;
import org.kairosdb.core.DataPoint;
import org.kairosdb.core.annotation.FeatureComponent;
import org.kairosdb.core.annotation.FeatureProperty;
import org.kairosdb.core.datastore.DataPointGroup;
import org.kairosdb.core.groupby.GroupByResult;
import org.kairosdb.core.groupby.TagGroupByResult;
import org.kairosdb.plugin.Aggregator;

import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.function.BiFunction;
import java.util.stream.Collectors;


@FeatureComponent(
name = "group_by_transformer",
description = "Uppercase or lowercase groupBy values."
)
public class GroupByTransformerAggregator implements Aggregator {
@Inject
public GroupByTransformerAggregator() {
}

@FeatureProperty(
name = "action",
label = "Action",
description = "Action to perform. Options are lowercase or uppercase.",
default_value = "lowercase"
)
private String action = "";

@FeatureProperty(
name = "tag_names",
label = "Tag Names",
description = "List of tag names that the action will be performed on."
) private List<String> tagNames = Collections.emptyList();

private final BiFunction<String, String, String> toLowercase = (key, value) -> tagNames.contains(key) ? value.toLowerCase() : value;
private final BiFunction<String, String, String> toUppercase = (key, value) -> tagNames.contains(key) ? value.toUpperCase() : value;
private BiFunction<String, String, String> actionFunction = toLowercase;

@SuppressWarnings("unused")
public void setAction(String action) {
this.action = action;
actionFunction = "lowercase".equalsIgnoreCase(action) ? toLowercase : toUppercase;
}

@SuppressWarnings("unused")
public void setTagNames(List<String> tagNames) {
this.tagNames = tagNames;
}

@Override
public DataPointGroup aggregate(DataPointGroup dataPointGroup) {
if (!action.isEmpty() && tagNames.isEmpty()) {
throw new IllegalArgumentException("TagNames cannot be empty");
}
var groupBys = dataPointGroup.getGroupByResult();
var modifiedGroupBys = groupBys.stream().map(this::convert).collect(Collectors.toList());
return new GroupByDataPointGroup(dataPointGroup, modifiedGroupBys);
}

private GroupByResult convert(GroupByResult groupBy) {
if (groupBy instanceof TagGroupByResult) {
var tagGroupBy = (TagGroupByResult) groupBy;
tagGroupBy.getTagResults().replaceAll(actionFunction);
return tagGroupBy;
} else {
return groupBy;
}
}

@Override
public boolean canAggregate(String groupType) {
return true;
}

@Override
public String getAggregatedGroupType(String s) {
return null;
}

@Override
public void init() {
}

private static class GroupByDataPointGroup implements DataPointGroup {
private final List<GroupByResult> groupByResults;
private final DataPointGroup dataPointGroup;

public GroupByDataPointGroup(DataPointGroup dataPointGroup, List<GroupByResult> groupByResults) {
this.groupByResults = groupByResults;
this.dataPointGroup = dataPointGroup;
}

@Override
public String getName() {
return dataPointGroup.getName();
}

@Override
public List<GroupByResult> getGroupByResult() {
return groupByResults;
}

@Override
public void close() {
dataPointGroup.close();
}

@Override
public boolean hasNext() {
return dataPointGroup.hasNext();
}

@Override
public DataPoint next() {
return dataPointGroup.next();
}

@Override
public Set<String> getTagNames() {
return dataPointGroup.getTagNames();
}

@Override
public Set<String> getTagValues(String s) {
return dataPointGroup.getTagValues(s);
}
}
}
5 changes: 4 additions & 1 deletion src/main/java/org/kairosdb/csvconverter/CsvConverter.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,10 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Collection;
import java.util.Date;
import java.util.TimeZone;
import java.util.TreeMap;

@PluginName(name = "CsvConverter", description = "Converts response JSON to CSV format")
public class CsvConverter implements QueryPostProcessingPlugin {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@
package org.kairosdb.csvconverter;

import com.google.inject.AbstractModule;
import org.kairosdb.aggregator.GroupByTransformerAggregator;

@SuppressWarnings("unused")
public class CsvConverterModule extends AbstractModule {

@Override
protected void configure() {
bind(CsvConverter.class);
bind(GroupByTransformerAggregator.class);
}
}

0 comments on commit a6799c1

Please sign in to comment.