2017-11-15 2 views
1

Ich versuche, zwei Beziehungen in Rascal zu verbinden, ähnlich wie eine SQL zu verbinden, mit dem folgenden Code:Joining 2 große Beziehungen in Rascal

rel[loc,loc,loc] methodInvocationsWithClass = {arround 40000 tuples}; 
rel[loc,loc] declaredClassHierarchy = {around 20000 tuples}; 

{ <from,to,class,super> | <from,to,class> <- methodInvocationsWithClass, <sub,super> <- declaredClassHierarchy, class == sub }; 

Während dies genau das tut, was ich brauche es erscheint es nur Werke gut auf kleine Beziehungen und skaliert nicht gut.

Gibt es vielleicht einen effizienteren alternativen Weg, dies zu erreichen?

Antwort

1

Tatsächlich haben wir die join keyword dafür. Auch viele andere useful relational operations are supported. Entweder durch Schlüsselwörter oder Funktionen innerhalb des Moduls Relation.

+0

Wenn ich das Join-Schlüsselwort richtig verstehe, gibt es eine Art kartesisches Produkt der beiden Relationen zurück. Aber ich muss die Tupel auf bestimmte Werte anpassen, daher die 'class == sub'-Gleichung. Ich könnte so etwas versuchen { | <- methodInvocationsWithClass Join deklarierteClassHierarchy, class == sub}; Aber leider funktioniert das auch nicht für diese Nummern. Ich vermute, dass es zuerst eine neue Relation von 40.000 * 20.000 Tupeln erstellen wird, bevor man diejenigen ausfiltert, die nicht mit dem angegebenen Filter übereinstimmen. – erikv