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?
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