?
So, habe es, Dank @DocShoe , jetzt endlich hinbekommen.
Reduzierung von 116 auf 52 Datenpunkte und das Verfahren ist stabil, das Ergebnis verändert sich nicht durch mehrmalige Aufrufe.
Vorher (oben) und nachher (unten): https://i.postimg.cc/K8F7HNgj/grafik.png
Danke, dass ihr mir geholfen habt. Anbei noch der Code.
import jetbrains.exodus.entitystore.Entity;
import jetbrains.exodus.entitystore.EntityIterable;
import jetbrains.exodus.entitystore.PersistentEntityStore;
import jetbrains.exodus.entitystore.PersistentEntityStores;
import java.util.ArrayList;
import java.util.Objects;
public class StatisticCollectionShrink {
private static class ShrinkBlock {
private static final long t0 = 1000 * 60 * 60 * 4;
private final long t1;
private final long t2;
private final long t3;
private final ArrayList<Entity> entities = new ArrayList<>();
public ShrinkBlock(final long t1) {
this.t1 = t1;
this.t2 = t1 + t0;
this.t3 = t1 + t0 / 2;
}
public ShrinkBlock getNext() {
return new ShrinkBlock(t2);
}
private boolean contains(final Entity e) {
return contains((long) Objects.requireNonNull(e.getProperty("time")));
}
private boolean contains(final long t) {
return t >= t1 && t < t2;
}
private Entity[] getSignificantAssetEntities() {
if (entities.size() < 2)
return null;
int n = (int) entities.get(0).getLinks("asset").size();
Entity[] maxYs = new Entity[n];
Entity[] minYs = new Entity[n];
for (final Entity entity : entities) {
int i = 0;
for (final Entity asset : entity.getLinks("asset")) {
if (maxYs[i] == null) {
maxYs[i] = asset;
}
if (minYs[i] == null) {
minYs[i] = asset;
}
double sum = Double.parseDouble((String) Objects.requireNonNull(asset.getProperty("sum")));
double maxSum = Double.parseDouble((String) Objects.requireNonNull(maxYs[i].getProperty("sum")));
double minSum = Double.parseDouble((String) Objects.requireNonNull(minYs[i].getProperty("sum")));
if (sum > maxSum) {
maxYs[i] = asset;
}
if (sum < minSum) {
minYs[i] = asset;
}
i++;
}
}
Entity maxY = maxYs[0];
Entity minY = minYs[0];
for (int i = 0; i < n; i++) {
double sum1 = Double.parseDouble((String) Objects.requireNonNull(maxY.getProperty("sum")));
double sum2 = Double.parseDouble((String) Objects.requireNonNull(maxYs[i].getProperty("sum")));
double sum3 = Double.parseDouble((String) Objects.requireNonNull(minY.getProperty("sum")));
double sum4 = Double.parseDouble((String) Objects.requireNonNull(minYs[i].getProperty("sum")));
if (sum1 < sum2) {
maxY = maxYs[i];
}
if (sum3 > sum4) {
minY = minYs[i];
}
}
return new Entity[]{maxY, minY};
}
}
public StatisticCollectionShrink() {
try (PersistentEntityStore store = PersistentEntityStores.newInstance("rowsData")) {
store.executeInTransaction(txn -> {
// collect old entities
ArrayList<Entity> oldEntities = new ArrayList<>();
EntityIterable measurements = txn.sort("Measurement", "time", true);
for (final Entity measurement : measurements) {
oldEntities.add(measurement);
}
System.out.println("size() = " + measurements.size());
// build blocks
ArrayList<ShrinkBlock> blocks = new ArrayList<>();
blocks.add(new ShrinkBlock((long) Objects.requireNonNull(oldEntities.get(0).getProperty("time"))));
long endTime = (long) Objects.requireNonNull(oldEntities.get(oldEntities.size() - 1).getProperty("time"));
while (blocks.get(blocks.size() - 1).t2 <= endTime) {
blocks.add(blocks.get(blocks.size() - 1).getNext());
}
for (final Entity entity : oldEntities) {
for (final ShrinkBlock block : blocks) {
if (block.contains(entity)) {
block.entities.add(entity);
break;
}
}
}
// insert new entities
for (final ShrinkBlock block : blocks) {
if (block.entities.size() < 2) {
continue;
}
Entity[] oldAssets = Objects.requireNonNull(block.getSignificantAssetEntities());
long t1 = block.t1;
long t3 = block.t3;
Entity oldMaxEntity = Objects.requireNonNull(oldAssets[0].getLink("measurement"));
Entity oldMinEntity = Objects.requireNonNull(oldAssets[1].getLink("measurement"));
long d1 = (long) Objects.requireNonNull(oldMaxEntity.getProperty("time")) - t1;
long d2 = (long) Objects.requireNonNull(oldMinEntity.getProperty("time")) - t1;
if (d1 <= d2) {
{
Entity newEntity = txn.newEntity("Measurement");
newEntity.setProperty("time", t1);
newEntity.setProperty("sum", Objects.requireNonNull(oldMaxEntity.getProperty("sum")));
for (final Entity oldAsset : oldMaxEntity.getLinks("asset")) {
Entity newAsset = txn.newEntity("Asset");
newAsset.setProperty("name", Objects.requireNonNull(oldAsset.getProperty("name")));
newAsset.setProperty("amount", Objects.requireNonNull(oldAsset.getProperty("amount")));
newAsset.setProperty("sum", Objects.requireNonNull(oldAsset.getProperty("sum")));
newAsset.setLink("measurement", newEntity);
newEntity.addLink("asset", newAsset);
}
}
{
Entity newEntity = txn.newEntity("Measurement");
newEntity.setProperty("time", t3);
newEntity.setProperty("sum", Objects.requireNonNull(oldMinEntity.getProperty("sum")));
for (final Entity oldAsset : oldMinEntity.getLinks("asset")) {
Entity newAsset = txn.newEntity("Asset");
newAsset.setProperty("name", Objects.requireNonNull(oldAsset.getProperty("name")));
newAsset.setProperty("amount", Objects.requireNonNull(oldAsset.getProperty("amount")));
newAsset.setProperty("sum", Objects.requireNonNull(oldAsset.getProperty("sum")));
newAsset.setLink("measurement", newEntity);
newEntity.addLink("asset", newAsset);
}
}
} else {
{
Entity newEntity = txn.newEntity("Measurement");
newEntity.setProperty("time", t1);
newEntity.setProperty("sum", Objects.requireNonNull(oldMinEntity.getProperty("sum")));
for (final Entity oldAsset : oldMinEntity.getLinks("asset")) {
Entity newAsset = txn.newEntity("Asset");
newAsset.setProperty("name", Objects.requireNonNull(oldAsset.getProperty("name")));
newAsset.setProperty("amount", Objects.requireNonNull(oldAsset.getProperty("amount")));
newAsset.setProperty("sum", Objects.requireNonNull(oldAsset.getProperty("sum")));
newAsset.setLink("measurement", newEntity);
newEntity.addLink("asset", newAsset);
}
}
{
Entity newEntity = txn.newEntity("Measurement");
newEntity.setProperty("time", t3);
newEntity.setProperty("sum", Objects.requireNonNull(oldMaxEntity.getProperty("sum")));
for (final Entity oldAsset : oldMaxEntity.getLinks("asset")) {
Entity newAsset = txn.newEntity("Asset");
newAsset.setProperty("name", Objects.requireNonNull(oldAsset.getProperty("name")));
newAsset.setProperty("amount", Objects.requireNonNull(oldAsset.getProperty("amount")));
newAsset.setProperty("sum", Objects.requireNonNull(oldAsset.getProperty("sum")));
newAsset.setLink("measurement", newEntity);
newEntity.addLink("asset", newAsset);
}
}
}
}
// delete old entities
for (final Entity oldEntity : oldEntities) {
oldEntity.getLinks("asset").forEach(Entity::delete);
oldEntity.delete();
}
System.out.println("size() = " + txn.sort("Measurement", "time", true).size());
});
}
}
}