package fr.inria.diversify.transformation.query;
import fr.inria.diversify.diversification.InputProgram;
import fr.inria.diversify.testamplification.ParseTransformationAndDiff;
import fr.inria.diversify.testamplification.compare.diff.Diff;
import fr.inria.diversify.transformation.Transformation;
import fr.inria.diversify.transformation.TransformationParserException;
import org.json.JSONException;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
/**
* Created by Simon on 13/02/15.
*/
public class AmpSosieQuery extends TransformationQuery {
protected List<Diff> diffs;
protected Diff currentDiff;
protected boolean removeAfterQuery = true;
protected boolean shuffle = false;
public AmpSosieQuery(InputProgram inputProgram) {
super(inputProgram);
}
public void initDiff(String transformationDir, String filterFile) throws JSONException, IOException, TransformationParserException {
ParseTransformationAndDiff parser = new ParseTransformationAndDiff(inputProgram);
parser.parseDir(transformationDir);
parser.loadFilter(filterFile);
parser.applyFilter();
diffs = parser.getDiffs().values().stream()
.filter(diff -> diff.size() != 0)
.collect(Collectors.toList());
}
@Override
public Transformation query() throws QueryException {
int index = 0;
List<Diff> mostDifferentTransformation = mostDifferentTransformation();
if(shuffle) {
Random r = new Random();
index = r.nextInt(mostDifferentTransformation.size());
}
Diff diff = mostDifferentTransformation.get(index);
if(currentDiff == null) {
currentDiff = diff;
} else {
currentDiff.merge(diff);
}
if(removeAfterQuery) {
mostDifferentTransformation.remove(index);
}
return diff.getSosie();
}
protected List<Diff> mostDifferentTransformation() {
if(currentDiff == null) {
return diffs;
} else {
int size = currentDiff.size();
return diffs.stream()
.filter(diff -> currentDiff.mergeSize(diff) > size)
.collect(Collectors.toList());
}
}
public boolean hasNextTransformation() {
return !diffs.isEmpty() && !mostDifferentTransformation().isEmpty();
}
public void currentTransformationEnd() {
currentDiff = null;
}
public void setShuffle(boolean shuffle) {
this.shuffle = shuffle;
}
public void setRemoveAfterQuery(boolean removeAfterQuery) {
this.removeAfterQuery = removeAfterQuery;
}
public Diff getCurrentDiff() {
return currentDiff;
}
}