blob: c930d7cb840213144ba4b6285f4caceb47fe5c07 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2016 EfficiOS Inc., Alexandre Montplaisir
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tracecompass.internal.provisional.analysis.lami.core.module;
import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.internal.provisional.analysis.lami.core.types.LamiData;
import org.eclipse.tracecompass.internal.provisional.analysis.lami.core.types.LamiTimeRange;
import org.eclipse.tracecompass.internal.provisional.analysis.lami.core.types.LamiTimestamp;
import com.google.common.collect.ImmutableList;
/**
* Entry of a LAMI output. Usually corresponds to one row in a JSON LAMI table
* output.
*
* @author Alexandre Montplaisir
*/
public class LamiTableEntry {
private final List<LamiData> fValues;
/**
* Constructor
*
* @param values Values contained in this row
*/
public LamiTableEntry(List<LamiData> values) {
fValues = checkNotNull(ImmutableList.copyOf(values));
}
/**
* Get the value at a given index
*
* @param index
* Index to look at
* @return The value at this index
*/
public LamiData getValue(int index) {
return fValues.get(index);
}
/**
* Get the time range represented by this row.
*
* If more than one exists, one of them (usually the first) is returned.
*
* If there are no time ranges in this row, null is returned.
*
* @return The time range of this row
*/
public @Nullable LamiTimeRange getCorrespondingTimeRange() {
/*
* If there is one or more time range(s) in the values, return the first
* one we find directly.
*/
Optional<LamiTimeRange> oTimerange = fValues.stream()
.filter(LamiTimeRange.class::isInstance)
.map(LamiTimeRange.class::cast)
.findFirst();
if (oTimerange.isPresent()) {
return oTimerange.get();
}
/* Look for individual timestamps instead */
List<LamiTimestamp> timestamps = fValues.stream()
.filter(LamiTimestamp.class::isInstance)
.map(LamiTimestamp.class::cast)
.collect(Collectors.toList());
if (timestamps.size() > 1) {
/* We can try using the first two timestamps to create a range (making sure it's valid) */
LamiTimestamp firstTs = timestamps.get(0);
LamiTimestamp secondTs = timestamps.get(1);
Number firstTsValue = firstTs.getValue();
Number secondTsValue = secondTs.getValue();
// TODO: Consider low and high limits in comparisons.
if (firstTsValue != null && secondTsValue != null &&
Long.compare(firstTsValue.longValue(), secondTsValue.longValue()) <= 0) {
return new LamiTimeRange(firstTs, secondTs);
}
}
if (!timestamps.isEmpty()) {
/* If there is only one timestamp, use it to create a punctual range */
LamiTimestamp ts = timestamps.get(0);
return new LamiTimeRange(ts, ts);
}
/* Didn't find any timestamp we can't use */
return null;
}
}