Java Xodus Links

CyborgBeta

Lt. Commander
Registriert
Jan. 2021
Beiträge
1.834
Hi,

der zweite Chart ist immer leer. Was mache ich beim Befüllen bzw. Abfragen falsch?

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);
                                        }
                                    });
                                }
                            }

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);

Der Aufruf von e.getLinks("row").asSortResult(); liefert immer ein leeres Iterable zurück.

Das Datenbankmodell sollte ungefähr so sein:

1679942442705.png


Link: https://github.com/JetBrains/xodus/wiki/Entity-Stores#links

Vielen Dank für jeden Hinweis :)
 
Vielleicht, weil du die Beziehung falsch rum abfragst?

"row" ist ein Link auf Asset. Du fragst aber auf der Row. Geht das überhaupt? Ich würde mal raten und sagen: Nicht so wie du es machst.

Einfach Doku mehr lesen und alternative Abfragen finden:

https://github.com/JetBrains/xodus/wiki/Entity-Stores#traversing-links schrieb:
One method for traversing links is already mentioned above: Entity.getLinks(). It is considered as a query because it returns an EntityIterable. It lets you iterate over outgoing links of an entity with a specified name.

It is also possible to find incoming links. For example, let's search for user who uses a particular auth module:
Und dann kommt die Lösung:
Code:
final EntityIterable ldapUsers = txn.findLinks("User", ldapAuthModule, "authModule");
 
  • Gefällt mir
Reaktionen: CyborgBeta
Ohne die API zu kennen, aber du haengst die Links an das Asset, aber fragst spaeter Rows ab, die haben dann den Link nicht vermute ich mal.
 
  • Gefällt mir
Reaktionen: CyborgBeta
tollertyp schrieb:
Vielleicht, weil du die Beziehung falsch rum abfragst?

"row" ist ein Link auf Asset. Du fragst aber auf der Row. Geht das überhaupt? Ich würde mal raten und sagen: Nicht so wie du es machst
Also, fehlt ein Link oder ist "nur" die Abfrage falsch?
 
tollertyp schrieb:
Und dann kommt die Lösung:
Code:
final EntityIterable ldapUsers = txn.findLinks("User", ldapAuthModule, "authModule");
Danke schön! Genau an dieser Abfrage lag es ...

Abfrage neu:

Java:
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 = txn.findLinks("Asset", e, "row");
                for (final Entity e2 : row) {
                    double sum =
                            Double.parseDouble(
                                    (String)
                                            Objects.requireNonNull(
                                                    e2.getProperty("sum")));
                    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());
                    }
                }
            }
        });

(Zeile 10 ...)

Resultat:

Edit: Screen entfernt
 
Zuletzt bearbeitet:
(Hab mal den Screenshot entfernt, es muss ja nicht jeder meinen Kontostand wissen...)

Kurze Frage noch ... Es funktioniert zwar mit txn.findLinks( ), aber ist die Verknüpfung/Verlinkung auch richtig? Also würde man so eine 1:n-Beziehung realisieren? Glaube, habe noch etwas vergessen bzw. falsch gemacht. :(
 
Zurück
Oben