import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.function.Function;
import org.eclipse.core.runtime.IProgressMonitor;
* Abstract analysis to build statistics data for a segment store
*
* @author Jean-Christian Kouame
+ * @since 3.0
*/
public abstract class AbstractSegmentStatisticsAnalysis extends TmfAbstractAnalysisModule {
return calculateTotalManual(store, monitor);
}
- /**
- * Get the total statistics for a specific range. If the range start is
- * TmfTimeRange.ETERNITY.getStartTime().toNanos() and the range end is
- * TmfTimeRange.ETERNITY.getEndTime().toNanos(), it will return the
- * statistics for the whole trace.
- *
- * @param start
- * The start time of the range
- * @param end
- * The end time of the range
- * @param monitor
- * The progress monitor
- * @return The total statistics, or null if segment store is not valid or if
- * the request is canceled
- * @since 1.2
- * @deprecated use {@link #getStatsForRange(long, long, IProgressMonitor)} instead
- */
- @Deprecated
- public @Nullable SegmentStoreStatistics getTotalStatsForRange(long start, long end, IProgressMonitor monitor) {
- IStatistics<@NonNull ISegment> stats = getStatsForRange(start, end, monitor);
- return (stats == null) ? null : new SegmentStoreStatistics(stats);
- }
-
/**
* Get the total statistics for a specific range. If the range start is
* TmfTimeRange.ETERNITY.getStartTime().toNanos() and the range end is
return calculateTotalPerType(store, monitor);
}
- /**
- * Get the per segment type statistics for a specific range. If the range
- * start is TmfTimeRange.ETERNITY.getStartTime().toNanos() and the range end
- * is TmfTimeRange.ETERNITY.getEndTime().toNanos(), it will return the
- * statistics for the whole trace.
- *
- * @param start
- * The start time of the range
- * @param end
- * The end time of the range
- * @param monitor
- * The progress monitor
- * @return The per segment type statistics, or null if segment store is not
- * valid or if the request is canceled
- * @since 1.2
- * @deprecated use {@link #getStatsPerTypeForRange(long, long, IProgressMonitor)} instead
- */
- @Deprecated
- public @Nullable Map<String, SegmentStoreStatistics> getPerSegmentTypeStatsForRange(long start, long end, IProgressMonitor monitor) {
- Map<String, IStatistics<ISegment>> stats = getStatsPerTypeForRange(start, end, monitor);
- Map<String, SegmentStoreStatistics> map = new HashMap<>();
- for (Entry<String, IStatistics<ISegment>> entry : stats.entrySet()) {
- map.put(entry.getKey(), new SegmentStoreStatistics(entry.getValue()));
- }
- return map;
- }
-
/**
* Get the per segment type statistics for a specific range. If the range
* start is TmfTimeRange.ETERNITY.getStartTime().toNanos() and the range end
protected void canceling() {
}
- /**
- * The total statistics
- *
- * @return the total statistics
- * @deprecated use {@link #getStatsTotal()} instead
- */
- @Deprecated
- public @Nullable SegmentStoreStatistics getTotalStats() {
- IStatistics<@NonNull ISegment> totalStats = fTotalStats;
- return totalStats == null ? null : new SegmentStoreStatistics(totalStats);
- }
-
/**
* Get the statistics for the full segment store
*
return fTotalStats;
}
- /**
- * The per syscall statistics
- *
- * @return the per syscall statistics
- * @deprecated use {@link #getStatsPerType()} instead
- */
- @Deprecated
- public @Nullable Map<String, SegmentStoreStatistics> getPerSegmentTypeStats() {
- Map<String, SegmentStoreStatistics> map = new HashMap<>();
- for (Entry<String, IStatistics<ISegment>> entry : fPerSegmentTypeStats.entrySet()) {
- map.put(entry.getKey(), new SegmentStoreStatistics(entry.getValue()));
- }
- return map;
- }
-
/**
* Get the statistics for each type of segment in this segment store
*
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2015, 2016 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Bernd Hufmann - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.tracecompass.analysis.timing.core.segmentstore.statistics;
-
-import org.eclipse.tracecompass.analysis.timing.core.statistics.IStatistics;
-import org.eclipse.tracecompass.analysis.timing.core.statistics.Statistics;
-import org.eclipse.tracecompass.segmentstore.core.BasicSegment;
-import org.eclipse.tracecompass.segmentstore.core.ISegment;
-
-/**
- * Class to calculate simple segment store statistics (min, max, average)
- *
- * @author Bernd Hufmann
- * @deprecated Use {@link IStatistics} instead
- */
-@Deprecated
-public class SegmentStoreStatistics {
-
- private static final ISegment MIN_SEGMENT = new BasicSegment(0, Long.MAX_VALUE);
- private static final ISegment MAX_SEGMENT = new BasicSegment(Long.MIN_VALUE, 0);
-
- private final IStatistics<ISegment> fStatistics;
-
- /**
- * Constructor
- */
- public SegmentStoreStatistics() {
- fStatistics = new Statistics<>(s -> s.getLength());
- }
-
- /**
- * Constructor
- *
- * @param stats The statistics object
- * @since 1.3
- */
- public SegmentStoreStatistics(IStatistics<ISegment> stats) {
- fStatistics = stats;
- }
-
- /**
- * Get minimum value
- *
- * @return minimum value
- * @since 1.2
- */
- public long getMin() {
- return fStatistics.getMin();
- }
-
- /**
- * Get maximum value
- *
- * @return maximum value
- */
- public long getMax() {
- return fStatistics.getMax();
- }
-
- /**
- * Get segment with minimum length
- *
- * @return segment with minimum length
- */
- public ISegment getMinSegment() {
- ISegment minObject = fStatistics.getMinObject();
- return minObject == null ? MIN_SEGMENT : minObject;
- }
-
- /**
- * Get segment with maximum length
- *
- * @return segment with maximum length
- */
- public ISegment getMaxSegment() {
- ISegment maxObject = fStatistics.getMaxObject();
- return maxObject == null ? MAX_SEGMENT : maxObject;
- }
-
- /**
- * Get number of segments analyzed
- *
- * @return number of segments analyzed
- */
- public long getNbSegments() {
- return fStatistics.getNbElements();
- }
-
- /**
- * Gets the arithmetic average
- *
- * @return arithmetic average
- */
- public double getAverage() {
- return fStatistics.getMean();
- }
-
- /**
- * Gets the standard deviation of the segments, uses the online algorithm
- * shown here <a href=
- * "https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Online_algorithm">
- * Wikipedia article of dec 3 2015 </a>
- *
- * @return the standard deviation of the segment store, will return NaN if
- * there are less than 3 elements
- */
- public double getStdDev() {
- return fStatistics.getStdDev();
- }
-
- /**
- * Get total value
- *
- * @return total value
- * @since 1.1
- */
- public double getTotal() {
- return fStatistics.getTotal();
- }
-
- /**
- * Update the statistics based on a given segment
- * <p>
- * This is an online algorithm and must retain a complexity of O(1)
- *
- * @param segment
- * the segment used for the update
- */
- public void update(ISegment segment) {
- fStatistics.update(segment);
- }
-
- /**
- * Merge two statistics sets. If the pools are large, there may be a slight
- * approximation error (empirically, the error is at most 0.001 but usually
- * around 1e-5 for the standard deviation as this uses pooled variance.
- *
- * @param other
- * The other segment store statistics
- * @since 1.2
- */
- public void merge(SegmentStoreStatistics other) {
- fStatistics.merge(other.getStatObject());
- }
-
- private IStatistics<ISegment> getStatObject() {
- return fStatistics;
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2015, 2016 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Bernd Hufmann - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.statistics;
-
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.jface.action.Action;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.tracecompass.common.core.NonNullUtils;
-import org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.ExportToTsvAction;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
-import org.eclipse.tracecompass.tmf.ui.views.TmfView;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Joiner;
-
-/**
- * Abstract view to to be extended to display segment store statistics.
- *
- * @author Bernd Hufmann
- * @deprecated use {@link AbstractSegmentsStatisticsView} instead
- */
-@Deprecated
-public abstract class AbstractSegmentStoreStatisticsView extends TmfView {
-
- private final Action fExportAction = new ExportToTsvAction() {
- @Override
- protected void exportToTsv(@Nullable OutputStream stream) {
- AbstractSegmentStoreStatisticsView.this.exportToTsv(stream);
- }
-
- @Override
- protected @Nullable Shell getShell() {
- return getViewSite().getShell();
- }
-
- };
-
- private @Nullable AbstractSegmentStoreStatisticsViewer fStatsViewer = null;
-
- /**
- * Constructor
- */
- public AbstractSegmentStoreStatisticsView() {
- super("StatisticsView"); //$NON-NLS-1$
- }
-
- @Override
- public void createPartControl(@Nullable Composite parent) {
- super.createPartControl(parent);
- AbstractSegmentStoreStatisticsViewer statsViewer = createSegmentStoreStatisticsViewer(NonNullUtils.checkNotNull(parent));
- ITmfTrace trace = TmfTraceManager.getInstance().getActiveTrace();
- if (trace != null) {
- statsViewer.loadTrace(trace);
- }
- fStatsViewer = statsViewer;
- getViewSite().getActionBars().getMenuManager().add(fExportAction);
- }
-
- @Override
- public void setFocus() {
- AbstractSegmentStoreStatisticsViewer statsViewer = fStatsViewer;
- if (statsViewer != null) {
- statsViewer.getControl().setFocus();
- }
- }
-
- @Override
- public void dispose() {
- super.dispose();
- AbstractSegmentStoreStatisticsViewer statsViewer = fStatsViewer;
- if (statsViewer != null) {
- statsViewer.dispose();
- }
- }
-
- /**
- * Creates a segment store statistics viewer instance.
- *
- * @param parent
- * the parent composite to create the viewer in.
- * @return the latency statistics viewer implementation
- */
- protected abstract AbstractSegmentStoreStatisticsViewer createSegmentStoreStatisticsViewer(Composite parent);
-
- /**
- * Export a given items's TSV
- *
- * @param stream
- * an output stream to write the TSV to
- * @since 1.2
- */
- @VisibleForTesting
- protected void exportToTsv(@Nullable OutputStream stream) {
- try (PrintWriter pw = new PrintWriter(stream)) {
- AbstractSegmentStoreStatisticsViewer statsViewer = fStatsViewer;
- if (statsViewer == null) {
- return;
- }
- Tree tree = statsViewer.getTreeViewer().getTree();
- int size = tree.getItemCount();
- List<String> columns = new ArrayList<>();
- for (int i = 0; i < tree.getColumnCount(); i++) {
- String valueOf = String.valueOf(tree.getColumn(i).getText());
- if (valueOf.isEmpty() && i == tree.getColumnCount() - 1) {
- // Linux "feature", an invisible column is added at the end
- // with gtk2
- break;
- }
- columns.add(valueOf);
- }
- String join = Joiner.on('\t').skipNulls().join(columns);
- pw.println(join);
- for (int i = 0; i < size; i++) {
- TreeItem item = tree.getItem(i);
- printItem(pw, columns, item);
- }
- }
- }
-
- private void printItem(PrintWriter pw, List<String> columns, @Nullable TreeItem item) {
- if (item == null) {
- return;
- }
- List<String> data = new ArrayList<>();
- for (int col = 0; col < columns.size(); col++) {
- data.add(String.valueOf(item.getText(col)));
- }
- pw.println(Joiner.on('\t').join(data));
- for (TreeItem child : item.getItems()) {
- printItem(pw, columns, child);
- }
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2015, 2016 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Bernd Hufmann - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.statistics;
-
-import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
-
-import java.text.Format;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.tracecompass.analysis.timing.core.segmentstore.statistics.AbstractSegmentStatisticsAnalysis;
-import org.eclipse.tracecompass.analysis.timing.core.segmentstore.statistics.SegmentStoreStatistics;
-import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.SubSecondTimeWithUnitFormat;
-import org.eclipse.tracecompass.internal.analysis.timing.ui.Activator;
-import org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.statistics.Messages;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAbstractAnalysisModule;
-import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
-import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.AbstractTmfTreeViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.ITmfTreeColumnDataProvider;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.ITmfTreeViewerEntry;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.TmfTreeColumnData;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.TmfTreeViewerEntry;
-
-/**
- * An abstract tree viewer implementation for displaying segment store
- * statistics
- *
- * @author Bernd Hufmann
- * @deprecated use {@link AbstractSegmentsStatisticsViewer} instead
- */
-@Deprecated
-public abstract class AbstractSegmentStoreStatisticsViewer extends AbstractTmfTreeViewer {
-
- private static final Format FORMATTER = new SubSecondTimeWithUnitFormat();
-
- private @Nullable TmfAbstractAnalysisModule fModule;
- private MenuManager fTablePopupMenuManager;
-
- private static final String[] COLUMN_NAMES = new String[] {
- checkNotNull(Messages.SegmentStoreStatistics_LevelLabel),
- checkNotNull(Messages.SegmentStoreStatistics_Statistics_MinLabel),
- checkNotNull(Messages.SegmentStoreStatistics_MaxLabel),
- checkNotNull(Messages.SegmentStoreStatistics_AverageLabel),
- checkNotNull(Messages.SegmentStoreStatisticsViewer_StandardDeviation),
- checkNotNull(Messages.SegmentStoreStatisticsViewer_Count),
- checkNotNull(Messages.SegmentStoreStatisticsViewer_Total)
- };
-
- /**
- * Constructor
- *
- * @param parent
- * the parent composite
- */
- public AbstractSegmentStoreStatisticsViewer(Composite parent) {
- super(parent, false);
- setLabelProvider(new SegmentStoreStatisticsLabelProvider());
- fTablePopupMenuManager = new MenuManager();
- fTablePopupMenuManager.setRemoveAllWhenShown(true);
- fTablePopupMenuManager.addMenuListener(manager -> {
- TreeViewer viewer = getTreeViewer();
- ISelection selection = viewer.getSelection();
- if (selection instanceof IStructuredSelection) {
- IStructuredSelection sel = (IStructuredSelection) selection;
- if (manager != null) {
- appendToTablePopupMenu(manager, sel);
- }
- }
- });
- Menu tablePopup = fTablePopupMenuManager.createContextMenu(getTreeViewer().getTree());
- Tree tree = getTreeViewer().getTree();
- tree.setMenu(tablePopup);
- tree.addDisposeListener(e -> {
- if (fModule != null) {
- fModule.dispose();
- }
- });
- }
-
- /** Provides label for the Segment Store tree viewer cells */
- protected static class SegmentStoreStatisticsLabelProvider extends TreeLabelProvider {
-
- @Override
- public String getColumnText(@Nullable Object element, int columnIndex) {
- String value = ""; //$NON-NLS-1$
- if (element instanceof HiddenTreeViewerEntry) {
- if (columnIndex == 0) {
- value = ((HiddenTreeViewerEntry) element).getName();
- }
- } else if (element instanceof SegmentStoreStatisticsEntry) {
- SegmentStoreStatisticsEntry entry = (SegmentStoreStatisticsEntry) element;
- if (columnIndex == 0) {
- return String.valueOf(entry.getName());
- }
- if (entry.getEntry().getNbSegments() > 0) {
- if (columnIndex == 1) {
- value = toFormattedString(entry.getEntry().getMin());
- } else if (columnIndex == 2) {
- value = String.valueOf(toFormattedString(entry.getEntry().getMax()));
- } else if (columnIndex == 3) {
- value = String.valueOf(toFormattedString(entry.getEntry().getAverage()));
- } else if (columnIndex == 4) {
- value = String.valueOf(toFormattedString(entry.getEntry().getStdDev()));
- } else if (columnIndex == 5) {
- value = String.valueOf(entry.getEntry().getNbSegments());
- } else if (columnIndex == 6) {
- value = String.valueOf(toFormattedString(entry.getEntry().getTotal()));
- }
- }
- }
- return checkNotNull(value);
- }
- }
-
- /**
- * Creates the statistics analysis module
- *
- * @return the statistics analysis module
- */
- @Nullable
- protected abstract TmfAbstractAnalysisModule createStatisticsAnalysiModule();
-
- /**
- * Gets the statistics analysis module
- *
- * @return the statistics analysis module
- */
- @Nullable
- public TmfAbstractAnalysisModule getStatisticsAnalysisModule() {
- return fModule;
- }
-
- @Override
- protected ITmfTreeColumnDataProvider getColumnDataProvider() {
- return new ITmfTreeColumnDataProvider() {
-
- @Override
- public List<@Nullable TmfTreeColumnData> getColumnData() {
- /* All columns are sortable */
- List<@Nullable TmfTreeColumnData> columns = new ArrayList<>();
- TmfTreeColumnData column = new TmfTreeColumnData(COLUMN_NAMES[0]);
- column.setAlignment(SWT.RIGHT);
- column.setComparator(new ViewerComparator() {
- @Override
- public int compare(@Nullable Viewer viewer, @Nullable Object e1, @Nullable Object e2) {
- if ((e1 == null) || (e2 == null)) {
- return 0;
- }
-
- SegmentStoreStatisticsEntry n1 = (SegmentStoreStatisticsEntry) e1;
- SegmentStoreStatisticsEntry n2 = (SegmentStoreStatisticsEntry) e2;
-
- return n1.getName().compareTo(n2.getName());
-
- }
- });
- columns.add(column);
- column = new TmfTreeColumnData(COLUMN_NAMES[1]);
- column.setAlignment(SWT.RIGHT);
- column.setComparator(new ViewerComparator() {
- @Override
- public int compare(@Nullable Viewer viewer, @Nullable Object e1, @Nullable Object e2) {
- if ((e1 == null) || (e2 == null)) {
- return 0;
- }
-
- SegmentStoreStatisticsEntry n1 = (SegmentStoreStatisticsEntry) e1;
- SegmentStoreStatisticsEntry n2 = (SegmentStoreStatisticsEntry) e2;
-
- return Long.compare(n1.getEntry().getMin(), n2.getEntry().getMin());
-
- }
- });
- columns.add(column);
- column = new TmfTreeColumnData(COLUMN_NAMES[2]);
- column.setAlignment(SWT.RIGHT);
- column.setComparator(new ViewerComparator() {
- @Override
- public int compare(@Nullable Viewer viewer, @Nullable Object e1, @Nullable Object e2) {
- if ((e1 == null) || (e2 == null)) {
- return 0;
- }
-
- SegmentStoreStatisticsEntry n1 = (SegmentStoreStatisticsEntry) e1;
- SegmentStoreStatisticsEntry n2 = (SegmentStoreStatisticsEntry) e2;
-
- return Long.compare(n1.getEntry().getMax(), n2.getEntry().getMax());
-
- }
- });
- columns.add(column);
- column = new TmfTreeColumnData(COLUMN_NAMES[3]);
- column.setAlignment(SWT.RIGHT);
- column.setComparator(new ViewerComparator() {
- @Override
- public int compare(@Nullable Viewer viewer, @Nullable Object e1, @Nullable Object e2) {
- if ((e1 == null) || (e2 == null)) {
- return 0;
- }
-
- SegmentStoreStatisticsEntry n1 = (SegmentStoreStatisticsEntry) e1;
- SegmentStoreStatisticsEntry n2 = (SegmentStoreStatisticsEntry) e2;
-
- return Double.compare(n1.getEntry().getAverage(), n2.getEntry().getAverage());
-
- }
- });
- columns.add(column);
- column = new TmfTreeColumnData(COLUMN_NAMES[4]);
- column.setAlignment(SWT.RIGHT);
- column.setComparator(new ViewerComparator() {
- @Override
- public int compare(@Nullable Viewer viewer, @Nullable Object e1, @Nullable Object e2) {
- if ((e1 == null) || (e2 == null)) {
- return 0;
- }
-
- SegmentStoreStatisticsEntry n1 = (SegmentStoreStatisticsEntry) e1;
- SegmentStoreStatisticsEntry n2 = (SegmentStoreStatisticsEntry) e2;
-
- return Double.compare(n1.getEntry().getStdDev(), n2.getEntry().getStdDev());
-
- }
- });
- columns.add(column);
- column = new TmfTreeColumnData(COLUMN_NAMES[5]);
- column.setAlignment(SWT.RIGHT);
- column.setComparator(new ViewerComparator() {
- @Override
- public int compare(@Nullable Viewer viewer, @Nullable Object e1, @Nullable Object e2) {
- if ((e1 == null) || (e2 == null)) {
- return 0;
- }
-
- SegmentStoreStatisticsEntry n1 = (SegmentStoreStatisticsEntry) e1;
- SegmentStoreStatisticsEntry n2 = (SegmentStoreStatisticsEntry) e2;
-
- return Long.compare(n1.getEntry().getNbSegments(), n2.getEntry().getNbSegments());
-
- }
- });
- columns.add(column);
- column = new TmfTreeColumnData(COLUMN_NAMES[6]);
- column.setAlignment(SWT.RIGHT);
- column.setComparator(new ViewerComparator() {
- @Override
- public int compare(@Nullable Viewer viewer, @Nullable Object e1, @Nullable Object e2) {
- if ((e1 == null) || (e2 == null)) {
- return 0;
- }
-
- SegmentStoreStatisticsEntry n1 = (SegmentStoreStatisticsEntry) e1;
- SegmentStoreStatisticsEntry n2 = (SegmentStoreStatisticsEntry) e2;
-
- return Double.compare(n1.getEntry().getTotal(), n2.getEntry().getTotal());
-
- }
- });
- columns.add(column);
- column = new TmfTreeColumnData(""); //$NON-NLS-1$
- columns.add(column);
- return columns;
- }
-
- };
- }
-
- @Override
- public void initializeDataSource() {
- ITmfTrace trace = getTrace();
- if (trace != null) {
- TmfAbstractAnalysisModule module = createStatisticsAnalysiModule();
- if (module == null) {
- return;
- }
- try {
- module.setTrace(trace);
- module.schedule();
- if (fModule != null) {
- fModule.dispose();
- }
- fModule = module;
- } catch (TmfAnalysisException e) {
- Activator.getDefault().logError("Error initializing statistics analysis module", e); //$NON-NLS-1$
- }
- }
- }
-
- /**
- * Method to add commands to the context sensitive menu.
- *
- * @param manager
- * the menu manager
- * @param sel
- * the current selection
- */
- protected void appendToTablePopupMenu(IMenuManager manager, IStructuredSelection sel) {
- Object element = sel.getFirstElement();
- if ((element instanceof SegmentStoreStatisticsEntry) && !(element instanceof HiddenTreeViewerEntry)) {
- final SegmentStoreStatisticsEntry segment = (SegmentStoreStatisticsEntry) element;
- IAction gotoStartTime = new Action(Messages.SegmentStoreStatisticsViewer_GotoMinAction) {
- @Override
- public void run() {
- long start = segment.getEntry().getMinSegment().getStart();
- long end = segment.getEntry().getMinSegment().getEnd();
- broadcast(new TmfSelectionRangeUpdatedSignal(AbstractSegmentStoreStatisticsViewer.this, TmfTimestamp.fromNanos(start), TmfTimestamp.fromNanos(end)));
- updateContent(start, end, true);
- }
- };
-
- IAction gotoEndTime = new Action(Messages.SegmentStoreStatisticsViewer_GotoMaxAction) {
- @Override
- public void run() {
- long start = segment.getEntry().getMaxSegment().getStart();
- long end = segment.getEntry().getMaxSegment().getEnd();
- broadcast(new TmfSelectionRangeUpdatedSignal(AbstractSegmentStoreStatisticsViewer.this, TmfTimestamp.fromNanos(start), TmfTimestamp.fromNanos(end)));
- updateContent(start, end, true);
- }
- };
-
- manager.add(gotoStartTime);
- manager.add(gotoEndTime);
- }
- }
-
- /**
- * Formats a double value string
- *
- * @param value
- * a value to format
- * @return formatted value
- */
- protected static String toFormattedString(double value) {
- // The cast to long is needed because the formatter cannot truncate the
- // number.
- String percentageString = String.format("%s", FORMATTER.format(value)); //$NON-NLS-1$
- return percentageString;
- }
-
- /**
- * Class for defining an entry in the statistics tree.
- */
- protected class SegmentStoreStatisticsEntry extends TmfTreeViewerEntry {
-
- private final SegmentStoreStatistics fEntry;
-
- /**
- * Constructor
- *
- * @param name
- * name of entry
- *
- * @param entry
- * segment store statistics object
- */
- public SegmentStoreStatisticsEntry(String name, SegmentStoreStatistics entry) {
- super(name);
- fEntry = entry;
- }
-
- /**
- * Gets the statistics object
- *
- * @return statistics object
- */
- public SegmentStoreStatistics getEntry() {
- return fEntry;
- }
-
- }
-
- @Override
- protected @Nullable ITmfTreeViewerEntry updateElements(long start, long end, boolean isSelection) {
-
- TmfAbstractAnalysisModule analysisModule = getStatisticsAnalysisModule();
-
- if (getTrace() == null || !(analysisModule instanceof AbstractSegmentStatisticsAnalysis)) {
- return null;
- }
-
- AbstractSegmentStatisticsAnalysis module = (AbstractSegmentStatisticsAnalysis) analysisModule;
-
- module.waitForCompletion();
-
- TmfTreeViewerEntry root = new TmfTreeViewerEntry(""); //$NON-NLS-1$
- List<ITmfTreeViewerEntry> entryList = root.getChildren();
-
- if (isSelection) {
- setStats(start, end, entryList, module, true, new NullProgressMonitor());
- }
- setStats(start, end, entryList, module, false, new NullProgressMonitor());
- return root;
- }
-
- private void setStats(long start, long end, List<ITmfTreeViewerEntry> entryList, AbstractSegmentStatisticsAnalysis module, boolean isSelection, IProgressMonitor monitor) {
- String label = isSelection ? getSelectionLabel() : getTotalLabel();
- final SegmentStoreStatistics entry = isSelection ? module.getTotalStatsForRange(start, end, monitor) : module.getTotalStats();
- if (entry != null) {
-
- if (entry.getNbSegments() == 0) {
- return;
- }
- TmfTreeViewerEntry child = new SegmentStoreStatisticsEntry(checkNotNull(label), entry);
- entryList.add(child);
-
- final Map<@NonNull String, @NonNull SegmentStoreStatistics> perTypeStats = isSelection? module.getPerSegmentTypeStatsForRange(start, end, monitor) : module.getPerSegmentTypeStats();
- if (perTypeStats != null) {
- for (Entry<@NonNull String, @NonNull SegmentStoreStatistics> statsEntry : perTypeStats.entrySet()) {
- child.addChild(new SegmentStoreStatisticsEntry(statsEntry.getKey(), statsEntry.getValue()));
- }
- }
- }
- }
-
- @Override
- @TmfSignalHandler
- public void windowRangeUpdated(@Nullable TmfWindowRangeUpdatedSignal signal) {
- // Do nothing. We do not want to update the view and lose the selection
- // if the window range is updated with current selection outside of this
- // new range.
- }
-
- /**
- * Get the type label
- *
- * @return the label
- * @since 1.2
- */
- protected String getTypeLabel() {
- return checkNotNull(Messages.AbstractSegmentStoreStatisticsViewer_types);
- }
-
- /**
- * Get the total column label
- *
- * @return the totals column label
- * @since 1.2
- */
- protected String getTotalLabel() {
- return checkNotNull(Messages.AbstractSegmentStoreStatisticsViewer_total);
- }
-
- /**
- * Get the selection column label
- *
- * @return The selection column label
- * @since 1.2
- */
- protected String getSelectionLabel() {
- return checkNotNull(Messages.AbstractSegmentStoreStatisticsViewer_selection);
- }
-
- /**
- * Class to define a level in the tree that doesn't have any values.
- */
- protected class HiddenTreeViewerEntry extends SegmentStoreStatisticsEntry {
- /**
- * Constructor
- *
- * @param name
- * the name of the level
- */
- public HiddenTreeViewerEntry(String name) {
- super(name, new SegmentStoreStatistics());
- }
- }
-
-}