From 8b6ea6194bc9c755c3f236d20fda02257705a5b5 Mon Sep 17 00:00:00 2001 From: Nicolas Laval Date: Wed, 28 Aug 2024 12:00:23 +0200 Subject: [PATCH] Update provenance --- .../insee/vtl/provenance/ProvenanceUtils.java | 64 +++++++++++++++++++ .../insee/vtl/provenance/model/Activity.java | 30 +++++++++ .../vtl/provenance/model/VTLDataset.java | 51 +++++++++++++++ .../provenance/ProvenanceListenerTest.java | 45 ++----------- 4 files changed, 151 insertions(+), 39 deletions(-) create mode 100644 vtl-engine/src/main/java/fr/insee/vtl/provenance/ProvenanceUtils.java create mode 100644 vtl-engine/src/main/java/fr/insee/vtl/provenance/model/Activity.java create mode 100644 vtl-engine/src/main/java/fr/insee/vtl/provenance/model/VTLDataset.java diff --git a/vtl-engine/src/main/java/fr/insee/vtl/provenance/ProvenanceUtils.java b/vtl-engine/src/main/java/fr/insee/vtl/provenance/ProvenanceUtils.java new file mode 100644 index 000000000..6386a0add --- /dev/null +++ b/vtl-engine/src/main/java/fr/insee/vtl/provenance/ProvenanceUtils.java @@ -0,0 +1,64 @@ +package fr.insee.vtl.provenance; + +import fr.insee.vtl.parser.VtlLexer; +import fr.insee.vtl.parser.VtlParser; +import fr.insee.vtl.provenance.model.VTLDataset; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CodePointCharStream; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.tree.ParseTreeWalker; + +import java.util.*; + +public class ProvenanceUtils { + + public static ProvenanceListener getProvenance(String script) { + CodePointCharStream stream = CharStreams.fromString(script); + VtlLexer lexer = new VtlLexer(stream); + VtlParser parser = new VtlParser(new CommonTokenStream(lexer)); + + ProvenanceListener provenanceListener = new ProvenanceListener(); + ParseTreeWalker.DEFAULT.walk(provenanceListener, parser.start()); + + return provenanceListener; + } + + public static void printTree(ProvenanceListener.Node node, String prefix, boolean isLast) { + if (node == null) { + return; + } + + // Print the current node with appropriate formatting + System.out.println(prefix + (isLast ? "└── " : "├── ") + node.name + "\t[ " + node.expression + " ]"); + + // Get the list of parent nodes + Collection parents = node.parents.values(); + int count = parents.size(); + int index = 0; + + // Recursively print each parent node + for (ProvenanceListener.Node parent : parents) { + printTree(parent, prefix + (isLast ? " " : "│ "), ++index == count); + } + } + + public static List toBusinessModel(ProvenanceListener listener) { + ArrayList model = new ArrayList<>(); + LinkedHashMap variables = listener.variables; + variables.values().forEach(node -> { + String name = node.name; + Map parents = node.parents; + VTLDataset vtlDataset = new VTLDataset(name); + model.add(vtlDataset); + }); + return model; + } + + public static void toJSON(ProvenanceListener.Node node) { + + } + + public static void toRDF(ProvenanceListener.Node node) { + + } +} diff --git a/vtl-engine/src/main/java/fr/insee/vtl/provenance/model/Activity.java b/vtl-engine/src/main/java/fr/insee/vtl/provenance/model/Activity.java new file mode 100644 index 000000000..fc1cc2682 --- /dev/null +++ b/vtl-engine/src/main/java/fr/insee/vtl/provenance/model/Activity.java @@ -0,0 +1,30 @@ +package fr.insee.vtl.provenance.model; + +public class Activity { + + private String name; + //TODO: to handle later + //private List used; + private String label; + + public Activity(String name, String label) { + this.name = name; + this.label = label; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } +} diff --git a/vtl-engine/src/main/java/fr/insee/vtl/provenance/model/VTLDataset.java b/vtl-engine/src/main/java/fr/insee/vtl/provenance/model/VTLDataset.java new file mode 100644 index 000000000..09c52642d --- /dev/null +++ b/vtl-engine/src/main/java/fr/insee/vtl/provenance/model/VTLDataset.java @@ -0,0 +1,51 @@ +package fr.insee.vtl.provenance.model; + +import java.util.List; + +public class VTLDataset { + + private String name; + private Activity wasGeneratedBy; + private List wasDerivedFrom; + + public VTLDataset(String name) { + this.name = name; + } + + public VTLDataset(String name, Activity wasGeneratedBy) { + this.name = name; + this.wasGeneratedBy = wasGeneratedBy; + } + + public VTLDataset(String name, Activity wasGeneratedBy, List wasDerivedFrom) { + this.name = name; + this.wasGeneratedBy = wasGeneratedBy; + this.wasDerivedFrom = wasDerivedFrom; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Activity getWasGeneratedBy() { + return wasGeneratedBy; + } + + public void setWasGeneratedBy(Activity wasGeneratedBy) { + this.wasGeneratedBy = wasGeneratedBy; + } + + public List getWasDerivedFrom() { + return wasDerivedFrom; + } + + public void setWasDerivedFrom(List wasDerivedFrom) { + this.wasDerivedFrom = wasDerivedFrom; + } + + +} diff --git a/vtl-engine/src/test/java/fr/insee/vtl/provenance/ProvenanceListenerTest.java b/vtl-engine/src/test/java/fr/insee/vtl/provenance/ProvenanceListenerTest.java index 3d69b402a..ce9fe99d6 100644 --- a/vtl-engine/src/test/java/fr/insee/vtl/provenance/ProvenanceListenerTest.java +++ b/vtl-engine/src/test/java/fr/insee/vtl/provenance/ProvenanceListenerTest.java @@ -1,40 +1,14 @@ package fr.insee.vtl.provenance; -import fr.insee.vtl.parser.VtlLexer; -import fr.insee.vtl.parser.VtlParser; -import org.antlr.v4.runtime.CharStreams; -import org.antlr.v4.runtime.CodePointCharStream; -import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.tree.ParseTreeWalker; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInfo; -import java.util.Collection; +import java.util.List; public class ProvenanceListenerTest { - public static void printTree(ProvenanceListener.Node node, String prefix, boolean isLast) { - if (node == null) { - return; - } - - // Print the current node with appropriate formatting - System.out.println(prefix + (isLast ? "└── " : "├── ") + node.name + "\t[ " + node.expression + " ]"); - - // Get the list of parent nodes - Collection parents = node.parents.values(); - int count = parents.size(); - int index = 0; - - // Recursively print each parent node - for (ProvenanceListener.Node parent : parents) { - printTree(parent, prefix + (isLast ? " " : "│ "), ++index == count); - } - } - @Test - void testProvenance(TestInfo testInfo) { + void testProvenance() { String expr; expr = "" + @@ -57,23 +31,16 @@ void testProvenance(TestInfo testInfo) { // entity(ds1, [ prov:type="prov:Entity", prov:label="ds1" ]) // wasDerivedFrom(ds1, ds2, ds1) - CodePointCharStream stream = CharStreams.fromString(expr, testInfo.getTestMethod().get().getName()); - VtlLexer lexer = new VtlLexer(stream); - VtlParser parser = new VtlParser(new CommonTokenStream(lexer)); - - ProvenanceListener provenanceListener = new ProvenanceListener(); - ParseTreeWalker.DEFAULT.walk(provenanceListener, parser.start()); // Edge [ { a } { b } ....] // Vertices [ [a, b] [a, c] - // Node { a, parent: [ Node { b : - - System.out.println(provenanceListener.variables.keySet()); - - printTree(provenanceListener.variables.get("ds8"), "", true); + ProvenanceListener provListener = ProvenanceUtils.getProvenance(expr); + System.out.println(provListener.variables.keySet()); + ProvenanceUtils.toBusinessModel(provListener) + ProvenanceUtils.printTree(provListener.variables.get("ds8"), "", true); } } \ No newline at end of file