Xodus Links

vup

Mitglied
Hallo nochmal,

bei dem schäbigen Wetter kann man ja eh nicht viel machen ...

Irgendwie ergibt das Folgende keinen Sinn.

Befüllen:

Java:
                    new TimerTask() {
                        @Override
                        public void run() {
                            try {
                                final String[][] rows = getRows();
                                if (rows == null) {
                                    return;
                                }
                                double sum = 0;
                                for (final String[] a : rows) {
                                    double d = Double.parseDouble(a[2]);
                                    if (d > 0) {
                                        sum += d;
                                    }
                                }
                                final double sumRounded = Math.round(sum * 100) / 100.0;
                                try (PersistentEntityStore store = PersistentEntityStores.newInstance("rowsData")) {
                                    store.executeInTransaction(txn -> {
                                        Entity row = txn.newEntity("Row");
                                        row.setProperty("time", System.currentTimeMillis());
                                        row.setProperty("sum", sumRounded);
                                        for (final String[] a : rows) {
                                            Entity asset = txn.newEntity("Asset");
                                            asset.setProperty("name", a[0]);
                                            asset.setProperty("amount", a[1]);
                                            asset.setProperty("sum", a[2]);
                                            asset.addLink("row", row);
                                        }
                                    });
                                }
                            }

Und Abfragen:

Java:
        final ArrayList<Date> xData = new ArrayList<>();
        final ArrayList<Double> yData = new ArrayList<>();
        final TreeMap<String, ArrayList<Double>> ys = new TreeMap<>();
        try (PersistentEntityStore store = PersistentEntityStores.newInstance("rowsData")) {
            store.executeInReadonlyTransaction(txn -> {
                EntityIterable rows = txn.sort("Row", "time", true);
                for (final Entity e : rows) {
                    Long l = (Long) e.getProperty("time");
                    assert l != null;
                    xData.add(new Date(l));
                    yData.add((Double) e.getProperty("sum"));
                    TreeMap<String, Double> map = new TreeMap<>();
                    EntityIterable row = e.getLinks("row").asSortResult();
                    for (final Entity e2 : row) {
                        Double sum = (Double) e2.getProperty("sum");
                        assert sum != null;
                        if (sum > 0) {
                            map.put((String) e2.getProperty("name"), sum);
                        }
                    }
                    if (map.size() > 0) {
                        for (final Map.Entry<String, Double> me : map.entrySet()) {
                            ys.computeIfAbsent(me.getKey(), list -> new ArrayList<>())
                                    .add(me.getValue());
                        }
                    }
                }
            });
        }

        // Create Chart
        XYChart chart = new XYChartBuilder().width(800).height(600).title("Sums").build();
        chart.addSeries("$", xData, yData);

        XYChart chart2 = new XYChartBuilder().width(800).height(600).title("Sums (2)").build();
        for (final Map.Entry<String, ArrayList<Double>> me : ys.entrySet()) {
            chart2.addSeries(me.getKey(), xData, me.getValue());
        }

        // Show it
        SwingWrapper<XYChart> sw = new SwingWrapper<>(List.of(chart, chart2));
        JFrame frame = sw.displayChartMatrix();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

Durchgelesen hatte ich mir das: https://github.com/JetBrains/xodus/wiki/Entity-Stores#links

Problem: e.getLinks("row").asSortResult(); liefert ein leeres Iterable zurück und das zweite Chart-Panel ist folglich auch leer.

Warum ist das so?
 

vup

Mitglied
Lösung gefunden 🥰

... stand etwas weiter unten im Wiki ... Zeile 13:

EntityIterable row = txn.findLinks("Asset", e, "row");
 

Marinek

Bekanntes Mitglied
Falls irgendwer mal hier vorbei kommt:

  • Beim Speichern der Werte wird rows unnötig doppelt durchlaufen. Hätte man auch in einer Iteration durchführen können.
  • Die Benennung der Variablen ist extrem schlecht (also wie immer); Man sollte die Variablen korrekt bennen, dann sieht man solche Fehler, wie hier auch viel schneller.
  • Sehr viele nicht externalisierte Strings. Ändert sich mal row in die richtige Bezeichnung der Entität muss man anschließend hergehen und alle umbenennen. Das ist ein richtig schlechter Stiel der zu vielen vielen Fehlern führt und das darf man nicht machen.

Bei Fehlermeldungen sollte man immer ein kurzes kompilierbares Beispiel posten und daran beschreiben, was da passiert und was passieren soll. Dann kann man auch sinnvoll helfen.
 

vup

Mitglied
Beim Speichern der Werte wird rows unnötig doppelt durchlaufen. Hätte man auch in einer Iteration durchführen können.
Glaube ich nicht. Lasse mich aber gerne vom Gegenteil überzeugen.

An den schlechten Variablennamen ist hingegen etwas dran. Bin selber über rows, row, e und e2 gestolpert.

Mit dem 3. Punkt wirst du wahrscheinlich so etwas meinen:
anstatt map.put((String) e2.getProperty("name"), sum); besser schreiben map.put((String) e2.getProperty(propertyNameName), sum);

das finde ich allerdings bei dem kleinen Beispiel unleserlicher.
 

Marinek

Bekanntes Mitglied
Java:
          double sum = 0;
                                try (PersistentEntityStore store = PersistentEntityStores.newInstance("rowsData")) {
                                    store.executeInTransaction(txn -> {
                                        Entity row = txn.newEntity("Row");
                                        row.setProperty("time", System.currentTimeMillis());
                                        
                                        for (final String[] a : rows) {
                                            Entity asset = txn.newEntity("Asset");
                                            asset.setProperty("name", a[0]);
                                            asset.setProperty("amount", a[1]);
                                            asset.setProperty("sum", a[2]);
                                            asset.addLink("row", row);
               
                                           double d = Double.parseDouble(a[2]);
                                           if (d > 0) {
                                                sum += d;
                                           }
                                        }
                                        final double sumRounded = Math.round(sum * 100) / 100.0;
                                        row.setProperty("sum", sumRounded);
                                    });

Das entkräftet deine Behauptung etwas...

Deswegen wirst du nie besser werden.
 

vup

Mitglied
Jup, es hat jetzt geklappt:

Java:
    public static void collect() {
        if (timer == null) {
            timer = new Timer(false);
            timer.schedule(
                    new TimerTask() {
                        @Override
                        public void run() {
                            try {
                                final String[][] rows = getRows();
                                if (rows == null) {
                                    return;
                                }
                                double sum = 0;
                                for (final String[] a : rows) {
                                    double d = Double.parseDouble(a[2]);
                                    if (d > 0) {
                                        sum += d;
                                    }
                                }
                                final double sumRounded = Math.round(sum * 100) / 100.0;
                                try (PersistentEntityStore store = PersistentEntityStores.newInstance("rowsData")) {
                                    store.executeInTransaction(txn -> {
                                        Entity measurement = txn.newEntity("Measurement");
                                        measurement.setProperty("time", System.currentTimeMillis());
                                        measurement.setProperty("sum", sumRounded);
                                        for (final String[] row : rows) {
                                            Entity asset = txn.newEntity("Asset");
                                            asset.setProperty("name", row[0]);
                                            asset.setProperty("amount", row[1]);
                                            asset.setProperty("sum", row[2]);
                                            asset.setLink("measurement", measurement); // wichtig
                                            measurement.addLink("asset", asset); // wichtig
                                        }
                                    });
                                }
                            } catch (final Exception ex) {
                                throw new RuntimeException(ex);
                            }
                        }
                    },
                    0,
                    1000 * 60 * 60);
        } else {
            timer.cancel();
            timer = null;
        }
    }

Java:
    public static void query() {
        final ArrayList<Date> xData = new ArrayList<>();
        final ArrayList<Double> yData = new ArrayList<>();
        final TreeMap<String, ArrayList<Double>> ys = new TreeMap<>();
        try (PersistentEntityStore store = PersistentEntityStores.newInstance("rowsData")) {
            store.executeInReadonlyTransaction(txn -> {
                EntityIterable measurements = txn.sort("Measurement", "time", true);
                for (final Entity measurement : measurements) {
                    Long time = (Long) measurement.getProperty("time");
                    assert time != null;
                    xData.add(new Date(time));
                    yData.add((Double) measurement.getProperty("sum"));
                    TreeMap<String, Double> map = new TreeMap<>();
                    EntityIterable assets = measurement.getLinks("asset");
                    for (final Entity asset : assets) {
                        String stringSum = (String) asset.getProperty("sum");
                        assert stringSum != null;
                        double sum = Double.parseDouble(stringSum);
                        if (sum > 0) {
                            map.put((String) asset.getProperty("name"), sum);
                        }
                    }
                    for (final Map.Entry<String, Double> me : map.entrySet()) {
                        ys.computeIfAbsent(me.getKey(), list -> new ArrayList<>()).add(me.getValue());
                    }
                }
            });
        }

        // Create Chart
        XYChart chart = new XYChartBuilder().width(800).height(600).title("Sums").build();
        chart.addSeries("$", xData, yData);

        XYChart chart2 = new XYChartBuilder().width(800).height(600).title("Sums (2)").build();
        for (final Map.Entry<String, ArrayList<Double>> me : ys.entrySet()) {
            chart2.addSeries(me.getKey(), xData, me.getValue());
        }

        // Show it
        SwingWrapper<XYChart> sw = new SwingWrapper<>(List.of(chart, chart2));
        JFrame frame = sw.displayChartMatrix();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

Die Kombination aus setLink() und addLink() in Zeile 31 und 32 im ersten Snippet ist wichtig, um eine 1:n-Beziehung zu realisieren.

setLink überschreibt bisherigen, assLink fügt hinzu.

Deswegen wirst du nie besser werden.

Unschön, aber besser als wer oder was?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Teile eines Links entfernen Allgemeine Java-Themen 6
S Bookmark HTML Datei einlesen, alle Links erhalten und manche editieren..? (aktuell JSoup) Allgemeine Java-Themen 4
R Zeilen eines 2d Arrays abwechselnd links und rechts mit Nullen auffüllen Allgemeine Java-Themen 14
R Was muss ich ändern, damit der Kreis links unten gezeichnet wird? Allgemeine Java-Themen 17
T Google Links in einer Liste Allgemeine Java-Themen 4
T Swing TrayIcon erkennt links klick nicht (Mac) Allgemeine Java-Themen 2
C Swing File[] als klickbare links in irgendeinem Swing Element Allgemeine Java-Themen 3
N Jsoup, Links weiter benutzen Allgemeine Java-Themen 5
GreenTeaYT Elemente eines 2Dim LinkedList von links nach rechts ausgeben? Allgemeine Java-Themen 0
J Ausgabe von Links nach Rechts ausgeben? Allgemeine Java-Themen 2
T Jsoup: Mehrere Links nacheinander parsen Allgemeine Java-Themen 11
L SetBounds wird vor dem Konstruktorcode aufgerufen - Wenn Startleiste links Allgemeine Java-Themen 1
X Selenium - Per Webdriver, Javascript generierte links klicken Allgemeine Java-Themen 0
L Links aus dem Inet-Browser automatisch anklicken lassen Allgemeine Java-Themen 5
X Websiten auslesen, Browser stellt Links anders da. Allgemeine Java-Themen 10
S E-Mail-Links: geklickten Link ermitteln Allgemeine Java-Themen 4
S unter UNIX - (symbolic) links erkennen? Allgemeine Java-Themen 12
G Javadoc generiert keine Links zu java.lang Klassen? Allgemeine Java-Themen 4
F Strings in JList ausrichten/links/rechts/mittig Allgemeine Java-Themen 10
G Links zum Thema Synchronisation Allgemeine Java-Themen 7
K auf Internetseiten zugreifen / Links verfolgen Allgemeine Java-Themen 2
S API für Start-menu und Links Allgemeine Java-Themen 2
V Javadoc ertellt keine korrekten links Allgemeine Java-Themen 3
B Wie heißt dieser kleine Typ links oben? Also dieses JavaVieh Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben