package edu.isi.karma.controller.command.cleaning;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import org.apache.log4j.Logger;
import org.apache.log4j.FileAppender;
import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.SimpleLayout;
import edu.isi.karma.controller.command.CommandException;
import edu.isi.karma.controller.command.WorksheetCommand;
import edu.isi.karma.controller.update.FetchResultUpdate;
import edu.isi.karma.controller.update.UpdateContainer;
import edu.isi.karma.rep.HNodePath;
import edu.isi.karma.rep.Node;
import edu.isi.karma.rep.Worksheet;
import edu.isi.karma.view.VWorkspace;
public class FetchTransformingDataCommand extends WorksheetCommand {
private final String id;
private final String worksheetId;
private final String hNodeId;
public FetchTransformingDataCommand(String id, String worksheetId, String hNodeId)
{
super(id,worksheetId);
this.hNodeId = hNodeId;
this.id = id;
this.worksheetId = worksheetId;
/////log info
try
{
FileAppender appender = new FileAppender(new SimpleLayout(),"./log/cleanning.log");
logger.addAppender(appender);
}
catch (Exception e) {
}
}
@Override
public String getCommandName() {
return FetchTransformingDataCommand.class.getName();
}
@Override
public String getTitle() {
return "Fetching transforming data";
}
@Override
public String getDescription() {
return null;
}
@Override
public CommandType getCommandType() {
return CommandType.notUndoable;
}
public HashSet<Integer> obtainIndexs(int size)
{
HashSet<Integer> inds = new HashSet<Integer>();
//select 30% or 50
int sample_size = (int)(size*0.3);
if(sample_size >=60)
{
sample_size = 60;
}
else {
sample_size = size;
}
//Random rad = new Random();
int cand = 0;
while( inds.size() <sample_size)
{
//int cand = rad.nextInt(size);
if(!inds.contains(cand))
{
inds.add(cand);
}
cand++;
}
return inds;
}
private static Logger logger = Logger.getLogger(FetchTransformingDataCommand.class);
@Override
public UpdateContainer doIt(VWorkspace vWorkspace) throws CommandException {
Worksheet wk = vWorkspace.getRepFactory().getWorksheet(worksheetId);
String Msg = String.format("fetch Data begin, Time:%d, Worksheet:%s",System.currentTimeMillis(),worksheetId);
logger.info(Msg);
// Get the HNode
HashMap<String, HashMap<String, String>> rows = new HashMap<String, HashMap<String, String>>();
HNodePath selectedPath = null;
List<HNodePath> columnPaths = wk.getHeaders().getAllPaths();
for (HNodePath path : columnPaths) {
if (path.getLeaf().getId().equals(hNodeId)) {
selectedPath = path;
}
}
//random nodes
Collection<Node> nodes = new ArrayList<Node>();
wk.getDataTable().collectNodes(selectedPath, nodes);
HashSet<Integer> indSet = this.obtainIndexs(nodes.size());
int index = 0;
for (Iterator<Node> iterator = nodes.iterator(); iterator.hasNext();) {
Node node = iterator.next();
if(indSet.contains(index))
{
String id = node.getId();
String originalVal = node.getValue().asString();
HashMap<String, String> x = new HashMap<String, String>();
x.put("Org", originalVal);
x.put("Tar", originalVal);
x.put("Orgdis", originalVal);
x.put("Tardis", originalVal);
rows.put(id, x);
}
index ++;
}
Msg = String.format("fetch data end, Time:%d, Worksheet:%s",System.currentTimeMillis(),worksheetId);
logger.info(Msg);
return new UpdateContainer(new FetchResultUpdate(hNodeId,rows));
}
@Override
public UpdateContainer undoIt(VWorkspace vWorkspace) {
return null;
}
}