package com.insightfullogic.honest_profiler.core.aggregation.grouping;
import java.util.function.Function;
import com.insightfullogic.honest_profiler.core.profiles.lean.LeanThreadNode;
/**
* A ThreadGrouping describes how a collection of {@link LeanThreadNode}s describing thread-level aggregations can be
* partitioned for aggregation. The grouping maps each {@link LeanThreadNode} to a String key, and
* {@link LeanThreadNode}s with the same key will be aggregated together.
* <p>
* Every ThreadGrouping contains a name for front-end display purposes, and wraps a {@link Function} which maps an a
* {@link LeanThreadNode} to the String key.
*/
public enum ThreadGrouping implements Function<LeanThreadNode, String>
{
/**
* Group all threads together into a single group.
*/
ALL_TOGETHER("All threads", node -> "All Threads"),
/**
* Group threads by Thread name.
*/
BY_NAME("By name", node -> node.getThreadInfo() == null || node.getThreadInfo().getName() == null || node.getThreadInfo().getName().isEmpty() ? "Unknown Thread(s)" : node.getThreadInfo().getName()),
/**
* Group threads by Thread Id. This is more specific than by name, since several threads in aggregations can have
* the same name (e.g. in Diffs).
*/
BY_ID("By ID", node -> node.getThreadInfo() == null ? "Unknown Thread <Unknown ID>" : node.getThreadInfo().getIdentification());
// Instance Properties
private String name;
private Function<LeanThreadNode, String> function;
// Instance Constructors
private ThreadGrouping(String name, Function<LeanThreadNode, String> function)
{
this.name = name;
this.function = function;
}
// Function Implementation
@Override
public String apply(LeanThreadNode node)
{
return function.apply(node);
}
@Override
public String toString()
{
return this.name;
}
}