package org.yamcs.archive;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yamcs.parameter.ParameterValue;
import org.yamcs.protobuf.Yamcs.ProtoDataType;
import org.yamcs.protobuf.Yamcs.ReplayRequest;
import org.yamcs.tctm.ParameterDataLinkInitialiser;
import org.yamcs.xtce.Parameter;
import org.yamcs.xtce.XtceDb;
import org.yamcs.yarch.Tuple;
/**
* Replays parameters from tables recorded by the {@link org.yamcs.archive.ParameterRecorder}
*
* @author nm
*
*/
public class ParameterReplayHandler implements ReplayHandler {
Set<String>currentGroups = new HashSet<String>();
final XtceDb xtceDb;
ReplayRequest request;
static final Logger log = LoggerFactory.getLogger(ParameterReplayHandler.class);
public ParameterReplayHandler(XtceDb xtceDb) {
this.xtceDb = xtceDb;
}
@Override
public void setRequest(ReplayRequest newRequest) {
this.request = newRequest;
currentGroups.clear();
currentGroups.addAll(newRequest.getPpRequest().getGroupNameFilterList());
}
@Override
/**
* provides a select statement like this:
* select n,* from pp where group in (grp1, grp2,...) and gentime>x and gentime<y
* The definition of the PP table is in {@link PpRecorder}
*/
public String getSelectCmd() {
StringBuilder sb = new StringBuilder();
boolean first = true;
sb.append("SELECT ").append(ProtoDataType.PP.getNumber()).
append(",* from pp ");
if(!currentGroups.isEmpty()) {
sb.append("WHERE group in(");
for(String g:currentGroups) {
if(first) {
first = false;
}
else sb.append(", ");
sb.append("'").append(g).append("'");
}
sb.append(")");
XtceTmReplayHandler.appendTimeClause(sb, request, false);
} else {
sb.append("WHERE ");
XtceTmReplayHandler.appendTimeClause(sb, request, true);
}
if(request.hasReverse() && request.getReverse()) {
sb.append(" ORDER DESC");
}
return sb.toString();
}
@Override
public Object transform(Tuple t) {
//loop through all the columns containing values
// the first column is the ProtoDataType.PP (from the select above), then are the fixed ones from PP_TUPLE_DEFINITION
List<ParameterValue> pvlist = new ArrayList<>();
for(int i=ParameterDataLinkInitialiser.PARAMETER_TUPLE_DEFINITION.size()+1; i<t.size(); i++) {
String colName = t.getColumnDefinition(i).getName();
Object o = t.getColumn(i);
ParameterValue pv;
if(o instanceof ParameterValue) {
pv = (ParameterValue) o;
} else if(o instanceof org.yamcs.protobuf.Pvalue.ParameterValue) {
pv = ParameterValue.fromGpb(t.getColumnDefinition(i).getName(),
(org.yamcs.protobuf.Pvalue.ParameterValue) o);
} else {
log.warn("got unexpected value for column {}: {}",colName, o);
continue;
}
Parameter p = xtceDb.getParameter(pv.getParameterQualifiedNamed());
if(p==null) {
log.info("Cannot find a parameter with fqn {}", pv.getParameterQualifiedNamed());
continue;
}
pv.setParameter(p);
pvlist.add(pv);
}
return pvlist;
}
@Override
public void reset() {
}
}