diff --git a/CHANGELOG.md b/CHANGELOG.md index 321869d27c31645ff0f5fe76637e5e15985bc1af..321f3561bbe3506eddd531cd905b167faa0f5889 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ - :bug: : Fix - :arrow_double_up: : Dependency upgrade +## 1.6.3 +- added configuration module +- improved integraal keywords +- improved CLI + ## 1.6.2 ### Added diff --git a/integraal/integraal-api/src/main/java/fr/boreal/api/high_level_api/EndUserAPI.java b/integraal/integraal-api/src/main/java/fr/boreal/api/high_level_api/EndUserAPI.java index 16e5875badefd3ef8aea6678e778d61921cda941..d538546c9e348b13d42d263ab4835c50b176bb1b 100644 --- a/integraal/integraal-api/src/main/java/fr/boreal/api/high_level_api/EndUserAPI.java +++ b/integraal/integraal-api/src/main/java/fr/boreal/api/high_level_api/EndUserAPI.java @@ -8,11 +8,16 @@ import java.util.stream.StreamSupport; import com.google.common.collect.Iterators; -import fr.boreal.backward_chaining.evaluators.QueryRewriter; -import fr.boreal.backward_chaining.evaluators.RewritingOutput; +import fr.boreal.component_builder.evaluators.query_rewriting.auxiliary.RewritingOutput; import fr.boreal.backward_chaining.unfolding.UCQUnfolder; -import fr.boreal.component_builder.AlgorithmParameters; import fr.boreal.component_builder.api.IComponentBuilder; +import fr.boreal.component_builder.evaluators.query_evaluation.QueryEvaluatorWithMultiEvaluator; +import fr.boreal.component_builder.evaluators.query_rewriting.QueryRewriterWitMultiEvaluator; +import fr.lirmm.boreal.util.timeout.CallableWithTimeout; +import fr.boreal.component_builder.externalHaltingConditions.ExternalHaltingCondition; +import fr.boreal.configuration.keywords.InteGraalKeywords; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Checker; import fr.boreal.configuration.parameters.IGParameter; import fr.boreal.configuration.parameters.IGParameterValueExtractor; import fr.boreal.forward_chaining.chase.Chase; @@ -25,15 +30,9 @@ import fr.boreal.model.query.api.Query; import fr.boreal.model.rule.api.FORule; import fr.boreal.model.ruleCompilation.api.RuleCompilation; import fr.boreal.model.ruleCompilation.api.RuleCompilationResult; -import fr.boreal.query_evaluation.component.QueryEvaluationOutput; -import fr.boreal.query_evaluation.component.QueryEvaluatorWithMultiEvaluator; +import fr.boreal.component_builder.evaluators.query_evaluation.auxiliary.QueryEvaluationOutput; import fr.lirmm.boreal.util.Rules; import fr.lirmm.boreal.util.converter.RuleConverter; -import fr.lirmm.boreal.util.evaluator.CallableWithTimeout; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalHaltingCondition; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Checker; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation; import fr.lirmm.graphik.integraal.api.core.Rule; import fr.lirmm.graphik.integraal.api.core.RuleSet; import fr.lirmm.graphik.integraal.core.ruleset.LinkedListRuleSet; @@ -100,6 +99,9 @@ public class EndUserAPI { */ Chase chase = IComponentBuilder.buildAndGetChase(fb, rb, params); chase.execute(); + System.out.println(chase.getDescription().toJson()); + System.out.println(chase.getDescription().toPrettyString()); + System.out.println(chase.getDescription().getCorrespondingParameters()); return fb; }; @@ -168,7 +170,7 @@ public class EndUserAPI { */ public static Collection<Query> rewriteOld(RuleBase rb, Collection<Query> queries, Compilation ruleCompilationType, ExternalHaltingCondition... conds) { - QueryRewriter rewriter = IComponentBuilder.buildAndGetOMQRewriter(rb, queries, ruleCompilationType, conds); + QueryRewriterWitMultiEvaluator rewriter = IComponentBuilder.buildAndGetOMQRewriter(rb, queries, ruleCompilationType, conds); Iterable<RewritingOutput> it = rewriter.batchEvaluate(); return StreamSupport.stream(it.spliterator(), false).flatMap(out -> out.rewritings().getQueries().stream()) .collect(Collectors.toSet()); @@ -193,7 +195,7 @@ public class EndUserAPI { /* * wrapped method body */ - QueryRewriter rewriter = IComponentBuilder.buildAndGetOMQRewriter(rb, queries, params); + QueryRewriterWitMultiEvaluator rewriter = IComponentBuilder.buildAndGetOMQRewriter(rb, queries, params); Iterable<RewritingOutput> it = rewriter.batchEvaluate(); return StreamSupport.stream(it.spliterator(), false).map(out -> out.rewritings()) .collect(Collectors.toList()); diff --git a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_commander/InteGraalCommander.java b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_commander/InteGraalCommander.java index 2dee662903308b800a75ab0b48f7241d425fb313..753734fe41155791ac508bac8a1dc48619f41021 100644 --- a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_commander/InteGraalCommander.java +++ b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_commander/InteGraalCommander.java @@ -18,11 +18,11 @@ import com.beust.jcommander.Parameters; import fr.boreal.api.high_level_api.EndUserAPI; import fr.boreal.api.high_level_api.Environment; import fr.boreal.api.high_level_api.HybridRuleBase; +import fr.boreal.configuration.keywords.InteGraalKeywords; import fr.boreal.io.dlgp.DlgpWriter; import fr.boreal.model.logicalElements.api.Substitution; import fr.boreal.model.query.api.Query; import fr.lirmm.boreal.util.enumerations.EnumUtils; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; /** * CLI Client for a user wanting to easily use InteGraal for reasoning. diff --git a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/CECommands.java b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/CECommands.java index e2b2fbc8eda8cdc1684b7f41c1fd441ff4d17c47..867a73a054a4f09496a1a52fb7aeea6116f73a92 100644 --- a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/CECommands.java +++ b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/CECommands.java @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.function.Supplier; +import java.util.stream.Collectors; import java.util.stream.Stream; import org.jline.builtins.Less; @@ -33,6 +34,7 @@ import fr.boreal.model.logicalElements.api.Predicate; import fr.boreal.model.query.api.Query; import fr.boreal.model.rule.api.FORule; import fr.boreal.storage.builder.StorageBuilder; +import fr.boreal.storage.natives.SimpleInMemoryGraphStore; import fr.boreal.views.FederatedFactBase; import fr.boreal.views.builder.ViewBuilder; import picocli.CommandLine; @@ -152,19 +154,22 @@ public class CECommands { // One file if (this.files.length == 1) { - IGRepl.writeIfVerbose("Loading file \"" + this.files[0].getAbsolutePath() + "\"...\n", PrintLevel.MAXIMAL); + Path filePath = Paths.get(this.files[0].getAbsolutePath()); + IGRepl.writeIfVerbose("Loading file \"" + filePath + "\"...\n", PrintLevel.MAXIMAL); if ((this.fact != null && this.fact.isEmpty())) this.fact = this.files[0].getName(); if ((this.rule != null && this.rule.isEmpty())) this.rule = this.files[0].getName(); if ((this.query != null && this.query.isEmpty())) this.query = this.files[0].getName(); try { - ComplexEnvironmentCommands.env.loadDLGPFile(this.fact, this.rule, this.query, new FileInputStream(this.files[0]), this.mode); + ComplexEnvironmentCommands.env.loadDLGPFile(this.fact, this.rule, this.query, new FileInputStream(this.files[0]), filePath, this.mode); if (this.fact != null && set) ComplexEnvironmentCommands.env.setCurrentFactBase(this.fact); if (this.rule != null && set) ComplexEnvironmentCommands.env.setCurrentRuleBase(this.rule); if (this.query != null && set) ComplexEnvironmentCommands.env.setCurrentQueryBase(this.query); } catch (ParseException e) { - IGRepl.writeIfVerbose("Warning: Parse Exception on \"" + this.files[0].getAbsolutePath() + "\". Aborting...\n", PrintLevel.MINIMAL); + IGRepl.writeIfVerbose("Warning: Parse Exception on \"" + this.files[0].getAbsolutePath() + "\".", PrintLevel.MINIMAL); + IGRepl.writeIfVerbose(e.getMessage() + "\n", PrintLevel.MINIMAL); + IGRepl.writeIfVerbose("Aborting...\n", PrintLevel.MINIMAL); if (this.fact != null && !Checks.factbaseIsEmpty(this.fact)) ComplexEnvironmentCommands.env.removeFactBase(this.fact); if (this.rule != null && !Checks.rulebaseIsEmpty(this.rule)) @@ -179,26 +184,49 @@ public class CECommands { } else { // If at least a target base has been specified, then we load every file in the same specified base(s) + // TODO: warning : this part has undesirable behavior when dlgp files have some VD loading (only the VD of last file will be kept) if ((this.fact != null && !this.fact.isEmpty()) || (this.rule != null && !this.rule.isEmpty()) || (this.query != null && !this.query.isEmpty())) { if (this.fact != null && !this.fact.isEmpty()) ComplexEnvironmentCommands.env.createFactBase(this.fact, this.mode); if (this.rule != null && !this.rule.isEmpty()) ComplexEnvironmentCommands.env.createRuleBase(this.rule, this.mode); if (this.query != null && !this.query.isEmpty()) ComplexEnvironmentCommands.env.createQueryBase(this.query, this.mode); int counter = 0; + FederatedFactBase finalFFB = new FederatedFactBase(new SimpleInMemoryGraphStore()); for (File file : this.files) { - IGRepl.writeIfVerbose("Loading file \"" + file.getAbsolutePath() + "\"...\n", PrintLevel.MAXIMAL); + Path filePath = Paths.get(file.getAbsolutePath()); + IGRepl.writeIfVerbose("Loading file \"" + filePath + "\"...\n", PrintLevel.MAXIMAL); try { - ComplexEnvironmentCommands.env.loadDLGPFile(this.fact, this.rule, this.query, new FileInputStream(file), WriteMode.APPEND); + // TODO: hideous much? + // When we want to aggregate the different files' content (facts) into one base, we first load a file + // then put its content in a FFB iteratively (we might have views) + ComplexEnvironmentCommands.env.loadDLGPFile(this.fact, this.rule, this.query, new FileInputStream(file), filePath, WriteMode.APPEND); + if (this.fact != null) { + FactBase temp = ComplexEnvironmentCommands.env.getFactBaseByName(this.fact); + if (temp instanceof FederatedFactBase) { + ((FederatedFactBase) temp).getViewDefinitions().forEach((pred, fb) -> finalFFB.addStorage(pred, fb)); + } + finalFFB.addAll(temp.getAtoms()); + + } } catch (ParseException e) { - IGRepl.writeIfVerbose("Warning: Parse Exception on \"" + file.getAbsolutePath() + "\". Skipping this file...\n", PrintLevel.MINIMAL); + IGRepl.writeIfVerbose("Warning: Parse Exception on \"" + file.getAbsolutePath() + "\".\n", PrintLevel.MINIMAL); + IGRepl.writeIfVerbose(e.getMessage() + "\n", PrintLevel.MINIMAL); + IGRepl.writeIfVerbose("Skipping this file...\n", PrintLevel.MINIMAL); counter++; } catch (FileNotFoundException e) { IGRepl.writeIfVerbose("Warning: \"" + file.getAbsolutePath() + "\" does not exist. Skipping this file...\n", PrintLevel.MINIMAL); } } + if (finalFFB.getViewDefinitions().size() == 0) { + ComplexEnvironmentCommands.env.putFactBase(this.fact, new SimpleInMemoryGraphStore(finalFFB.getDefaultStorage().getAtoms().toList()), this.mode); + } else { + ComplexEnvironmentCommands.env.putFactBase(this.fact, finalFFB, this.mode); + } + if (counter == this.files.length) { - if (this.fact != null && !Checks.factbaseIsEmpty(this.fact)) + if (this.fact != null && !Checks.factbaseIsEmpty(this.fact)) { ComplexEnvironmentCommands.env.removeFactBase(this.fact); + } if (this.rule != null && !Checks.rulebaseIsEmpty(this.rule)) ComplexEnvironmentCommands.env.removeRuleBase(this.rule); if (this.query != null && !Checks.querybaseIsEmpty(this.query)) @@ -208,12 +236,15 @@ public class CECommands { } else { // Else, we load every file in its own base for (File file : this.files) { String fileName = file.getName(); + Path filePath = Paths.get(file.getAbsolutePath()); IGRepl.writeIfVerbose("Loading file \"" + file.getAbsolutePath() + "\"...\n", PrintLevel.MAXIMAL); try { - ComplexEnvironmentCommands.env.loadDLGPFile(fileName, fileName, fileName, new FileInputStream(file), this.mode); + ComplexEnvironmentCommands.env.loadDLGPFile(fileName, fileName, fileName, new FileInputStream(file), filePath, this.mode); } catch (ParseException e) { - IGRepl.writeIfVerbose("Warning: Parse Exception on \"" + file.getAbsolutePath() + "\". Skipping this file...\n", PrintLevel.MINIMAL); + IGRepl.writeIfVerbose("Warning: Parse Exception on \"" + file.getAbsolutePath() + "\".\n", PrintLevel.MINIMAL); + IGRepl.writeIfVerbose(e.getMessage() + "\n", PrintLevel.MINIMAL); + IGRepl.writeIfVerbose("Skipping this file...\n", PrintLevel.MINIMAL); ComplexEnvironmentCommands.env.removeFactBase(fileName); ComplexEnvironmentCommands.env.removeRuleBase(fileName); ComplexEnvironmentCommands.env.removeQueryBase(fileName); @@ -299,37 +330,53 @@ public class CECommands { StringWriter stringDlgpWriter = new StringWriter(); DlgpWriter dlgpW = new DlgpWriter(stringDlgpWriter); - int printSizeLimit = 20; + int printSizeLimit = 10; int nbCol = (int)Stream.of(this.fact, this.rule, this.query).filter(Boolean.TRUE::equals).count(); int widthSizeLimit = (Math.round(ComplexEnvironmentCommands.lineReader.getTerminal().getWidth() - (nbCol * 4)) / nbCol); widthSizeLimit = Math.max(widthSizeLimit, 20); List<List<String>> matrix = new ArrayList<>(); - String factBaseTitle = "Fact base"; - String ruleBaseTitle = "Rule base"; - String queryBaseTitle = "Query base"; - int longestFact = Math.max(factBaseName.length(), factBaseTitle.length()); - int longestRule = Math.max(ruleBaseName.length(), ruleBaseTitle.length()); - int longestQuery = Math.max(queryBaseName.length(), queryBaseTitle.length()); + String factBaseTitle = "Fact base: " + factBaseName; + String ruleBaseTitle = "Rule base: " + ruleBaseName; + String queryBaseTitle = "Query base: " + queryBaseName; + int longestFact = factBaseTitle.length(); + int longestRule = ruleBaseTitle.length(); + int longestQuery = queryBaseTitle.length(); if (this.fact) { - List<String> arrAtom = new ArrayList<>(); + // TODO: the following really needs a refactoring... FactBase fb = ComplexEnvironmentCommands.env.getFactBaseByName(factBaseName); + + List<String> arrFB = new ArrayList<>(); + int adjust = printSizeLimit; + + //Listing the views + List<String> arrView = new ArrayList<>(); + Iterator<Predicate> iterView = null; + if(fb instanceof FederatedFactBase ffb) { - for(Predicate p : ffb.getViewDefinitions().keySet()) { - String fString = "view : " + + int idx = 0; + iterView = ffb.getViewDefinitions().keySet().iterator(); + while (iterView.hasNext() && idx < printSizeLimit / 2) { + Predicate p = iterView.next(); + String fString = p.label() + "/" + p.arity(); if (fString.length() > widthSizeLimit) fString = fString.substring(0, widthSizeLimit-3) + "..."; if (fString.length() > longestFact) longestFact = fString.length(); - arrAtom.add(fString); + arrView.add(fString); + idx++; } + adjust = printSizeLimit - (idx + 1); } - Iterator<Atom> iter = fb.getAtoms().iterator(); + + // Listing the facts + List<String> arrAtom = new ArrayList<>(); + Iterator<Atom> iterAtom = fb.getAtoms().iterator(); int idx = 0; - while (iter.hasNext() && idx < printSizeLimit) { + while (iterAtom.hasNext() && idx < Math.min(printSizeLimit,adjust)) { try { - dlgpW.write(iter.next()); + dlgpW.write(iterAtom.next()); } catch (IOException e) { IGRepl.systemRegistry.trace(e); } @@ -340,12 +387,29 @@ public class CECommands { stringDlgpWriter.getBuffer().setLength(0); idx++; } + + String sep = "-"; + int dash_size = 0; + if(fb instanceof FederatedFactBase ffb) { + factBaseTitle = "Federated fact base: "+ factBaseName; + longestFact = Math.max(longestFact, factBaseTitle.length()); + sep = " Views "; + dash_size = (longestFact - sep.length()) / 2; + arrFB.add("-".repeat(dash_size) + sep + "-".repeat(longestFact - (dash_size + sep.length()))); + arrView.sort(null); + if (arrView.size() == 0) arrFB.add("(Empty)"); + else arrFB.addAll(arrView); + if (iterView.hasNext()) arrFB.add("..."); + sep = " Facts "; + } + arrFB.add(0,factBaseTitle); + dash_size = (longestFact - sep.length()) / 2; + arrFB.add("-".repeat(dash_size) + sep + "-".repeat(longestFact - (dash_size + sep.length()))); arrAtom.sort(null); - if (iter.hasNext()) arrAtom.add("..."); - arrAtom.add(0,factBaseTitle); - arrAtom.add(1,factBaseName); - arrAtom.add(2, "-".repeat(longestFact)); - matrix.add(arrAtom); + if (arrAtom.size() == 0) arrFB.add("(Empty)"); + else arrFB.addAll(arrAtom); + if (iterAtom.hasNext()) arrFB.add("..."); + matrix.add(arrFB); } if (this.rule) { List<String> arrRule = new ArrayList<>(); @@ -366,9 +430,9 @@ public class CECommands { } arrRule.sort(null); if (iter.hasNext()) arrRule.add("..."); + if (arrRule.size() == 0) arrRule.add("(Empty)"); arrRule.add(0,ruleBaseTitle); - arrRule.add(1,ruleBaseName); - arrRule.add(2, "-".repeat(longestRule)); + arrRule.add(1, "-".repeat(longestRule)); matrix.add(arrRule); } if (this.query) { @@ -390,9 +454,9 @@ public class CECommands { } arrQuery.sort(null); if (iter.hasNext()) arrQuery.add("..."); + if (arrQuery.size() == 0) arrQuery.add("(Empty)"); arrQuery.add(0,queryBaseTitle); - arrQuery.add(1,queryBaseName); - arrQuery.add(2, "-".repeat(longestQuery)); + arrQuery.add(1, "-".repeat(longestQuery)); matrix.add(arrQuery); } @@ -491,10 +555,28 @@ public class CECommands { StringWriter stringDlgpWriter = new StringWriter(); DlgpWriter dlgpW = new DlgpWriter(stringDlgpWriter); + + for (String factbase : this.factBases) { +// List<String> arrFact = new ArrayList<>(); + + FactBase fb = ComplexEnvironmentCommands.env.getFactBaseByName(factbase); + if (Checks.factbaseExists(factbase)) { + List<String> arrView = new ArrayList<>(); + if (fb instanceof FederatedFactBase ffb) { + Iterator<Predicate> iterView = ffb.getViewDefinitions().keySet().iterator(); + while (iterView.hasNext()) { + Predicate p = iterView.next(); + String fString = + p.label() + "/" + p.arity() + "\n"; + arrView.add(fString); + } + arrView.sort(null); + } + ArrayList<String> arrAtom = new ArrayList<>(); - Iterable<Atom> iter = ComplexEnvironmentCommands.env.getFactBaseByName(factbase).getAtoms()::iterator; + Iterable<Atom> iter = fb.getAtoms()::iterator; for (Atom a : iter) { dlgpW.write(a); dlgpW.flush(); @@ -502,7 +584,24 @@ public class CECommands { stringDlgpWriter.getBuffer().setLength(0); } arrAtom.sort(null); + if (arrAtom.size() == 0) arrAtom.add("(Empty)"); + if (arrView.size() == 0) arrView.add("(Empty)"); + +// if (arrView.size() != 0) { + arrView.add(0, "*********\n"); + arrView.add(1, "* Views *\n"); + arrView.add(2, "*********\n"); + arrView.add(3, "\n"); + + arrAtom.add(0, "\n\n*********\n"); + arrAtom.add(1, "* Facts *\n"); + arrAtom.add(2, "*********\n"); + arrAtom.add(3, "\n"); +// } + + for (String s : arrView) stringDlgpWriter.append(s); for (String s : arrAtom) stringDlgpWriter.append(s); + sources.add(new InputStreamSource(new ByteArrayInputStream(stringDlgpWriter.toString().getBytes(StandardCharsets.UTF_8)), true, factbase + " (facts)")); stringDlgpWriter.getBuffer().setLength(0); } @@ -517,6 +616,11 @@ public class CECommands { stringDlgpWriter.getBuffer().setLength(0); } arrRule.sort(null); + if (arrRule.size() == 0) arrRule.add("(Empty)"); + arrRule.add(0, "*********\n"); + arrRule.add(1, "* Rules *\n"); + arrRule.add(2, "*********\n"); + arrRule.add(3, "\n"); for (String s : arrRule) stringDlgpWriter.append(s); sources.add(new InputStreamSource(new ByteArrayInputStream(stringDlgpWriter.toString().getBytes(StandardCharsets.UTF_8)), true, rulebase + " (rules)")); stringDlgpWriter.getBuffer().setLength(0); @@ -533,6 +637,11 @@ public class CECommands { stringDlgpWriter.getBuffer().setLength(0); } arrQuery.sort(null); + if (arrQuery.size() == 0) arrQuery.add("(Empty)"); + arrQuery.add(0, "***********\n"); + arrQuery.add(1, "* Queries *\n"); + arrQuery.add(2, "***********\n"); + arrQuery.add(3, "\n"); for (String s : arrQuery) stringDlgpWriter.append(s); sources.add(new InputStreamSource(new ByteArrayInputStream(stringDlgpWriter.toString().getBytes(StandardCharsets.UTF_8)), true, querybase + " (queries)")); stringDlgpWriter.getBuffer().setLength(0); diff --git a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/ComplexEnvironment.java b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/ComplexEnvironment.java index 3248df6b2c31389d2f9bbe73bcddd9c7f2570c40..a7b0a4843bc0ce82a1fd5e4e46e9f35bcb088ce2 100644 --- a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/ComplexEnvironment.java +++ b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/ComplexEnvironment.java @@ -1,13 +1,19 @@ package fr.boreal.api.integraal_repl; import java.io.InputStream; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; +import fr.boreal.api.integraal_repl.CECommands.ComplexEnvironmentCommands; +import fr.boreal.api.integraal_repl.ComplexEnvironment.WriteMode; +import fr.boreal.api.integraal_repl.IGRepl.PrintLevel; import fr.boreal.io.api.ParseException; +import fr.boreal.io.dlgp.Directive; import fr.boreal.io.dlgp.DlgpParser; import fr.boreal.io.dlgp.DlgpUtil; import fr.boreal.model.kb.api.FactBase; @@ -21,7 +27,11 @@ import fr.boreal.model.logicalElements.factory.impl.SameObjectTermFactory; import fr.boreal.model.query.api.FOQuery; import fr.boreal.model.query.api.Query; import fr.boreal.model.rule.api.FORule; +import fr.boreal.storage.builder.StorageBuilder; import fr.boreal.storage.natives.SimpleInMemoryGraphStore; +import fr.boreal.views.FederatedFactBase; +import fr.boreal.views.builder.ViewBuilder; +import fr.boreal.views.builder.ViewBuilder.ViewBuilderException; /** * An object that represents an environment for a logic-based system. @@ -446,10 +456,51 @@ public class ComplexEnvironment { } /* TODO: - * - we are not taking are of redundancies here; should we? + * - we are not taking care of redundancies here; should we? * - add warning if one of the "bases" is empty in the dlgp file ? */ - public void loadDLGPFiles(String factBaseName, String ruleBaseName, String queryBaseName, InputStream[] dlgpList, WriteMode mode) throws ParseException { + // UNUSED +// public void loadDLGPFiles(String factBaseName, String ruleBaseName, String queryBaseName, InputStream[] dlgpList, WriteMode mode) throws ParseException { +// FactBase factbase = null; +// RuleBase rulebase = null; +// Collection<Query> querybase = null; +// +// if (factBaseName != null) { +// factbase = this.createFactBase(factBaseName, mode); +// } +// if (ruleBaseName != null ) { +// rulebase = this.createRuleBase(ruleBaseName, mode); +// } +// if (queryBaseName != null) { +// querybase = this.createQueryBase(queryBaseName, mode); +// } +// +// // TODO: the factories will probably annoy us because they won't allow for the same predicates with different arities over different bases +// // That might actually be desirable, if we need to mix and match different bases +// // try { +// +// for (InputStream dlgp : dlgpList) { +// DlgpParser dlgp_parser = new DlgpParser(dlgp); +// while (dlgp_parser.hasNext()) { +// Object result = dlgp_parser.next(); +// if (factbase != null && result instanceof Atom) { +// factbase.add((Atom) result); +// } else if (rulebase != null && result instanceof FORule) { +// rulebase.add((FORule) result); +// } else if (querybase != null && result instanceof FOQuery) { +// querybase.add((Query) result); +// } +// } +// dlgp_parser.close(); +// } +// } + + // UNUSED +// public void loadDLGPFile(String factBaseName, String ruleBaseName, String queryBaseName, InputStream dlgp, WriteMode mode) throws ParseException { +// this.loadDLGPFiles(factBaseName, ruleBaseName, queryBaseName, new InputStream[] {dlgp}, mode); +// } + + public void loadDLGPFile(String factBaseName, String ruleBaseName, String queryBaseName, InputStream dlgp, Path dlgpFileSourcePath, WriteMode mode) throws ParseException { FactBase factbase = null; RuleBase rulebase = null; Collection<Query> querybase = null; @@ -464,28 +515,41 @@ public class ComplexEnvironment { querybase = this.createQueryBase(queryBaseName, mode); } - // TODO: the factories will probably annoy us because they won't allow for the same predicates with different arities over different bases - // That might actually be desirable, if we need to mix and match different bases - // try { - - for (InputStream dlgp : dlgpList) { - DlgpParser dlgp_parser = new DlgpParser(dlgp); - while (dlgp_parser.hasNext()) { - Object result = dlgp_parser.next(); - if (factbase != null && result instanceof Atom) { - factbase.add((Atom) result); - } else if (rulebase != null && result instanceof FORule) { - rulebase.add((FORule) result); - } else if (querybase != null && result instanceof FOQuery) { - querybase.add((Query) result); + DlgpParser dlgp_parser = new DlgpParser(dlgp); + while (dlgp_parser.hasNext()) { + Object result = dlgp_parser.next(); + if (factbase != null && result instanceof Atom) { + factbase.add((Atom) result); + } else if (rulebase != null && result instanceof FORule) { + rulebase.add((FORule) result); + } else if (querybase != null && result instanceof FOQuery) { + querybase.add((Query) result); + } else if (result instanceof Directive) { + // TODO: we should probably have a subroutine that is called here and in the mapping command + if (dlgpFileSourcePath != null) { + // TODO: For now, VD file, if present, is only loaded if fileSourcePath is not null + // It can be considered as a flag meaning we should load the VD file, in addition to provide the path (of the dlgp file) + if (((Directive) result).type() == Directive.Type.VIEW) { + String value = (String) ((Directive) result).value(); + // If the path is not absolute, we use the dlgp file path as origin + Path vdPath = Paths.get(value); + if (!vdPath.isAbsolute()) { + vdPath = dlgpFileSourcePath.getParent().resolve(vdPath); + } + + FederatedFactBase federation; + if (factbase == null) factbase = new SimpleInMemoryGraphStore(); + try { + federation = new FederatedFactBase(factbase, ViewBuilder.createFactBases(vdPath.toString())); + this.putFactBase(factBaseName, federation, mode); + } catch (ViewBuilderException e) { + IGRepl.writeIfVerbose("An error occurred while parsing the view definition file. Skipping.\n", PrintLevel.MAXIMAL); + IGRepl.writeIfVerbose(e.getMessage(), PrintLevel.MAXIMAL); + } + } } } - dlgp_parser.close(); } - // } - } - - public void loadDLGPFile(String factBaseName, String ruleBaseName, String queryBaseName, InputStream dlgp, WriteMode mode) throws ParseException { - this.loadDLGPFiles(factBaseName, ruleBaseName, queryBaseName, new InputStream[] {dlgp}, mode); + dlgp_parser.close(); } } diff --git a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/IGCommands.java b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/IGCommands.java index cbda2af9dff3e69f9f2dfad9ec01562d6190f1c7..2e1472c3d2fb6f88c6e9bc1573f57e73dc649db3 100644 --- a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/IGCommands.java +++ b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/IGCommands.java @@ -7,9 +7,12 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.StringJoiner; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -24,6 +27,10 @@ import fr.boreal.api.high_level_api.EndUserAPI; import fr.boreal.api.high_level_api.HybridRuleBase; import fr.boreal.api.integraal_repl.ComplexEnvironment.WriteMode; import fr.boreal.api.integraal_repl.IGRepl.PrintLevel; +import fr.boreal.component_builder.externalHaltingConditions.ExternalHaltingCondition; +import fr.boreal.component_builder.externalHaltingConditions.ExternalHaltingConditionFactory; +import fr.boreal.configuration.keywords.InteGraalKeywords; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation; import fr.boreal.io.api.ParseException; import fr.boreal.io.dlgp.DlgpUtil; import fr.boreal.io.dlgp.DlgpWriter; @@ -32,14 +39,12 @@ import fr.boreal.model.kb.api.RuleBase; import fr.boreal.model.kb.impl.RuleBaseImpl; import fr.boreal.model.logicalElements.api.Atom; import fr.boreal.model.logicalElements.api.Substitution; +import fr.boreal.model.logicalElements.api.Term; +import fr.boreal.model.logicalElements.api.Variable; import fr.boreal.model.query.api.FOQuery; import fr.boreal.model.query.api.Query; import fr.boreal.model.rule.api.FORule; import fr.boreal.storage.natives.SimpleInMemoryGraphStore; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalHaltingCondition; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalHaltingConditionFactory; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation; import picocli.CommandLine; import picocli.CommandLine.Command; import picocli.CommandLine.Help; @@ -81,34 +86,58 @@ public class IGCommands { * Prints the substitutions from the iterator. * * @param subIt The iterator of substitutions containing the query results. + * @param varsOrder The variables to print; this provides the order of the variables * @param writer The DlgpWriter object used to write the results.break; * @param max The maximum number of substitutions to print. */ // TODO: This method should return a string instead - public static void printSubstitutions(Iterator<Substitution> subIt, DlgpWriter writer, Integer max) { - try { - if (subIt.hasNext()) { - while (subIt.hasNext()) { - if (max != null && max == 0) - return; - Substitution sub = subIt.next(); - if (sub.isEmpty()) { - writer.write("True\n"); - writer.flush(); - } else { - writer.write(sub.toString()); - writer.write("\n"); - writer.flush(); + public static void printSubstitutions(Iterator<Substitution> subIt, Collection<Variable> varsOrder, DlgpWriter writer, Integer max) { + boolean stop = false; + if (max != null && max == 0) + stop = true; + + // First, let's see if we have no answer (in that case, the query is false) + if (!subIt.hasNext()) { + IGRepl.writeIfVerbose("False\n", PrintLevel.MINIMAL); + } else { // Here we have at least one answer + // Let's check if the first answer is "empty" (in that case, there is only constant and + // no substitution: the query is true) + // Note that if the user ask for 0 answer, this will behave as if the substitution is empty + Substitution sub = subIt.next(); + if (sub.isEmpty() || stop) { + IGRepl.writeIfVerbose("True\n", PrintLevel.MINIMAL); + // Since it is true, there is no need to continue +// return; + } else { + // We have some substitutions, so some variables, hence let's print them + // TODO: here print the header of the "table" with only the variables +// String varStr = varsOrder.stream().map(Variable::toString).collect(Collectors.joining(" | ")); +// String varSep = "-".repeat(varStr.length()); +// IGRepl.writeIfVerbose("|" + varStr + "|\n", PrintLevel.MINIMAL); +// IGRepl.writeIfVerbose("|" + varSep + "|\n", PrintLevel.MINIMAL); + + // Then print the first substitution that has already been extracted + Map<Variable, Term> subMap = sub.toMap(); + StringJoiner str = new StringJoiner(", "); + for (Variable var : varsOrder) { + str.add(var + " : " + subMap.get(var).toString()); + } + IGRepl.writeIfVerbose(str.toString() + "\n", PrintLevel.MINIMAL); + + // Then, let's continue with the remainder + while (subIt.hasNext() && !stop) { + subMap = subIt.next().toMap(); + str = new StringJoiner(", "); + for (Variable var : varsOrder) { + str.add(var + " : " + subMap.get(var).toString()); + } + IGRepl.writeIfVerbose(str.toString() + "\n", PrintLevel.MINIMAL); + + if (max != null && max-- == 0) { + stop = true; } - if (max != null) - max--; } - } else { - writer.write("False\n"); - writer.flush(); - } - } catch (IOException e) { - IGRepl.systemRegistry.trace(e); + } } } @@ -629,40 +658,48 @@ public class IGCommands { PrintLevel.WARNING); } IGRepl.writeIfVerbose("\n", PrintLevel.MINIMAL); - if (!ucq) { + if (!ucq) { int index = 1; for (Query query : queriesToUse) { - IGRepl.writeIfVerbose("Query " + index++ + ": ", PrintLevel.MINIMAL); - IGRepl.writeIfVerbose(query, PrintLevel.MINIMAL); - IGRepl.writeIfVerbose("\n", PrintLevel.MINIMAL); - InteGraalCommands.printSubstitutions(EndUserAPI.evaluateOld(factsToUse, query), IGRepl.dlgpWriter, + IGRepl.writeIfVerbose("Query " + index++ + ": " + query + "\n", PrintLevel.MINIMAL); + InteGraalCommands.printSubstitutions(EndUserAPI.evaluateOld(factsToUse, query), query.getAnswerVariables(), IGRepl.dlgpWriter, max); IGRepl.writeIfVerbose("\n", PrintLevel.MINIMAL); } - } else { + } + else { // Here, we basically reconstruct the string that represents the UCQ to have // something pretty // (something like ?(X,...,Z) :- pred1(X,...) | pred2(Y,...) ) - List<FOQuery<?>> queriesToUseTyped = List.of(); - for (Query q : queriesToUseTyped) { + // First, let's convert the Queries into FOQueries + // (and if a query is not instance of FOQueries, it is skipped) + List<FOQuery<?>> queriesToUseTyped = new ArrayList<FOQuery<?>>(); + for (Query q : queriesToUse) { if (q instanceof FOQuery<?> qq) { queriesToUseTyped.add(qq); } else { - LOG.error("Wrong query type when reconstructing the UCQ from a set"); + LOG.error("Wrong query type on " + q + " when reconstructing the UCQ from a set. Skipped"); } + } + + // Then, let's obtain the answer variables (and their order) that are needed + // both for printing and evaluating + Collection<Variable> ansVarsOrder = new LinkedHashSet<Variable>(); + + StringJoiner formulasJoiner = new StringJoiner(" | "); + for (FOQuery q : queriesToUseTyped) { + ansVarsOrder.addAll(q.getAnswerVariables()); + formulasJoiner.add(q.getFormula().toString()); } - - String ucqStr = "UCQ: " + queriesToUseTyped.stream() - // TODO: probably the most hideous line of code ever, but oh well... - .map(q -> "?(" + String.join(",", - q.getAnswerVariables().stream().map(Object::toString).toArray(CharSequence[]::new)) - + ") :- " + q.getFormula() + ".") - .collect(Collectors.joining(" | ")); + + String ucqStr = "UCQ: " + "?(" + + ansVarsOrder.stream().map(Variable::toString).collect(Collectors.joining(",")) + + ") :- " + formulasJoiner.toString() + "."; IGRepl.writeIfVerbose(ucqStr + "\n", PrintLevel.MINIMAL); - + InteGraalCommands.printSubstitutions(EndUserAPI.evaluateOld(factsToUse, queriesToUse), - IGRepl.dlgpWriter, max); + ansVarsOrder, IGRepl.dlgpWriter, max); IGRepl.writeIfVerbose("\n", PrintLevel.MINIMAL); } } diff --git a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/EndUserAPITest.java b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/EndUserAPITest.java index 42b6f7a5561b811ece928d0591a0ada06b291b79..86459069704a8d4c6ca0efa5a08db2090c1fb8ee 100644 --- a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/EndUserAPITest.java +++ b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/EndUserAPITest.java @@ -19,6 +19,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import fr.boreal.api.high_level_api.EndUserAPI; +import fr.boreal.configuration.keywords.InteGraalKeywords; import fr.boreal.configuration.parameters.IGParameter; import fr.boreal.io.dlgp.DlgpParser; import fr.boreal.io.dlgp.ParserResult; @@ -33,7 +34,6 @@ import fr.boreal.storage.builder.StorageBuilder; import fr.boreal.storage.natives.SimpleInMemoryGraphStore; import fr.boreal.views.FederatedFactBase; import fr.boreal.views.builder.ViewBuilder; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; @RunWith(Parameterized.class) class EndUserAPITest { diff --git a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/QueryAnsweringViaEndUserAPITest.java b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/QueryAnsweringViaEndUserAPITest.java index bd266eb5709968fad8b23fad04a2dd3f36cd0975..ff01424a9369f40365f08b8ccc6d9ffebf1e190d 100644 --- a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/QueryAnsweringViaEndUserAPITest.java +++ b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/QueryAnsweringViaEndUserAPITest.java @@ -11,12 +11,12 @@ import org.junit.jupiter.params.provider.MethodSource; import org.junit.runners.Parameterized.Parameters; import fr.boreal.api.high_level_api.EndUserAPI; +import fr.boreal.configuration.keywords.InteGraalKeywords; import fr.boreal.configuration.parameters.IGParameter; import fr.boreal.io.dlgp.DlgpParser; import fr.boreal.io.dlgp.ParserResult; import fr.boreal.model.kb.api.FactBase; import fr.boreal.storage.natives.SimpleInMemoryGraphStore; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; /** * Checks that rewritings are correctly computed when using the EndUserAPI diff --git a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/RewritingViaEndUserAPITest.java b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/RewritingViaEndUserAPITest.java index ac926e4bbef4949425cbce1563f5f6c28e1ca754..fc2f93f5b85ab81beb5feba305233ea7838c5158 100644 --- a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/RewritingViaEndUserAPITest.java +++ b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/RewritingViaEndUserAPITest.java @@ -12,6 +12,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.junit.runners.Parameterized.Parameters; import fr.boreal.api.high_level_api.EndUserAPI; +import fr.boreal.configuration.keywords.InteGraalKeywords; import fr.boreal.configuration.parameters.IGParameter; import fr.boreal.io.api.ParseException; import fr.boreal.io.dlgp.DlgpParser; @@ -22,7 +23,6 @@ import fr.boreal.model.query.api.FOQuery; import fr.boreal.model.query.api.Query; import fr.boreal.model.query.impl.UnionFOQuery; import fr.boreal.model.rule.api.FORule; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; /** * Checks that rewritings are correctly computed when using the EndUserAPI diff --git a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/SaturationViaEndUserAPITest.java b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/SaturationViaEndUserAPITest.java index 5270fa07b4823f92dec5e5b4f447c9a5cc812f3a..8e24cc821353d688021cd7278579be23707bf9e2 100644 --- a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/SaturationViaEndUserAPITest.java +++ b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/SaturationViaEndUserAPITest.java @@ -13,6 +13,8 @@ import org.junit.jupiter.params.provider.MethodSource; import org.junit.runners.Parameterized.Parameters; import fr.boreal.api.high_level_api.EndUserAPI; +import fr.boreal.configuration.keywords.InteGraalKeywords; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms; import fr.boreal.configuration.parameters.IGParameter; import fr.boreal.io.dlgp.DlgpParser; import fr.boreal.io.dlgp.ParserResult; @@ -21,8 +23,6 @@ import fr.boreal.model.kb.api.RuleBase; import fr.boreal.model.kb.impl.RuleBaseImpl; import fr.boreal.model.logicalElements.api.Atom; import fr.boreal.storage.natives.SimpleInMemoryGraphStore; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms; /* * Checks that rewritings are correctly computed when using the EndUserAPI diff --git a/integraal/integraal-backward-chaining/src/main/java/module-info.java b/integraal/integraal-backward-chaining/src/main/java/module-info.java index 972d91909145cd480f19f7b5368471968716f73d..2c4e89e643b9b3756dbd25c0d47345608fc13279 100644 --- a/integraal/integraal-backward-chaining/src/main/java/module-info.java +++ b/integraal/integraal-backward-chaining/src/main/java/module-info.java @@ -21,7 +21,6 @@ module fr.boreal.backward_chaining { exports fr.boreal.backward_chaining.api; exports fr.boreal.backward_chaining.core; exports fr.boreal.backward_chaining.cover; - exports fr.boreal.backward_chaining.evaluators; exports fr.boreal.backward_chaining.homomorphism; exports fr.boreal.backward_chaining.pure; exports fr.boreal.backward_chaining.pure.rewriting_operator; diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/AlgorithmParameters.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/AlgorithmParameters.java index 12e37c5a7a9bfe7d4e04c4f9d6b1ad844605e2db..483207fdd025398dac1a08b9190e93ee32ab433a 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/AlgorithmParameters.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/AlgorithmParameters.java @@ -10,26 +10,28 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import fr.boreal.component_builder.api.algorithm.IAlgorithmParameters; +import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions; import fr.boreal.component_builder.utils.StringUtils; +import fr.boreal.configuration.keywords.InteGraalKeywords; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms; +import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Answers; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Images; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Application; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Applier; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Checker; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Computer; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Evaluator; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Scheduler; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Skolem; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Transformer; +import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration.DBMSDriverParameters; +import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration.DBType; +import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration.DriverType; +import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration.StorageLayout; import fr.boreal.configuration.parameters.IGParameter; import fr.lirmm.boreal.util.enumerations.EnumUtils; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Answers; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Images; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Application; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Applier; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Checker; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Computer; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Scheduler; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Skolem; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration.DBMSDriverParameters; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration.DBType; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration.DriverType; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration.StorageLayout; /** * Default implementation for {@link IAlgorithmParameters}. @@ -62,7 +64,9 @@ public class AlgorithmParameters implements IAlgorithmParameters { private Application application; private Applier applier; private Skolem skolem; - + private Evaluator evaluator; // added by Michel + private Transformer transformer; // added by Michel + // TODO check transfer of IntegralParameters to AlgorithmParameters // storage private DBType dbtype; private DriverType driverType; @@ -220,6 +224,16 @@ public class AlgorithmParameters implements IAlgorithmParameters { return Optional.ofNullable(skolem); } + @Override + public Optional<Evaluator> getEvaluator() { + return Optional.ofNullable(evaluator); + } + + @Override + public Optional<Transformer> getTransformer() { + return Optional.ofNullable(transformer); + } + @Override public Optional<DBType> getStorageType() { return Optional.ofNullable(dbtype); @@ -514,6 +528,42 @@ public class AlgorithmParameters implements IAlgorithmParameters { return setParameter(skolemization); } + /** + * Sets the chase evaluator by matching the input string to an enum + * constant and then calling {@link #setParameter(Enum)}. + * + * @param evaluatorName the name of the evaluator + * @return this {@link IAlgorithmParameters} instance for method chaining + */ + public IAlgorithmParameters setEvaluator(String evaluatorName) { + return setParameter(EnumUtils.findEnumFromString(evaluatorName, + InteGraalKeywords.Algorithms.Parameters.Chase.Evaluator.class)); + } + + @Override + public IAlgorithmParameters setEvaluator(Evaluator evaluator) { + return setParameter(evaluator); + } + + + /** + * Sets the chase transformer by matching the input string to an enum + * constant and then calling {@link #setParameter(Enum)}. + * + * @param transformerName the name of the transformer + * @return this {@link IAlgorithmParameters} instance for method chaining + */ + public IAlgorithmParameters setTransformer(String transformerName) { + return setParameter(EnumUtils.findEnumFromString(transformerName, + InteGraalKeywords.Algorithms.Parameters.Chase.Transformer.class)); + } + + @Override + public IAlgorithmParameters setTransformer(Transformer transformer) { + return setParameter(transformer); + } + + /** * Sets the compilation approach (e.g., "DEFAULT") by matching the input string * to an enum constant and then calling {@link #setParameter(Enum)}. diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/ComponentBuilder.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/ComponentBuilder.java index ec797c17e055aa86d675976b601a60d034770310..e97d9f1b6ad8f10c3c56d04d45966bcf399cdbf1 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/ComponentBuilder.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/ComponentBuilder.java @@ -10,20 +10,26 @@ import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import fr.boreal.backward_chaining.evaluators.QueryRewriter; import fr.boreal.component_builder.api.IComponentBuilder; import fr.boreal.component_builder.api.IOperationResult; import fr.boreal.component_builder.api.algorithm.IAlgorithmParameters; import fr.boreal.component_builder.api.scenario.IInputDataScenario; import fr.boreal.component_builder.components.ChaseComponentBuilder; +import fr.boreal.component_builder.evaluators.query_evaluation.CountingQueryEvaluatorWithMultiEvaluator; import fr.boreal.component_builder.components.FactBaseLoaderFromFile; import fr.boreal.component_builder.components.QueryAnsweringComponentBuilder; +import fr.boreal.component_builder.evaluators.query_evaluation.QueryEvaluatorWithMultiEvaluator; +import fr.boreal.component_builder.evaluators.query_rewriting.QueryRewriterWitMultiEvaluator; import fr.boreal.component_builder.components.RewritingComponentBuilder; +import fr.boreal.component_builder.evaluators.generic.MultiEvaluator; +import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions; import fr.boreal.component_builder.operations.FactBaseLoadingOperationResult; import fr.boreal.component_builder.operations.OperationNotPerformed; import fr.boreal.component_builder.operations.QueryBaseLoadingOperationResult; import fr.boreal.component_builder.operations.RuleBaseLoadingOperationResult; import fr.boreal.component_builder.operations.RuleCompilationOperationResult; +import fr.boreal.configuration.keywords.InteGraalKeywords; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms; import fr.boreal.forward_chaining.chase.Chase; import fr.boreal.io.dlgp.DlgpParser; import fr.boreal.model.kb.api.FactBase; @@ -36,15 +42,9 @@ import fr.boreal.model.ruleCompilation.NoRuleCompilation; import fr.boreal.model.ruleCompilation.api.RuleCompilation; import fr.boreal.model.ruleCompilation.api.RuleCompilationResult; import fr.boreal.model.ruleCompilation.id.IDRuleCompilation; -import fr.boreal.query_evaluation.component.CountingQueryEvaluator; -import fr.boreal.query_evaluation.component.QueryEvaluationInput; -import fr.boreal.query_evaluation.component.QueryEvaluationOutput; -import fr.boreal.query_evaluation.component.QueryEvaluatorWithMultiEvaluator; +import fr.boreal.component_builder.evaluators.query_evaluation.auxiliary.QueryEvaluationInput; +import fr.boreal.component_builder.evaluators.query_evaluation.auxiliary.QueryEvaluationOutput; import fr.boreal.storage.external.rdbms.RDBMSStore; -import fr.lirmm.boreal.util.evaluator.MultiEvaluator; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms; /** * @@ -66,7 +66,7 @@ public class ComponentBuilder implements IComponentBuilder { private Optional<MultiEvaluator<QueryEvaluationInput, QueryEvaluationOutput>> queryEvaluator; private Optional<Chase> chaseAlgorithm; - private Optional<QueryRewriter> rewriter; + private Optional<QueryRewriterWitMultiEvaluator> rewriter; private Optional<RuleCompilationResult> compilResult; private RuleCompilation compilation; // assumed to be always set @@ -190,7 +190,7 @@ public class ComponentBuilder implements IComponentBuilder { * @return a rewriting algorithm based on the current configuration */ - public QueryRewriter buildOrGetRewriter() { + public QueryRewriterWitMultiEvaluator buildOrGetRewriter() { checkRewritingService(); @@ -200,7 +200,7 @@ public class ComponentBuilder implements IComponentBuilder { checkNecessaryElementsForComponent(List.of(querybase, ruleset), InteGraalKeywords.Algorithms.OMQ_REWRITING); - QueryRewriter customizedRewriter = RewritingComponentBuilder.prepareAndGetRewriterFrom(getQueries(), + QueryRewriterWitMultiEvaluator customizedRewriter = RewritingComponentBuilder.prepareAndGetRewriterFrom(getQueries(), getRulebase(), integraalAlgorithmParameters); this.rewriter = Optional.of(customizedRewriter); @@ -246,17 +246,17 @@ public class ComponentBuilder implements IComponentBuilder { * * @return a query evaluator based on the current configuration */ - public CountingQueryEvaluator buildOrGetCountingQueryAnsweringAlgorithm() { + public CountingQueryEvaluatorWithMultiEvaluator buildOrGetCountingQueryAnsweringAlgorithm() { checkQueryAnsweringService(); if (queryEvaluator.isPresent()) { - return (CountingQueryEvaluator) queryEvaluator.get(); + return (CountingQueryEvaluatorWithMultiEvaluator) queryEvaluator.get(); } checkNecessaryElementsForComponent(List.of(querybase, factbase), InteGraalKeywords.Algorithms.OMQ_REWRITING); - CountingQueryEvaluator customizedEvaluator = QueryAnsweringComponentBuilder + CountingQueryEvaluatorWithMultiEvaluator customizedEvaluator = QueryAnsweringComponentBuilder .prepareAndGetCountingQueryAnsweringFrom(getQueries(), getFactbase(), this.integraalAlgorithmParameters); diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/InputDataScenario.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/InputDataScenario.java index 7372ffcf35cdccf6f8310a3e217112964bfd4d1c..36710e37d690db6f6e7e5fd6b3559f5c605d08f0 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/InputDataScenario.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/InputDataScenario.java @@ -9,11 +9,11 @@ import org.slf4j.LoggerFactory; import fr.boreal.component_builder.api.scenario.IInputDataScenario; import fr.boreal.component_builder.utils.StringUtils; +import fr.boreal.configuration.keywords.InteGraalKeywords; import fr.boreal.model.kb.api.FactBase; import fr.boreal.model.kb.api.RuleBase; import fr.boreal.model.query.api.Query; import fr.boreal.views.FederatedFactBase; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; import radicchio.FileUtils; /** diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/IComponentBuilder.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/IComponentBuilder.java index a460de509235028dadca543820bdd9da949eb003..96c5f9284c13215a3b180f449164b93dc3c003dc 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/IComponentBuilder.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/IComponentBuilder.java @@ -3,20 +3,20 @@ package fr.boreal.component_builder.api; import java.util.Collection; import java.util.Set; -import fr.boreal.backward_chaining.evaluators.QueryRewriter; import fr.boreal.component_builder.ComponentBuilder; import fr.boreal.component_builder.api.algorithm.IAlgorithmParameters; import fr.boreal.component_builder.api.scenario.IInputDataScenario; +import fr.boreal.component_builder.evaluators.query_evaluation.QueryEvaluatorWithMultiEvaluator; +import fr.boreal.component_builder.evaluators.query_rewriting.QueryRewriterWitMultiEvaluator; +import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions; +import fr.boreal.component_builder.externalHaltingConditions.ExternalHaltingCondition; +import fr.boreal.configuration.keywords.InteGraalKeywords; import fr.boreal.configuration.parameters.IGParameter; import fr.boreal.forward_chaining.chase.Chase; import fr.boreal.model.kb.api.FactBase; import fr.boreal.model.kb.api.RuleBase; import fr.boreal.model.query.api.Query; import fr.boreal.model.ruleCompilation.api.RuleCompilationResult; -import fr.boreal.query_evaluation.component.QueryEvaluatorWithMultiEvaluator; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalHaltingCondition; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; /** * Interface for building various InteGraal components related to query @@ -83,11 +83,11 @@ public interface IComponentBuilder { * @param rb the rule base for rewriting. * @param queries a collection of queries to be rewritten. * @param params the parameters for storage and halting conditions - * @return an instance of {@link QueryRewriter} configured for query rewriting, + * @return an instance of {@link QueryRewriterWitMultiEvaluator} configured for query rewriting, * or {@code null} in case of an error. */ - static QueryRewriter buildAndGetOMQRewriter(RuleBase rb, Collection<Query> queries, - IGParameter<InteGraalKeywords, ?>... params) { + static QueryRewriterWitMultiEvaluator buildAndGetOMQRewriter(RuleBase rb, Collection<Query> queries, + IGParameter<InteGraalKeywords, ?>... params) { IInputDataScenario inputOMQ = IInputDataScenario.OMQ(rb, queries); IAlgorithmParameters algoParam = IAlgorithmParameters.Rewriting(params); var builder = createBuilderFrom(inputOMQ, algoParam); @@ -189,11 +189,11 @@ public interface IComponentBuilder { * @param ruleCompilation the rule compilation method (optional, null means no * compilation). * @param conds he external halting conditions (e.g., timeout, rank). - * @return an instance of {@link QueryRewriter} configured for query rewriting, + * @return an instance of {@link QueryRewriterWitMultiEvaluator} configured for query rewriting, * or {@code null} in case of an error. */ - static QueryRewriter buildAndGetOMQRewriter(RuleBase rb, Collection<Query> queries, - InteGraalKeywords.Algorithms.Parameters.Compilation ruleCompilation, ExternalHaltingCondition... conds) { + static QueryRewriterWitMultiEvaluator buildAndGetOMQRewriter(RuleBase rb, Collection<Query> queries, + InteGraalKeywords.Algorithms.Parameters.Compilation ruleCompilation, ExternalHaltingCondition... conds) { IInputDataScenario inputOMQ = IInputDataScenario.OMQ(rb, queries); IAlgorithmParameters algoParam = IAlgorithmParameters.Rewriting(ruleCompilation, new ExternalAlgorithmHaltingConditions(conds)); @@ -210,12 +210,12 @@ public interface IComponentBuilder { * compilation). * @param params the external halting conditions (e.g., timeout, rank) * and the compilation type - * @return an instance of {@link QueryRewriter} configured for query rewriting, + * @return an instance of {@link QueryRewriterWitMultiEvaluator} configured for query rewriting, * or {@code null} in case of an error. */ - static QueryRewriter buildAndGetOMQRewriter(RuleBase rb, Collection<Query> queries, - InteGraalKeywords.Algorithms.Parameters.Compilation ruleCompilation, - IGParameter<InteGraalKeywords, ?>... params) { + static QueryRewriterWitMultiEvaluator buildAndGetOMQRewriter(RuleBase rb, Collection<Query> queries, + InteGraalKeywords.Algorithms.Parameters.Compilation ruleCompilation, + IGParameter<InteGraalKeywords, ?>... params) { IInputDataScenario inputOMQ = IInputDataScenario.OMQ(rb, queries); IAlgorithmParameters algoParam = IAlgorithmParameters.Rewriting(params); var builder = createBuilderFrom(inputOMQ, algoParam); @@ -314,9 +314,9 @@ public interface IComponentBuilder { /** * Builds or gets the query rewriter component. * - * @return the {@link QueryRewriter} component. + * @return the {@link QueryRewriterWitMultiEvaluator} component. */ - QueryRewriter buildOrGetRewriter(); + QueryRewriterWitMultiEvaluator buildOrGetRewriter(); /** * Builds or gets the query answering algorithm component. diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAlgorithmParameters.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAlgorithmParameters.java index e37022a9d4fb63364a9e9fce68f5fa1365b6c439..c3678738ca0847e407d7d26a4db44eb06ed708c5 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAlgorithmParameters.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAlgorithmParameters.java @@ -1,11 +1,11 @@ package fr.boreal.component_builder.api.algorithm; import fr.boreal.component_builder.AlgorithmParameters; +import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions; +import fr.boreal.configuration.keywords.InteGraalKeywords; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation; import fr.boreal.configuration.parameters.IGParameter; import fr.lirmm.boreal.util.enumerations.EnumUtils; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation; /** * Contains parameters for an InteGraal algorithm or service. diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAnswerType.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAnswerType.java index d5f73fec81f16b638d349af24a8837401d08c107..8caf386af35eba82034a24956a53579a9d7fe4d0 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAnswerType.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAnswerType.java @@ -1,7 +1,7 @@ package fr.boreal.component_builder.api.algorithm; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Answers; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Images; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Answers; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Images; /** * Interface for count-only queries. diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IBackwardChainingParameters.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IBackwardChainingParameters.java index 5bf86c9cc622c9f86358c3e2cc884edf1285065a..600c068204c2357452b7ee0b35f4044a15cb7a53 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IBackwardChainingParameters.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IBackwardChainingParameters.java @@ -2,7 +2,7 @@ package fr.boreal.component_builder.api.algorithm; import java.util.Optional; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; +import fr.boreal.configuration.keywords.InteGraalKeywords; /** * Interface for compilation parameters. diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IEnvironmentExecutionParameters.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IEnvironmentExecutionParameters.java index 43510e5fb06b2426f727499092a1002c5de2a0f2..b0566f014e936ac4815285c8a05762d8baa95e38 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IEnvironmentExecutionParameters.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IEnvironmentExecutionParameters.java @@ -3,7 +3,7 @@ package fr.boreal.component_builder.api.algorithm; import java.time.Duration; import java.util.Optional; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions; +import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions; interface IEnvironmentExecutionParameters { diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IForwardChainingParameters.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IForwardChainingParameters.java index f538c9c0c2b0044b52a7fdd632603ec575c019f6..27ec587801265cff034ac34fea73e99ec7c9ba04 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IForwardChainingParameters.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IForwardChainingParameters.java @@ -2,7 +2,7 @@ package fr.boreal.component_builder.api.algorithm; import java.util.Optional; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; +import fr.boreal.configuration.keywords.InteGraalKeywords; /** * Interface for specifying the parameters related to a chase algorithm. The @@ -120,4 +120,37 @@ interface IForwardChainingParameters { * @return the configuration with settled value */ IAlgorithmParameters setSkolemization(InteGraalKeywords.Algorithms.Parameters.Chase.Skolem skolemizationName); + + /** + * Gets the evaluator used in the chase algorithm. + * + * @return an Optional containing the evaluator, or an empty + * Optional if not set + */ + Optional<InteGraalKeywords.Algorithms.Parameters.Chase.Evaluator> getEvaluator(); + + /** + * Sets the evaluator to be used in the chase algorithm. + * + * @param evaluatorName the evaluator to be set + * @return the configuration with settled value + */ + IAlgorithmParameters setEvaluator(InteGraalKeywords.Algorithms.Parameters.Chase.Evaluator evaluatorName); + + /** + * Gets the transformer used in the chase algorithm. + * + * @return an Optional containing the transformer, or an empty + * Optional if not set + */ + Optional<InteGraalKeywords.Algorithms.Parameters.Chase.Transformer> getTransformer(); + + /** + * Sets the transformer to be used in the chase algorithm. + * + * @param transformerName the transformer to be set + * @return the configuration with settled value + */ + IAlgorithmParameters setTransformer(InteGraalKeywords.Algorithms.Parameters.Chase.Transformer transformerName); + } diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IStorageParameters.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IStorageParameters.java index e8f0c22512041108fafa5413be5303d52f6b52b7..01d12d1ade0ae25b5624eddcbc4b3a149579d56b 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IStorageParameters.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IStorageParameters.java @@ -3,7 +3,7 @@ package fr.boreal.component_builder.api.algorithm; import java.util.Map; import java.util.Optional; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration; +import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration; /** * Interface for storage parameters. diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/FactBaseLoaderFromFile.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/FactBaseLoaderFromFile.java index d77fb2a764f2ee15496f79f43ad8c0b3811aa2f0..d2b3f247286aea6c25a544a265523d7401613786 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/FactBaseLoaderFromFile.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/FactBaseLoaderFromFile.java @@ -2,6 +2,8 @@ package fr.boreal.component_builder.components; import fr.boreal.component_builder.api.algorithm.IAlgorithmParameters; import fr.boreal.component_builder.api.scenario.IInputDataScenario; +import fr.boreal.configuration.keywords.InteGraalKeywords.SupportedFileExtensions; +import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration.StorageLayout; import fr.boreal.io.api.Parser; import fr.boreal.io.csv.CSVLoader; import fr.boreal.io.csv.CSVParser; @@ -13,8 +15,6 @@ import fr.boreal.model.logicalElements.api.Atom; import fr.boreal.storage.builder.StorageBuilder; import fr.boreal.views.FederatedFactBase; import fr.boreal.views.builder.ViewBuilder; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.SupportedFileExtensions; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration.StorageLayout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/QueryAnsweringComponentBuilder.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/QueryAnsweringComponentBuilder.java index ddce2d94d68687ea48b6fc02b36297740cfab665..7764cfc44cafa6788bc404541d0c5d5f9672e631 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/QueryAnsweringComponentBuilder.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/QueryAnsweringComponentBuilder.java @@ -4,12 +4,12 @@ import java.util.Collection; import java.util.Objects; import fr.boreal.component_builder.api.algorithm.IAlgorithmParameters; +import fr.boreal.component_builder.evaluators.query_evaluation.CountingQueryEvaluatorWithMultiEvaluator; +import fr.boreal.component_builder.evaluators.query_evaluation.QueryEvaluatorWithMultiEvaluator; +import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions; +import fr.boreal.configuration.keywords.InteGraalKeywords; import fr.boreal.model.kb.api.FactBase; import fr.boreal.model.query.api.Query; -import fr.boreal.query_evaluation.component.CountingQueryEvaluator; -import fr.boreal.query_evaluation.component.QueryEvaluatorWithMultiEvaluator; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; /** * A builder class for preparing and creating components for query answering @@ -48,10 +48,10 @@ public class QueryAnsweringComponentBuilder { } /** - * Prepares and returns a {@link CountingQueryEvaluator} for answering the given + * Prepares and returns a {@link CountingQueryEvaluatorWithMultiEvaluator} for answering the given * set of queries over the provided fact base, with optional external halting * conditions to limit non-terminating algorithms. The - * {@link CountingQueryEvaluator} counts the number of answers in addition to + * {@link CountingQueryEvaluatorWithMultiEvaluator} counts the number of answers in addition to * performing the query evaluation. * * @param queries a collection of {@link Query} objects to be evaluated over @@ -61,14 +61,14 @@ public class QueryAnsweringComponentBuilder { * @param ap optional conditions used to limit the evaluation process, * such as timeouts or maximum number of states, as well as the * type of answers. - * @return a {@link CountingQueryEvaluator} configured to answer the given + * @return a {@link CountingQueryEvaluatorWithMultiEvaluator} configured to answer the given * queries over the fact base with optional halting conditions and * counting the number of answers. * @throws NullPointerException if either {@code queries} or {@code factbase} is * {@code null}. */ - public static CountingQueryEvaluator prepareAndGetCountingQueryAnsweringFrom(Collection<Query> queries, - FactBase factbase, IAlgorithmParameters ap) { + public static CountingQueryEvaluatorWithMultiEvaluator prepareAndGetCountingQueryAnsweringFrom(Collection<Query> queries, + FactBase factbase, IAlgorithmParameters ap) { Objects.requireNonNull(queries, "query must not be null"); Objects.requireNonNull(factbase, "factBase must not be null"); @@ -78,7 +78,7 @@ public class QueryAnsweringComponentBuilder { var hc = new ExternalAlgorithmHaltingConditions(ap.getRank().isEmpty() ? null : ap.getRank().get(), ap.getTimeout().isEmpty() ? null : ap.getTimeout().get()); - return new CountingQueryEvaluator(queries, factbase, null, constantsOnly, hc); + return new CountingQueryEvaluatorWithMultiEvaluator(queries, factbase, null, constantsOnly, hc); } } diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/RewritingComponentBuilder.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/RewritingComponentBuilder.java index 7a5340c5809e3ed3d6b970c50f8280c69770ca2f..94c47aa9a3489c305f6acdbfad3d72ab6fe97b5f 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/RewritingComponentBuilder.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/RewritingComponentBuilder.java @@ -3,16 +3,16 @@ package fr.boreal.component_builder.components; import java.util.Collection; import java.util.Set; -import fr.boreal.backward_chaining.evaluators.QueryRewriter; import fr.boreal.component_builder.api.algorithm.IAlgorithmParameters; +import fr.boreal.component_builder.evaluators.query_rewriting.QueryRewriterWitMultiEvaluator; +import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms; import fr.boreal.model.kb.api.RuleBase; import fr.boreal.model.query.api.Query; import fr.boreal.model.ruleCompilation.HierarchicalRuleCompilation; import fr.boreal.model.ruleCompilation.NoRuleCompilation; import fr.boreal.model.ruleCompilation.api.RuleCompilation; import fr.boreal.model.ruleCompilation.id.IDRuleCompilation; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms; /** * Builds a custom query rewriter @@ -26,8 +26,8 @@ public class RewritingComponentBuilder { * @param rewritingParameters * @return */ - public static QueryRewriter prepareAndGetRewriterFrom(Collection<Query> queries, RuleBase rulebase, - IAlgorithmParameters rewritingParameters) { + public static QueryRewriterWitMultiEvaluator prepareAndGetRewriterFrom(Collection<Query> queries, RuleBase rulebase, + IAlgorithmParameters rewritingParameters) { // handle compilation Algorithms.Parameters.Compilation compil = rewritingParameters.getCompilation().isPresent() @@ -59,8 +59,8 @@ public class RewritingComponentBuilder { * @param rewritingParameters * @return */ - public static QueryRewriter prepareAndGetRewriterFrom(Query query, RuleBase rulebase, RuleCompilation compilation, - IAlgorithmParameters rewritingParameters) { + public static QueryRewriterWitMultiEvaluator prepareAndGetRewriterFrom(Query query, RuleBase rulebase, RuleCompilation compilation, + IAlgorithmParameters rewritingParameters) { return prepareAndGetRewriterFrom(Set.of(query), rulebase, rewritingParameters); @@ -73,10 +73,10 @@ public class RewritingComponentBuilder { * @param hc * @return the query rewriter according to the configuration required */ - public static QueryRewriter prepareAndGetRewriterFrom(Collection<Query> queries, RuleBase rulebase, - RuleCompilation compilation, ExternalAlgorithmHaltingConditions hc) { + public static QueryRewriterWitMultiEvaluator prepareAndGetRewriterFrom(Collection<Query> queries, RuleBase rulebase, + RuleCompilation compilation, ExternalAlgorithmHaltingConditions hc) { - return new QueryRewriter(queries, rulebase, compilation, hc); + return new QueryRewriterWitMultiEvaluator(queries, rulebase, compilation, hc); } @@ -87,8 +87,8 @@ public class RewritingComponentBuilder { * @param hc * @return the query rewriter according to the configuration required */ - public static QueryRewriter prepareAndGetRewriterFrom(Query query, RuleBase rulebase, RuleCompilation compilation, - ExternalAlgorithmHaltingConditions hc) { + public static QueryRewriterWitMultiEvaluator prepareAndGetRewriterFrom(Query query, RuleBase rulebase, RuleCompilation compilation, + ExternalAlgorithmHaltingConditions hc) { return prepareAndGetRewriterFrom(Set.of(query), rulebase, compilation, hc); diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/StorageComponent.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/StorageComponent.java index 52b44ecff2282bf3f64b6405741fa0d7c17b4711..5be361a04a9290b752ddc878f82b4bb94318f78e 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/StorageComponent.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/StorageComponent.java @@ -7,12 +7,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import fr.boreal.component_builder.api.algorithm.IAlgorithmParameters; +import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration; +import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration.DBMSDriverParameters; import fr.boreal.model.kb.api.FactBase; import fr.boreal.storage.builder.StorageBuilder; import fr.boreal.storage.natives.DefaultInMemoryAtomSet; import fr.boreal.storage.natives.SimpleInMemoryGraphStore; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration.DBMSDriverParameters; class StorageComponent { diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/MultiEvaluator.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/MultiEvaluator.java similarity index 88% rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/MultiEvaluator.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/MultiEvaluator.java index c7256555b4ae208633313d90ac4e33774c8c10d3..1ec29ba5d5888f9b0af195289b8d0b6ef1051c61 100644 --- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/MultiEvaluator.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/MultiEvaluator.java @@ -1,12 +1,14 @@ -package fr.lirmm.boreal.util.evaluator; +package fr.boreal.component_builder.evaluators.generic; import java.util.Collection; import java.util.function.BiFunction; import java.util.function.Function; +import fr.boreal.component_builder.evaluators.generic.processors.BatchProcessor; +import fr.boreal.component_builder.evaluators.generic.processors.LazyIterator; import org.slf4j.Logger; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions; +import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions; public abstract class MultiEvaluator<InputType, OutputType> { diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/BatchProcessor.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/processors/BatchProcessor.java similarity index 96% rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/BatchProcessor.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/processors/BatchProcessor.java index 9b89446d6f29ac9d6ba6954de414e7eda651cd17..7ecc1c3d5222bad1ee78050808a78e9024956be4 100644 --- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/BatchProcessor.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/processors/BatchProcessor.java @@ -1,4 +1,4 @@ -package fr.lirmm.boreal.util.evaluator; +package fr.boreal.component_builder.evaluators.generic.processors; import java.util.ArrayList; import java.util.Collection; @@ -19,7 +19,7 @@ import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions; +import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions; /** * A generic class for batch processing of input objects. diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/LazyIterator.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/processors/LazyIterator.java similarity index 97% rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/LazyIterator.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/processors/LazyIterator.java index 380e9873fcc73dfece0841e03d557c5eeee389da..5bbc22d8bc7c223129515d7e122679f7e38cc32b 100644 --- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/LazyIterator.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/processors/LazyIterator.java @@ -1,4 +1,4 @@ -package fr.lirmm.boreal.util.evaluator; +package fr.boreal.component_builder.evaluators.generic.processors; import java.util.Collection; import java.util.Iterator; diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/CountingQueryEvaluator.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/CountingQueryEvaluatorWithMultiEvaluator.java similarity index 56% rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/CountingQueryEvaluator.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/CountingQueryEvaluatorWithMultiEvaluator.java index 0c5f2c2f3aa670a652b88b48252d699ad3f10158..62851134eba14e81e638a4db4a17a0c2d023befc 100644 --- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/CountingQueryEvaluator.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/CountingQueryEvaluatorWithMultiEvaluator.java @@ -1,14 +1,15 @@ -package fr.boreal.query_evaluation.component; +package fr.boreal.component_builder.evaluators.query_evaluation; import java.util.Collection; +import fr.boreal.component_builder.evaluators.query_evaluation.auxiliary.*; import org.slf4j.LoggerFactory; +import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions; import fr.boreal.model.kb.api.FactBase; import fr.boreal.model.query.api.Query; import fr.boreal.model.queryEvaluation.api.QueryEvaluator; -import fr.lirmm.boreal.util.evaluator.MultiEvaluator; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions; +import fr.boreal.component_builder.evaluators.generic.MultiEvaluator; /** * A class that wraps around an FOQueryEvaluator to provide both batch and lazy @@ -16,10 +17,10 @@ import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingCo * number of answers. * */ -public class CountingQueryEvaluator extends MultiEvaluator<QueryEvaluationInput, QueryEvaluationOutput> { +public class CountingQueryEvaluatorWithMultiEvaluator extends MultiEvaluator<QueryEvaluationInput, QueryEvaluationOutput> { static { - LOG = LoggerFactory.getLogger(CountingQueryEvaluator.class); + LOG = LoggerFactory.getLogger(CountingQueryEvaluatorWithMultiEvaluator.class); } /** @@ -30,11 +31,11 @@ public class CountingQueryEvaluator extends MultiEvaluator<QueryEvaluationInput, * @param constantsOnly true iff variables must only map to constants * @param externalHaltingConditions */ - public CountingQueryEvaluator(Collection<Query> queries, - FactBase factBase, - QueryEvaluator<Query> queryEvaluator, - boolean constantsOnly, - ExternalAlgorithmHaltingConditions externalHaltingConditions) { + public CountingQueryEvaluatorWithMultiEvaluator(Collection<Query> queries, + FactBase factBase, + QueryEvaluator<Query> queryEvaluator, + boolean constantsOnly, + ExternalAlgorithmHaltingConditions externalHaltingConditions) { super(new QueryInputWrapper(queries, factBase, queryEvaluator, constantsOnly, true).createQueryInputs(), new PreemptiveQueryEvaluationFunction(), new DefaultQueryEvaluationFunction(), externalHaltingConditions, diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluatorWithMultiEvaluator.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/QueryEvaluatorWithMultiEvaluator.java similarity index 81% rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluatorWithMultiEvaluator.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/QueryEvaluatorWithMultiEvaluator.java index e6e70c28bf2a1a33bca7674ecf99fd4bb41c230f..e33e1dff9c86d8c34fd4a1d92e4378d319aa3e4c 100644 --- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluatorWithMultiEvaluator.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/QueryEvaluatorWithMultiEvaluator.java @@ -1,17 +1,15 @@ -package fr.boreal.query_evaluation.component; +package fr.boreal.component_builder.evaluators.query_evaluation; import java.util.Collection; +import fr.boreal.component_builder.evaluators.query_evaluation.auxiliary.*; import org.slf4j.LoggerFactory; -import fr.boreal.configuration.parameters.IGParameter; -import fr.boreal.configuration.parameters.IGParameterValueExtractor; +import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions; import fr.boreal.model.kb.api.FactBase; import fr.boreal.model.query.api.Query; import fr.boreal.model.queryEvaluation.api.QueryEvaluator; -import fr.lirmm.boreal.util.evaluator.MultiEvaluator; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; +import fr.boreal.component_builder.evaluators.generic.MultiEvaluator; /** * A class that wraps around an FOQueryEvaluator to provide both batch and lazy diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/DefaultQueryEvaluationFunction.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/DefaultQueryEvaluationFunction.java similarity index 94% rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/DefaultQueryEvaluationFunction.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/DefaultQueryEvaluationFunction.java index e37a322e5bfa4a89f563613b4b3434792c094fdb..b19319700a4c9cc1c6f452fef14eecb8f8983a4e 100644 --- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/DefaultQueryEvaluationFunction.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/DefaultQueryEvaluationFunction.java @@ -1,5 +1,5 @@ -package fr.boreal.query_evaluation.component; +package fr.boreal.component_builder.evaluators.query_evaluation.auxiliary; import java.util.Collections; import java.util.Iterator; diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/DefaultQueryEvaluationOutputIfTimeoutFunction.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/DefaultQueryEvaluationOutputIfTimeoutFunction.java similarity index 88% rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/DefaultQueryEvaluationOutputIfTimeoutFunction.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/DefaultQueryEvaluationOutputIfTimeoutFunction.java index 81b82e46765fcbb057ea43ee8e148b4b2e16c63b..020f182c624ff1cdee22a5fa6f11190fedfe80a1 100644 --- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/DefaultQueryEvaluationOutputIfTimeoutFunction.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/DefaultQueryEvaluationOutputIfTimeoutFunction.java @@ -1,5 +1,5 @@ -package fr.boreal.query_evaluation.component; +package fr.boreal.component_builder.evaluators.query_evaluation.auxiliary; import java.util.Collections; import java.util.function.BiFunction; diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/PreemptiveQueryEvaluationFunction.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/PreemptiveQueryEvaluationFunction.java similarity index 95% rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/PreemptiveQueryEvaluationFunction.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/PreemptiveQueryEvaluationFunction.java index f797c28a4fd106481e9980c9d873d9ad3ff5bef7..0c657ab588eaf5641f662b902d83afb67d4f0c49 100644 --- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/PreemptiveQueryEvaluationFunction.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/PreemptiveQueryEvaluationFunction.java @@ -1,5 +1,5 @@ -package fr.boreal.query_evaluation.component; +package fr.boreal.component_builder.evaluators.query_evaluation.auxiliary; import java.util.ArrayList; import java.util.Collections; diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluationInput.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryEvaluationInput.java similarity index 91% rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluationInput.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryEvaluationInput.java index 71943fd643c3bcd98dd83bf2afe6ace00cad70f9..5296943f3cba1ab3ea7356f6738af91e8d18e6b3 100644 --- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluationInput.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryEvaluationInput.java @@ -1,4 +1,4 @@ -package fr.boreal.query_evaluation.component; +package fr.boreal.component_builder.evaluators.query_evaluation.auxiliary; import java.util.Objects; diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluationOutput.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryEvaluationOutput.java similarity index 94% rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluationOutput.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryEvaluationOutput.java index c4926505a71b174505b2833347e5ec43f5810782..e7ed4efda17ef9e5156e5df7446956d053ae98ac 100644 --- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluationOutput.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryEvaluationOutput.java @@ -1,4 +1,4 @@ -package fr.boreal.query_evaluation.component; +package fr.boreal.component_builder.evaluators.query_evaluation.auxiliary; import java.util.Iterator; import java.util.Objects; diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryInputWrapper.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryInputWrapper.java similarity index 94% rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryInputWrapper.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryInputWrapper.java index 7aa09b4be71ef6cb510ce02d9f3d6ed0e46bf22d..cb434dda199725b60d7b39b3d66ccbac77d75e95 100644 --- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryInputWrapper.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryInputWrapper.java @@ -1,4 +1,4 @@ -package fr.boreal.query_evaluation.component; +package fr.boreal.component_builder.evaluators.query_evaluation.auxiliary; import java.util.Collection; import java.util.List; diff --git a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/QueryRewriter.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/QueryRewriterWitMultiEvaluator.java similarity index 62% rename from integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/QueryRewriter.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/QueryRewriterWitMultiEvaluator.java index 8ad7dccabe665023ae5820a47ebadf5202fc6b94..01668d9452608a56277d61631c08f1c5e62b4004 100644 --- a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/QueryRewriter.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/QueryRewriterWitMultiEvaluator.java @@ -1,25 +1,26 @@ -package fr.boreal.backward_chaining.evaluators; +package fr.boreal.component_builder.evaluators.query_rewriting; import java.util.Collection; +import fr.boreal.component_builder.evaluators.query_rewriting.auxiliary.*; import org.slf4j.LoggerFactory; +import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions; import fr.boreal.model.kb.api.RuleBase; import fr.boreal.model.query.api.Query; import fr.boreal.model.ruleCompilation.NoRuleCompilation; import fr.boreal.model.ruleCompilation.api.RuleCompilation; -import fr.lirmm.boreal.util.evaluator.MultiEvaluator; -import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions; +import fr.boreal.component_builder.evaluators.generic.MultiEvaluator; /** * A class for rewriting a collection of FOQuery objects. * */ -public class QueryRewriter extends MultiEvaluator<RewritingInput, RewritingOutput> { +public class QueryRewriterWitMultiEvaluator extends MultiEvaluator<RewritingInput, RewritingOutput> { static { - LOG = LoggerFactory.getLogger(QueryRewriter.class); + LOG = LoggerFactory.getLogger(QueryRewriterWitMultiEvaluator.class); } @@ -36,8 +37,8 @@ public class QueryRewriter extends MultiEvaluator<RewritingInput, RewritingOutpu * @param externalHaltingConditions */ - public QueryRewriter(Collection<Query> queries, RuleBase ruleBase, RuleCompilation compilation, - ExternalAlgorithmHaltingConditions externalHaltingConditions) { + public QueryRewriterWitMultiEvaluator(Collection<Query> queries, RuleBase ruleBase, RuleCompilation compilation, + ExternalAlgorithmHaltingConditions externalHaltingConditions) { super(new RewritingInputWrapper(queries, ruleBase, compilation).createRewritingInputs(), new DefaultRewritingFunction(), externalHaltingConditions, diff --git a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/DefaultQueryRewritingOutputIfTimeoutFunction.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/DefaultQueryRewritingOutputIfTimeoutFunction.java similarity index 88% rename from integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/DefaultQueryRewritingOutputIfTimeoutFunction.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/DefaultQueryRewritingOutputIfTimeoutFunction.java index aa72e145eaec640e08f39bb3bec487902bf494d2..748af4b453ab38b5f39b3a41f472fce8048671c1 100644 --- a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/DefaultQueryRewritingOutputIfTimeoutFunction.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/DefaultQueryRewritingOutputIfTimeoutFunction.java @@ -1,5 +1,5 @@ -package fr.boreal.backward_chaining.evaluators; +package fr.boreal.component_builder.evaluators.query_rewriting.auxiliary; import java.util.Optional; import java.util.function.BiFunction; diff --git a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/DefaultRewritingFunction.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/DefaultRewritingFunction.java similarity index 94% rename from integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/DefaultRewritingFunction.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/DefaultRewritingFunction.java index 13f7382a222a036d711ba5cd331071877189cd31..dc807189d41757768125448f85786a578cd2d9d0 100644 --- a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/DefaultRewritingFunction.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/DefaultRewritingFunction.java @@ -1,4 +1,4 @@ -package fr.boreal.backward_chaining.evaluators; +package fr.boreal.component_builder.evaluators.query_rewriting.auxiliary; import java.util.Optional; import java.util.function.Function; diff --git a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingInput.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingInput.java similarity index 75% rename from integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingInput.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingInput.java index 7baf1c2913d9df1598096fa1d2701ee5e68e6536..21f8658b80fd1f1e7d9837fabd459a7da0f5bcc0 100644 --- a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingInput.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingInput.java @@ -1,4 +1,4 @@ -package fr.boreal.backward_chaining.evaluators; +package fr.boreal.component_builder.evaluators.query_rewriting.auxiliary; import fr.boreal.model.kb.api.RuleBase; import fr.boreal.model.query.api.Query; diff --git a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingInputWrapper.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingInputWrapper.java similarity index 85% rename from integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingInputWrapper.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingInputWrapper.java index a624816f9008dcd5c27bb4d4ad36bd1a638b2f10..3b5f47ac399f6e60cce575e73d1a7809379e2e83 100644 --- a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingInputWrapper.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingInputWrapper.java @@ -1,12 +1,10 @@ -package fr.boreal.backward_chaining.evaluators; +package fr.boreal.component_builder.evaluators.query_rewriting.auxiliary; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; -import fr.boreal.model.formula.api.FOFormula; import fr.boreal.model.kb.api.RuleBase; -import fr.boreal.model.query.api.FOQuery; import fr.boreal.model.query.api.Query; import fr.boreal.model.ruleCompilation.api.RuleCompilation; diff --git a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingOutput.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingOutput.java similarity index 94% rename from integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingOutput.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingOutput.java index 9260ca5b6f4d41583b734c8b3e3356df9319ac60..82d887df00938fac212a27a0598579e60d9a6890 100644 --- a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingOutput.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingOutput.java @@ -1,4 +1,4 @@ -package fr.boreal.backward_chaining.evaluators; +package fr.boreal.component_builder.evaluators.query_rewriting.auxiliary; import java.io.Serializable; import java.util.Objects; diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalAlgorithmHaltingConditions.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalAlgorithmHaltingConditions.java similarity index 95% rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalAlgorithmHaltingConditions.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalAlgorithmHaltingConditions.java index cca469403d6dcb7c375d81636b715e15da2612ec..4b0658c917c570e0aff052a3ed0f4ea9632b5a45 100644 --- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalAlgorithmHaltingConditions.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalAlgorithmHaltingConditions.java @@ -1,10 +1,10 @@ -package fr.lirmm.boreal.util.externalHaltingConditions; +package fr.boreal.component_builder.externalHaltingConditions; import java.time.Duration; import java.util.Arrays; import java.util.List; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.ExternalHaltingConditions; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.ExternalHaltingConditions; /** * Defines conditions that must be respected in case of a non-terminating diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalHaltingCondition.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalHaltingCondition.java similarity index 94% rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalHaltingCondition.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalHaltingCondition.java index 2a2da984f98dbf5a977b640ebdb5a5286200e7e4..225ccf8aeb9a1d5ab74ce6bfa0ea822c1b69837c 100644 --- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalHaltingCondition.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalHaltingCondition.java @@ -1,9 +1,9 @@ -package fr.lirmm.boreal.util.externalHaltingConditions; +package fr.boreal.component_builder.externalHaltingConditions; import java.time.Duration; import java.util.Objects; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.ExternalHaltingConditions; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.ExternalHaltingConditions; /** * Represents a pair of halting condition: a keyword and its associated value. diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalHaltingConditionFactory.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalHaltingConditionFactory.java similarity index 80% rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalHaltingConditionFactory.java rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalHaltingConditionFactory.java index 5ef902c43a43bef2bd41cf3627e9b46dd760eb9d..633797258494f5179e062b8e16e81d65c42b2126 100644 --- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalHaltingConditionFactory.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalHaltingConditionFactory.java @@ -1,6 +1,6 @@ -package fr.lirmm.boreal.util.externalHaltingConditions; +package fr.boreal.component_builder.externalHaltingConditions; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.ExternalHaltingConditions; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.ExternalHaltingConditions; /** * Factory for creating ExternalHaltingConditions diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/operations/OperationNotPerformed.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/operations/OperationNotPerformed.java index 97a4545659c0f62b1339c9aff0f9a60a4f17e5cd..129574b8d873353163f7b9fa8b0c65c670aa3a09 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/operations/OperationNotPerformed.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/operations/OperationNotPerformed.java @@ -3,8 +3,8 @@ package fr.boreal.component_builder.operations; import java.io.Serializable; import fr.boreal.component_builder.api.IOperationResult; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms; +import fr.boreal.configuration.keywords.InteGraalKeywords; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms; /** * records the operation which has not been performed diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/utils/ComponentPrinter.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/utils/ComponentPrinter.java index 59a8e3b25b416b4884d566ff787f28b6976fce9e..83550e6fc242b994f0b5c7a91d78af508fa92324 100644 --- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/utils/ComponentPrinter.java +++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/utils/ComponentPrinter.java @@ -7,9 +7,9 @@ import java.util.stream.StreamSupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import fr.boreal.backward_chaining.evaluators.RewritingOutput; +import fr.boreal.component_builder.evaluators.query_rewriting.auxiliary.RewritingOutput; import fr.boreal.model.kb.api.FactBase; -import fr.boreal.query_evaluation.component.QueryEvaluationOutput; +import fr.boreal.component_builder.evaluators.query_evaluation.auxiliary.QueryEvaluationOutput; public class ComponentPrinter { static final Logger LOG = LoggerFactory.getLogger(ComponentPrinter.class); diff --git a/integraal/integraal-component/src/main/java/module-info.java b/integraal/integraal-component/src/main/java/module-info.java index a3fb9ee09b5a0133b43d71a040dc517ae747abd2..3a7dcf98580a0af250a7730ec16974127a20e0b6 100644 --- a/integraal/integraal-component/src/main/java/module-info.java +++ b/integraal/integraal-component/src/main/java/module-info.java @@ -24,5 +24,13 @@ open module fr.boreal.component { exports fr.boreal.component_builder.api; exports fr.boreal.component_builder.api.algorithm; exports fr.boreal.component_builder.api.scenario; + exports fr.boreal.component_builder.components; + exports fr.boreal.component_builder.externalHaltingConditions; + exports fr.boreal.component_builder.evaluators.generic; + exports fr.boreal.component_builder.evaluators.query_rewriting; + exports fr.boreal.component_builder.evaluators.query_evaluation; + exports fr.boreal.component_builder.evaluators.query_evaluation.auxiliary; + exports fr.boreal.component_builder.evaluators.query_rewriting.auxiliary; + exports fr.boreal.component_builder.evaluators.generic.processors; } \ No newline at end of file diff --git a/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/ParameterExamples.java b/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/ParameterExamples.java index dd3cab874e11d80cb302f37ce7767f74dce00a26..03d058876e7bdcdae62ee69aee5a2e40938317bc 100644 --- a/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/ParameterExamples.java +++ b/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/ParameterExamples.java @@ -1,13 +1,13 @@ package fr.boreal.component_builder.api.algorithm; +import fr.boreal.configuration.keywords.InteGraalKeywords; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms; +import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration; +import fr.boreal.configuration.keywords.InteGraalKeywords.MonitoringOperations; +import fr.boreal.configuration.keywords.InteGraalKeywords.SupportedFileExtensions; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.*; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.*; import fr.boreal.configuration.parameters.IGParameter; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.*; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.*; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.SupportedFileExtensions; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.MonitoringOperations; import java.time.Duration; @@ -41,7 +41,7 @@ public class ParameterExamples { new IGParameter<>(InteGraalKeywords.APPLIER, Chase.Applier.BREADTH_FIRST_TRIGGER); public static final IGParameter<InteGraalKeywords, Chase.Transformer> TRANSFORMER_PARAM = - new IGParameter<>(InteGraalKeywords.TRANFORMER, Chase.Transformer.ALL); + new IGParameter<>(InteGraalKeywords.TRANSFORMER, Chase.Transformer.ALL); public static final IGParameter<InteGraalKeywords, Chase.Computer> COMPUTER_PARAM = new IGParameter<>(InteGraalKeywords.COMPUTER, Chase.Computer.SEMI_NAIVE); diff --git a/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/QAWithIGParameterTest.java b/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/QAWithIGParameterTest.java index be278cc86f09615bb6f55f23519af795970a22c8..92ef8b211f683b110f270f44ce0355fa8445f96e 100644 --- a/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/QAWithIGParameterTest.java +++ b/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/QAWithIGParameterTest.java @@ -1,9 +1,10 @@ package fr.boreal.component_builder.api.algorithm; import fr.boreal.component_builder.AlgorithmParameters; +import fr.boreal.configuration.keywords.InteGraalKeywords; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms; import fr.boreal.configuration.parameters.IGParameter; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/keywords/InteGraalKeywords.java b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/keywords/InteGraalKeywords.java similarity index 99% rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/keywords/InteGraalKeywords.java rename to integraal/integraal-configuration/src/main/java/fr/boreal/configuration/keywords/InteGraalKeywords.java index 9301816262805701631a4c96692b9e93ac7c458b..9c27f2831b8cb3f9321d2c740b7d2641eb513ad7 100644 --- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/keywords/InteGraalKeywords.java +++ b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/keywords/InteGraalKeywords.java @@ -1,4 +1,4 @@ -package fr.lirmm.boreal.util.keywords; +package fr.boreal.configuration.keywords; import java.time.Duration; import java.time.format.DateTimeParseException; @@ -51,7 +51,7 @@ public enum InteGraalKeywords { SCHEDULER(Algorithms.Parameters.Chase.Scheduler.class), EVALUATOR(Algorithms.Parameters.Chase.Evaluator.class), APPLIER(Algorithms.Parameters.Chase.Applier.class), - TRANFORMER(Algorithms.Parameters.Chase.Transformer.class), + TRANSFORMER(Algorithms.Parameters.Chase.Transformer.class), COMPUTER(Algorithms.Parameters.Chase.Computer.class), CHECKER(Algorithms.Parameters.Chase.Checker.class), APPLICATION(Algorithms.Parameters.Chase.Application.class), @@ -162,7 +162,7 @@ public enum InteGraalKeywords { public static InteGraalKeywords findKeyword(String s) { InteGraalKeywords ikw = (InteGraalKeywords) EnumUtils.findConstantInEnumeration(s, InteGraalKeywords.class); if (ikw == null) - throw new IllegalArgumentException(ikw + " is an unknown InteGraalKeywords."); + throw new IllegalArgumentException(s + " is an unknown InteGraalKeywords."); return ikw; } diff --git a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameter.java b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameter.java index e16c6bed41e61a7325015c96354b3a0bd220c55f..68196026017d29e01dd7242fd80ba0559775d478 100644 --- a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameter.java +++ b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameter.java @@ -1,8 +1,8 @@ package fr.boreal.configuration.parameters; +import fr.boreal.configuration.keywords.InteGraalKeywords; import fr.lirmm.boreal.util.enumerations.EnumUtils; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; /** * Structure used to describe an InteGraal API service parameter diff --git a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterConverter.java b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterConverter.java index 055778f4c18951984200d0da4c52f64baf1ba4b6..b3b2af7865ff96b6fbafc3a7d71a52382d21d7ff 100644 --- a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterConverter.java +++ b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterConverter.java @@ -1,6 +1,6 @@ package fr.boreal.configuration.parameters; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; +import fr.boreal.configuration.keywords.InteGraalKeywords; public class IGParameterConverter { diff --git a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterException.java b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterException.java index 709b921cbf0538691febc1fe8c1440ffebdca160..19ee2249da65d8e7d527939c5391816d228b9f67 100644 --- a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterException.java +++ b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterException.java @@ -1,6 +1,6 @@ package fr.boreal.configuration.parameters; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; +import fr.boreal.configuration.keywords.InteGraalKeywords; /** * Exception for errors caused by inconsistent use of the {@link IGParameter} diff --git a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterValueExtractor.java b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterValueExtractor.java index a25b81be66162c082a4aa4f666c4c7c31a4cca00..e0a82f205d7b75643113f281ae55b0be0d71d8a9 100644 --- a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterValueExtractor.java +++ b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterValueExtractor.java @@ -2,8 +2,8 @@ package fr.boreal.configuration.parameters; import java.time.Duration; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms; +import fr.boreal.configuration.keywords.InteGraalKeywords; +import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms; public class IGParameterValueExtractor { diff --git a/integraal/integraal-configuration/src/main/java/module-info.java b/integraal/integraal-configuration/src/main/java/module-info.java index ab743c1c9878668fdd776e4f7e2239c9dd802719..a3b6573864ab59c7262a20f2294e13443016f727 100644 --- a/integraal/integraal-configuration/src/main/java/module-info.java +++ b/integraal/integraal-configuration/src/main/java/module-info.java @@ -6,5 +6,7 @@ */ open module fr.boreal.configuration { requires fr.lirmm.boreal.util; + exports fr.boreal.configuration.keywords; exports fr.boreal.configuration.parameters; + } \ No newline at end of file diff --git a/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterConverterTest.java b/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterConverterTest.java index 9e410f56c78292f2087fbf19ca8f3e0892ca0715..481e919383191e7073fb4e950ffa2fe545f7cd9f 100644 --- a/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterConverterTest.java +++ b/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterConverterTest.java @@ -10,10 +10,10 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.junit.runners.Parameterized.Parameters; +import fr.boreal.configuration.keywords.InteGraalKeywords; import fr.boreal.configuration.parameters.IGParameter; import fr.boreal.configuration.parameters.IGParameterConverter; import fr.boreal.configuration.parameters.IGParameterException; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; /* * Checks that parameters are correctly converted diff --git a/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterCreationTest.java b/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterCreationTest.java index 63b2ee736aec129786d2ea50d4f7654c0192a781..425434f616d7dfdb038b360151b3d26e7692ac6b 100644 --- a/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterCreationTest.java +++ b/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterCreationTest.java @@ -1,6 +1,7 @@ package configuration.tests; +import fr.boreal.configuration.keywords.InteGraalKeywords; import fr.boreal.configuration.parameters.IGParameter; -import fr.lirmm.boreal.util.keywords.InteGraalKeywords; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; diff --git a/integraal/integraal-forward-chaining/pom.xml b/integraal/integraal-forward-chaining/pom.xml index 0dfdd37fa6463a5aaf2dc5720d6e164f542f9a89..c5c525f9104f39f07d71d340ce8be19bbf552481 100644 --- a/integraal/integraal-forward-chaining/pom.xml +++ b/integraal/integraal-forward-chaining/pom.xml @@ -34,7 +34,10 @@ <groupId>${groupId}</groupId> <artifactId>integraal-util</artifactId> </dependency> - + <dependency> + <groupId>${groupId}</groupId> + <artifactId>integraal-configuration</artifactId> + </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/Chase.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/Chase.java index bbac874322f11ae7280f34b10bda89d7d3f69b2c..8f18db03c6c53f2a7e0607d6291a9b475b18e0b8 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/Chase.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/Chase.java @@ -1,17 +1,11 @@ package fr.boreal.forward_chaining.chase; import fr.boreal.forward_chaining.api.ForwardChainingAlgorithm; -import fr.boreal.forward_chaining.chase.lineage.LineageTracker; -import fr.boreal.forward_chaining.chase.rule_applier.RuleApplier; +import fr.boreal.forward_chaining.chase.description.ChaseDescription; +import fr.boreal.forward_chaining.chase.description.IChaseDescription; import fr.boreal.forward_chaining.chase.rule_scheduler.RuleScheduler; import fr.boreal.model.kb.api.FactBase; import fr.boreal.model.kb.api.RuleBase; -import fr.boreal.model.logicalElements.api.Atom; -import fr.boreal.model.logicalElements.api.Substitution; -import fr.boreal.model.rule.api.Rule; - -import java.util.*; -import java.util.stream.Collectors; /** * The Chase is a way to saturate a {@link FactBase} according to rules @@ -101,4 +95,15 @@ public interface Chase extends ForwardChainingAlgorithm { */ int getStepCount(); + /** + * Returns a description of the configuration of the chase + */ + IChaseDescription getDescription(); + + /** + * Returns a String description of the configuration of the chase + */ + default String describe() { + return this.getDescription().toJson(); + } } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/ChaseImpl.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/ChaseImpl.java index 7dd72f808cf3a2c171aca6d7b60f23f746a614a5..76d8f940077bbbcf607b03bf4ce4e3d7d398d35a 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/ChaseImpl.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/ChaseImpl.java @@ -1,13 +1,10 @@ package fr.boreal.forward_chaining.chase; import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; +import fr.boreal.forward_chaining.chase.description.ChaseDescription; +import fr.boreal.forward_chaining.chase.description.IChaseDescription; import fr.boreal.forward_chaining.chase.halting_condition.HaltingCondition; -import fr.boreal.forward_chaining.chase.lineage.LineageTracker; -import fr.boreal.forward_chaining.chase.lineage.LineageTrackerImpl; import fr.boreal.forward_chaining.chase.rule_applier.RuleApplier; import fr.boreal.forward_chaining.chase.rule_scheduler.RuleScheduler; import fr.boreal.forward_chaining.chase.treatment.EndTreatment; @@ -15,10 +12,7 @@ import fr.boreal.forward_chaining.chase.treatment.Pretreatment; import fr.boreal.forward_chaining.chase.treatment.Treatment; import fr.boreal.model.kb.api.FactBase; import fr.boreal.model.kb.api.RuleBase; -import fr.boreal.model.logicalElements.api.Atom; -import fr.boreal.model.logicalElements.api.Substitution; import fr.boreal.model.rule.api.FORule; -import fr.boreal.model.rule.api.Rule; /** * Default implementation of the chase algorithm @@ -75,6 +69,7 @@ public class ChaseImpl implements Chase { this.step_pretreatments = step_pretreatments; this.global_end_treatments = global_end_treatments; this.end_of_step_treatments = end_of_step_treatments; + this.last_step_result = new RuleApplicationStepResult(null, null); } @@ -155,8 +150,78 @@ public class ChaseImpl implements Chase { @Override public String toString() { return "Steps : " + this.step_number + - "\nStep result :\n" + this.last_step_result + - "\nFacts :\n" + this.fb.toString(); + "\nStep result :\n" + this.last_step_result + + "\nFacts :\n" + this.fb.toString(); + } + + public IChaseDescription getDescription() { + return new ChaseDescription( + fb, + rb, + rule_scheduler, + rule_applier, + last_step_result, + step_number, + halting_conditions, + global_pretreatments, + step_pretreatments, + global_end_treatments, + end_of_step_treatments + ); + } + @Override + public String describe() { + StringBuilder sb = new StringBuilder(); + sb.append("ChaseImpl\n"); + sb.append("├── FactBase (size): ").append(fb.size()).append("\n"); + sb.append("├── RuleBase (size): ").append(rb.getRules().size()).append("\n"); + sb.append("├── RuleScheduler: ").append(rule_scheduler.describe()).append("\n"); + sb.append("├── RuleApplier: ").append(rule_applier.describe()).append("\n"); + sb.append("├── LastStepResult: ").append(last_step_result.describe()).append("\n"); + sb.append("├── StepNumber: ").append(step_number).append("\n"); + + sb.append("├── HaltingConditions:\n"); + for (HaltingCondition hc : halting_conditions) { + sb.append("│ ├── ").append(hc.describe()).append("\n"); + } + + if (global_pretreatments.isEmpty()) { + sb.append("├── No Global Pretreatments\n"); + } else { + sb.append("├── GlobalPretreatments:\n"); + for (Pretreatment p : global_pretreatments) { + sb.append("│ ├── ").append(p.describe()).append("\n"); + } + } + + if (step_pretreatments.isEmpty()) { + sb.append("├── No Step Pretreatment\n"); + } else { + sb.append("├── StepPretreatments:\n"); + for (Pretreatment p : step_pretreatments) { + sb.append("│ ├── ").append(p.describe()).append("\n"); + } + } + + if (global_pretreatments.isEmpty()) { + sb.append("├── No Global End Treatment\n"); + } else { + sb.append("├── GlobalEndTreatments:\n"); + for (EndTreatment et : global_end_treatments) { + sb.append("│ ├── ").append(et.describe()).append("\n"); + } + } + + if (end_of_step_treatments.isEmpty()) { + sb.append("└── No End Of Step Treatment\n"); + } else { + sb.append("└── EndOfStepTreatments:\n"); + for (EndTreatment et : end_of_step_treatments) { + sb.append(" ├── ").append(et.describe()).append("\n"); + } + } + + return sb.toString(); } ///////////////////////////////////////////////// diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/RuleApplicationStepResult.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/RuleApplicationStepResult.java index 688aae24d6ace06ecaf5680bffe5fc048d72f704..90ee65172d10bc06ab6d32ec0c67fb2097ccde92 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/RuleApplicationStepResult.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/RuleApplicationStepResult.java @@ -14,45 +14,58 @@ import java.util.stream.Collectors; */ public class RuleApplicationStepResult { - private final Collection<FORule> applied_rules; - private final Collection<Atom> created_facts; - - private FactBase created_facts_factbase = null; - - /** - * Constructor with rules and facts - * @param applied_rules rules applied at the step - * @param created_facts facts created at the step - */ - public RuleApplicationStepResult(Collection<FORule> applied_rules, Collection<Atom> created_facts) { - this.applied_rules = applied_rules; - this.created_facts = created_facts; - } - - /** - * @return the rules applied at the step - */ - public Collection<FORule> applied_rules() { - return this.applied_rules; - } - - /** - * @return the facts created at the step - */ - public Collection<Atom> created_facts() { - return this.created_facts; - } - - /** - * @return the facts created at the step seen as a FactBase with indexes, kept in cache - */ - public FactBase created_facts_as_factbase() { - if(this.created_facts_factbase == null) { - this.created_facts_factbase = new SimpleInMemoryGraphStore( - this.created_facts.stream() - .flatMap(facts -> facts.asAtomSet().stream()) - .collect(Collectors.toSet())); - } - return this.created_facts_factbase; - } + private final Collection<FORule> applied_rules; + private final Collection<Atom> created_facts; + + private FactBase created_facts_factbase = null; + + /** + * Constructor with rules and facts + * + * @param applied_rules rules applied at the step + * @param created_facts facts created at the step + */ + public RuleApplicationStepResult(Collection<FORule> applied_rules, Collection<Atom> created_facts) { + this.applied_rules = applied_rules; + this.created_facts = created_facts; + } + + /** + * @return the rules applied at the step + */ + public Collection<FORule> applied_rules() { + return this.applied_rules; + } + + /** + * @return the facts created at the step + */ + public Collection<Atom> created_facts() { + return this.created_facts; + } + + /** + * @return the facts created at the step seen as a FactBase with indexes, kept in cache + */ + public FactBase created_facts_as_factbase() { + if (this.created_facts_factbase == null) { + this.created_facts_factbase = new SimpleInMemoryGraphStore( + this.created_facts.stream() + .flatMap(facts -> facts.asAtomSet().stream()) + .collect(Collectors.toSet())); + } + return this.created_facts_factbase; + } + + + /** + * Defautl method to describe the rule scheduler + */ + public String describe() { + if (applied_rules == null) { + return "No rule applied yet."; + } else { + return "Applied " + applied_rules.size() + " rules in the last step ; inferred " + created_facts.size() + " atoms."; + } + } } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/ChaseDescription.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/ChaseDescription.java new file mode 100644 index 0000000000000000000000000000000000000000..7a269c2e8ba69b9c2fabab3e522f646ca541daeb --- /dev/null +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/ChaseDescription.java @@ -0,0 +1,112 @@ +package fr.boreal.forward_chaining.chase.description; + +import fr.boreal.configuration.parameters.IGParameter; +import fr.boreal.forward_chaining.chase.RuleApplicationStepResult; +import fr.boreal.forward_chaining.chase.halting_condition.HaltingCondition; +import fr.boreal.forward_chaining.chase.rule_applier.RuleApplier; +import fr.boreal.forward_chaining.chase.rule_scheduler.RuleScheduler; +import fr.boreal.forward_chaining.chase.treatment.EndTreatment; +import fr.boreal.forward_chaining.chase.treatment.Pretreatment; +import fr.boreal.model.kb.api.FactBase; +import fr.boreal.model.kb.api.RuleBase; +import fr.boreal.configuration.keywords.InteGraalKeywords; + +import java.util.Collection; +import java.util.List; + +public record ChaseDescription( + FactBase factBase, + RuleBase ruleBase, + RuleScheduler ruleScheduler, + RuleApplier ruleApplier, + RuleApplicationStepResult lastStepResult, + + int stepNumber, + Collection<HaltingCondition> haltingConditions, + Collection<Pretreatment> globalPretreatments, + Collection<Pretreatment> stepPretreatments, + Collection<EndTreatment> globalEndTreatments, + Collection<EndTreatment> endOfStepTreatments +) implements IChaseDescription { + + public Collection<IGParameter<InteGraalKeywords,?>> getCorrespondingParameters(){ + //TODO add the other items of the configuration + return List.of(ruleScheduler.getCorrespondingParameter()); + } + // Convert to a manually built JSON string + public String toJson() { + StringBuilder sb = new StringBuilder(); + sb.append("{\n"); + + sb.append(" \"factBaseSize\": ").append(factBase.size()).append(",\n"); + sb.append(" \"ruleBaseSize\": ").append(ruleBase.getRules().size()).append(",\n"); + sb.append(" \"ruleScheduler\": \"").append(ruleScheduler.describe()).append("\",\n"); + sb.append(" \"ruleApplier\": \"").append(ruleApplier.describeJSON()).append("\",\n"); + sb.append(" \"lastStepResult\": \"").append(lastStepResult.describe()).append("\",\n"); + sb.append(" \"stepNumber\": ").append(stepNumber).append(",\n"); + + appendJsonArray(sb, "haltingConditions", haltingConditions); + appendJsonArray(sb, "globalPretreatments", globalPretreatments); + appendJsonArray(sb, "stepPretreatments", stepPretreatments); + appendJsonArray(sb, "globalEndTreatments", globalEndTreatments); + appendJsonArray(sb, "endOfStepTreatments", endOfStepTreatments, false); + + sb.append("\n}"); + return sb.toString(); + } + + // Convert to a human-readable structured string + public String toPrettyString() { + StringBuilder sb = new StringBuilder(); + sb.append("ChaseImpl\n"); + sb.append("├── FactBase (size): ").append(factBase.size()).append("\n"); + sb.append("├── RuleBase (size): ").append(ruleBase.getRules().size()).append("\n"); + sb.append("├── RuleScheduler: ").append(ruleScheduler.describe()).append("\n"); + sb.append("├── RuleApplier: ").append(ruleApplier.describe()).append("\n"); + sb.append("├── LastStepResult: ").append(lastStepResult.describe()).append("\n"); + sb.append("├── StepNumber: ").append(stepNumber).append("\n"); + + appendPrettySection(sb, "HaltingConditions", haltingConditions); + appendPrettySection(sb, "GlobalPretreatments", globalPretreatments); + appendPrettySection(sb, "StepPretreatments", stepPretreatments); + appendPrettySection(sb, "GlobalEndTreatments", globalEndTreatments); + appendPrettySection(sb, "EndOfStepTreatments", endOfStepTreatments); + + return sb.toString(); + } + + // Helper method for JSON arrays + private static <T> void appendJsonArray(StringBuilder sb, String key, Collection<T> collection) { + appendJsonArray(sb, key, collection, true); + } + + private static <T> void appendJsonArray(StringBuilder sb, String key, Collection<T> collection, boolean addComma) { + sb.append(" \"").append(key).append("\": ["); + if (collection.isEmpty()) { + sb.append("]"); + if (addComma) sb.append(","); + sb.append("\n"); + } else { + sb.append("\n"); + for (T item : collection) { + sb.append(" \"").append(item.toString()).append("\",\n"); + } + sb.setLength(sb.length() - 2); // Remove last comma + sb.append("\n ]"); + if (addComma) sb.append(","); + sb.append("\n"); + } + } + + // Helper method for structured string sections + private static <T> void appendPrettySection(StringBuilder sb, String title, Collection<T> collection) { + sb.append("├── ").append(title).append(":\n"); + if (collection.isEmpty()) { + sb.append("│ ├── None\n"); + } else { + for (T item : collection) { + sb.append("│ ├── ").append(item.toString()).append("\n"); + } + } + } +} diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/IChaseDescription.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/IChaseDescription.java new file mode 100644 index 0000000000000000000000000000000000000000..d7203fea0faeddbd04707630451405c7dc2a3dc9 --- /dev/null +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/IChaseDescription.java @@ -0,0 +1,29 @@ +package fr.boreal.forward_chaining.chase.description; + +import fr.boreal.configuration.keywords.InteGraalKeywords; +import fr.boreal.configuration.parameters.IGParameter; + +import java.util.Collection; + +public interface IChaseDescription { + + /** + * + * @return a string description of the chase configuration and status + */ + public String toJson(); + + /** + * + * @return a JSON string description of the chase configuration and status + */ + public String toPrettyString(); + + /** + * + * @return the set of parameters corresponding to this chase configuration + */ + default Collection<IGParameter<InteGraalKeywords,?>> getCorrespondingParameters(){ + return null; + } +} diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/StratifiedChaseDescription.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/StratifiedChaseDescription.java new file mode 100644 index 0000000000000000000000000000000000000000..84e8c5fe8e720374afb1833633df122d4c007b2b --- /dev/null +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/StratifiedChaseDescription.java @@ -0,0 +1,112 @@ +package fr.boreal.forward_chaining.chase.description; + +import fr.boreal.forward_chaining.chase.Chase; +import fr.boreal.forward_chaining.chase.ChaseBuilder; +import fr.boreal.forward_chaining.chase.halting_condition.HaltingCondition; +import fr.boreal.forward_chaining.chase.treatment.EndTreatment; +import fr.boreal.forward_chaining.chase.treatment.Pretreatment; +import fr.boreal.model.kb.api.FactBase; +import fr.boreal.model.kb.api.RuleBase; + +import java.util.Collection; +import java.util.List; + +public record StratifiedChaseDescription( + FactBase factBase, + List<RuleBase> strata, + Chase chase, + ChaseBuilder chaseBuilder, + Collection<HaltingCondition> haltingConditions, + Collection<Pretreatment> globalPretreatments, + Collection<Pretreatment> stepPretreatments, + Collection<EndTreatment> globalEndTreatments, + Collection<EndTreatment> endOfStepTreatments, + int stepNumber +) implements IChaseDescription { + + // Convert to manually built JSON string + public String toJson() { + StringBuilder sb = new StringBuilder(); + sb.append("{\n"); + + sb.append(" \"factBaseSize\": ").append(factBase.size()).append(",\n"); + + // Strata as an array + sb.append(" \"strata\": [\n"); + for (int i = 0; i < strata.size(); i++) { + sb.append(" { \"stratumIndex\": ").append(i) + .append(", \"ruleCount\": ").append(strata.get(i).getRules().size()).append(" }"); + if (i < strata.size() - 1) sb.append(","); + sb.append("\n"); + } + sb.append(" ],\n"); + + sb.append(" \"currentStepNumber\": ").append(stepNumber).append(",\n"); + sb.append(" \"currentChase\": \"").append(chase != null ? chase.describe() : "None").append("\",\n"); + + appendJsonArray(sb, "haltingConditions", haltingConditions); + appendJsonArray(sb, "globalPretreatments", globalPretreatments); + appendJsonArray(sb, "stepPretreatments", stepPretreatments); + appendJsonArray(sb, "globalEndTreatments", globalEndTreatments); + appendJsonArray(sb, "endOfStepTreatments", endOfStepTreatments, false); + + sb.append("\n}"); + return sb.toString(); + } + + // Convert to human-readable structured string + public String toPrettyString() { + StringBuilder sb = new StringBuilder(); + sb.append("StratifiedChase\n"); + sb.append("├── FactBase (size): ").append(factBase.size()).append("\n"); + + sb.append("├── Strata:\n"); + for (int i = 0; i < strata.size(); i++) { + sb.append("│ ├── Stratum ").append(i).append(" (size): ").append(strata.get(i).getRules().size()).append("\n"); + } + + sb.append("├── Current Step Number: ").append(stepNumber).append("\n"); + sb.append("├── Current Chase: ").append(chase != null ? chase.describe() : "None").append("\n"); + + appendPrettySection(sb, "HaltingConditions", haltingConditions); + appendPrettySection(sb, "GlobalPretreatments", globalPretreatments); + appendPrettySection(sb, "StepPretreatments", stepPretreatments); + appendPrettySection(sb, "GlobalEndTreatments", globalEndTreatments); + appendPrettySection(sb, "EndOfStepTreatments", endOfStepTreatments); + + return sb.toString(); + } + + // Helper method for JSON arrays + private static <T> void appendJsonArray(StringBuilder sb, String key, Collection<T> collection) { + appendJsonArray(sb, key, collection, true); + } + + private static <T> void appendJsonArray(StringBuilder sb, String key, Collection<T> collection, boolean addComma) { + sb.append(" \"").append(key).append("\": ["); + if (collection.isEmpty()) { + sb.append("],\n"); + } else { + sb.append("\n"); + for (T item : collection) { + sb.append(" \"").append(item.toString()).append("\",\n"); + } + sb.setLength(sb.length() - 2); // Remove last comma + sb.append("\n ]"); + if (addComma) sb.append(","); + sb.append("\n"); + } + } + + // Helper method for structured string sections + private static <T> void appendPrettySection(StringBuilder sb, String title, Collection<T> collection) { + sb.append("├── ").append(title).append(":\n"); + if (collection.isEmpty()) { + sb.append("│ ├── None\n"); + } else { + for (T item : collection) { + sb.append("│ ├── ").append(item.toString()).append("\n"); + } + } + } +} diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/halting_condition/HaltingCondition.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/halting_condition/HaltingCondition.java index 72942ff935bf973b1f4e225ed1cebbea3cbb7360..93d05e2565eafc4523c1cf924e9ab12998c2576f 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/halting_condition/HaltingCondition.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/halting_condition/HaltingCondition.java @@ -18,4 +18,9 @@ public interface HaltingCondition { */ boolean check(); + /** + * Defautl method to describe the rule scheduler + */ + default String describe(){return this.getClass().getSimpleName();} + } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/metachase/stratified/StratifiedChase.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/metachase/stratified/StratifiedChase.java index 74dd1153667f2f61d29bfa40fef273df158feff4..d6aa65d5e23069ef4203939e4d012a945cbd11e8 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/metachase/stratified/StratifiedChase.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/metachase/stratified/StratifiedChase.java @@ -3,20 +3,20 @@ package fr.boreal.forward_chaining.chase.metachase.stratified; import fr.boreal.forward_chaining.chase.Chase; import fr.boreal.forward_chaining.chase.ChaseBuilder; import fr.boreal.forward_chaining.chase.RuleApplicationStepResult; +import fr.boreal.forward_chaining.chase.description.ChaseDescription; +import fr.boreal.forward_chaining.chase.description.IChaseDescription; +import fr.boreal.forward_chaining.chase.description.StratifiedChaseDescription; import fr.boreal.forward_chaining.chase.halting_condition.HaltingCondition; -import fr.boreal.forward_chaining.chase.lineage.LineageTracker; -import fr.boreal.forward_chaining.chase.lineage.LineageTrackerImpl; import fr.boreal.forward_chaining.chase.rule_scheduler.RuleScheduler; import fr.boreal.forward_chaining.chase.treatment.EndTreatment; import fr.boreal.forward_chaining.chase.treatment.Pretreatment; import fr.boreal.forward_chaining.chase.treatment.Treatment; import fr.boreal.model.kb.api.FactBase; import fr.boreal.model.kb.api.RuleBase; -import fr.boreal.model.logicalElements.api.Atom; -import fr.boreal.model.logicalElements.api.Substitution; -import fr.boreal.model.rule.api.Rule; -import java.util.*; +import java.util.Collection; +import java.util.List; +import java.util.Optional; public class StratifiedChase implements Chase { private final FactBase fb; @@ -128,7 +128,7 @@ public class StratifiedChase implements Chase { @Override public String toString() { return "Steps : " + this.step_number + - "\nFacts :\n" + this.fb.toString(); + "\nFacts :\n" + this.fb.toString(); } private void initAll() { @@ -158,4 +158,20 @@ public class StratifiedChase implements Chase { private void initHaltingConditions() { this.halting_conditions.forEach(condition -> condition.init(this)); } + + public IChaseDescription getDescription() { + return new StratifiedChaseDescription( + fb, + strata, + chase, + chaseBuilder, + halting_conditions, + global_pretreatments, + step_pretreatments, + global_end_treatments, + end_of_step_treatments, + step_number + ); + } + } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/AbstractRuleApplier.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/AbstractRuleApplier.java index 65643a52d7d69b0e9d3d8308705d97eeefd8a4df..55ef02dcc0355603413d31f5c86c92d87418d3ae 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/AbstractRuleApplier.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/AbstractRuleApplier.java @@ -5,8 +5,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; -import fr.boreal.forward_chaining.chase.lineage.LineageTracker; -import fr.boreal.forward_chaining.chase.lineage.LineageTrackerImpl; import org.slf4j.Logger; import fr.boreal.forward_chaining.chase.Chase; @@ -19,73 +17,91 @@ import fr.boreal.model.rule.api.FORule; /** * @author Florent Tornil - * <p> + * * Abstract class */ public abstract class AbstractRuleApplier implements RuleApplier { - protected Logger LOG; - - /** - * Transformation of the rule's body to a query - */ - protected final BodyToQueryTransformer transformer; - - /** - * How to evaluate the rule's body - */ - protected final TriggerComputer computer; - - /** - * How to check the trigger should be applied - */ - protected final TriggerChecker checker; - - /** - * How to effectively apply the trigger - */ - protected final TriggerApplier applier; - - /** - * Constructor - * - * @param transformer the BodyToQueryTransformer - * @param computer the TriggerComputer - * @param checker the TriggerChecker - * @param applier the TriggerApplier - */ - public AbstractRuleApplier(BodyToQueryTransformer transformer, TriggerComputer computer, TriggerChecker checker, TriggerApplier applier) { - this.transformer = transformer; - this.computer = computer; - this.checker = checker; - this.applier = applier; - } - - @Override - public void init(Chase c) { - this.computer.init(c); - } - - /** - * Re-groups the rules with the same body - * - * @param rules rules to re-group - * @return the map of query to rules - */ - protected Map<FOQuery<?>, Collection<FORule>> groupRulesByBodyQuery(Collection<FORule> rules) { - Map<FOQuery<?>, Collection<FORule>> map = new HashMap<>(); - - for (FORule rule : rules) { - FOQuery<?> ruleQuery = this.transformer.transform(rule); - if (!map.containsKey(ruleQuery)) { - map.put(ruleQuery, new ArrayList<>()); - } - map.get(ruleQuery).add(rule); - } - return map; - } - - public TriggerApplier getTriggerApplier(){ - return applier; - } + protected Logger LOG; + + /** + * Transformation of the rule's body to a query + */ + protected final BodyToQueryTransformer transformer; + + /** + * How to evaluate the rule's body + */ + protected final TriggerComputer computer; + + /** + * How to check the trigger should be applied + */ + protected final TriggerChecker checker; + + /** + * How to effectively apply the trigger + */ + protected final TriggerApplier applier; + + /** + * Defautl method to describe the rule scheduler + */ + public String describe(){ + return "\n" + + "│ ├── TriggerComputer: " + computer.describe() + "\n" + + "│ ├── TriggerChecker: " + checker.describe() + "\n" + + "│ ├── TriggerApplier: " + applier.describe() + "\n" + + "│ └── BodyToQueryTransformer: " + transformer.describe(); + } + + @Override + public String describeJSON() { + return "{\n" + + " \"TriggerComputer\": \"" + computer.describe() + "\",\n" + + " \"TriggerChecker\": \"" + checker.describe() + "\",\n" + + " \"TriggerApplier\": \"" + applier.describe() + "\",\n" + + " \"BodyToQueryTransformer\": \"" + transformer.describe() + "\"\n" + + "}"; + } + + /** + * Constructor + * + * @param transformer the BodyToQueryTransformer + * @param computer the TriggerComputer + * @param checker the TriggerChecker + * @param applier the TriggerApplier + */ + public AbstractRuleApplier(BodyToQueryTransformer transformer, TriggerComputer computer, TriggerChecker checker, TriggerApplier applier) { + this.transformer = transformer; + this.computer = computer; + this.checker = checker; + this.applier = applier; + } + + @Override + public void init(Chase c) { + this.computer.init(c); + } + + /** + * Re-groups the rules with the same body + * + * @param rules rules to re-group + * @return the map of query to rules + */ + protected Map<FOQuery<?>, Collection<FORule>> groupRulesByBodyQuery(Collection<FORule> rules) { + Map<FOQuery<?>, Collection<FORule>> map = new HashMap<>(); + + for(FORule rule : rules) { + FOQuery<?> ruleQuery = this.transformer.transform(rule); + if(!map.containsKey(ruleQuery)) { + map.put(ruleQuery, new ArrayList<>()); + } + map.get(ruleQuery).add(rule); + } + return map; + } + } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/RuleApplier.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/RuleApplier.java index dd1cbfd35082fce36099ff6c92f1a4e7b96a177f..5b344d6dbf9d93d6c135a3c3a11edca0a631fbc6 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/RuleApplier.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/RuleApplier.java @@ -1,46 +1,40 @@ package fr.boreal.forward_chaining.chase.rule_applier; import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; import fr.boreal.forward_chaining.chase.Chase; import fr.boreal.forward_chaining.chase.RuleApplicationStepResult; -import fr.boreal.forward_chaining.chase.lineage.LineageTracker; -import fr.boreal.forward_chaining.chase.rule_applier.trigger_applier.TriggerApplier; import fr.boreal.model.kb.api.FactBase; -import fr.boreal.model.logicalElements.api.Atom; -import fr.boreal.model.logicalElements.api.Substitution; import fr.boreal.model.rule.api.FORule; -import fr.boreal.model.rule.api.Rule; /** * A rule applier applies the given rules of the given factbase */ public interface RuleApplier { - - /** - * Initialize the rule applier for the given chase - * - * @param c the chase object - */ + + /** + * Initialize the rule applier for the given chase + * @param c the chase object + */ void init(Chase c); - - /** - * Applies the given rules on the given factbase an returns the result (see {@link RuleApplicationStepResult}) - * - * @param rules the rules to apply - * @param fb the factbase to apply the rules on - * @return the result of one application step - */ + + /** + * Applies the given rules on the given factbase an returns the result (see {@link RuleApplicationStepResult}) + * @param rules the rules to apply + * @param fb the factbase to apply the rules on + * @return the result of one application step + */ RuleApplicationStepResult apply(Collection<FORule> rules, FactBase fb); - /** - * - * @return the lineage tracker - */ - default TriggerApplier getTriggerApplier(){ - throw new RuntimeException("operation not supported"); - } + /** + * + * @return a description of the rule applier + */ + String describe(); + + /** + * + * @return a JSON description of the rule applier + */ + String describeJSON(); } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/SourceDelegatedDatalogRuleApplier.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/SourceDelegatedDatalogRuleApplier.java index 29c3f623fb74f45cb23a96de0206aa3146cad2cd..1a154ac9e00453c22e967815716395f4a8887e89 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/SourceDelegatedDatalogRuleApplier.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/SourceDelegatedDatalogRuleApplier.java @@ -95,5 +95,17 @@ public class SourceDelegatedDatalogRuleApplier implements RuleApplier { return this.fallback.apply(rules, fb); } + @Override + public String describe() { + return this.getClass().getSimpleName() + " with fallback " + this.fallback.describe(); + } + + @Override + public String describeJSON() { + return "{\n" + + " \"class\": \"" + this.getClass().getSimpleName() + "\",\n" + + " \"fallback\": \"" + this.fallback.describe() + "\"\n" + + "}"; + } } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/body_to_query_transformer/BodyToQueryTransformer.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/body_to_query_transformer/BodyToQueryTransformer.java index a26cb1b18545146ded12b335f72e6a1ebe6b53f0..67acc92d49e430745bb0226011b681a8fba4fec3 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/body_to_query_transformer/BodyToQueryTransformer.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/body_to_query_transformer/BodyToQueryTransformer.java @@ -20,4 +20,10 @@ public interface BodyToQueryTransformer { */ FOQuery<?> transform(FORule rule); + + /** + * Defautl method to describe the rule scheduler + */ + default String describe(){return this.getClass().getSimpleName();} + } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_applier/TriggerApplier.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_applier/TriggerApplier.java index 752755f1f0e3f26da0ae263e24136774a51cf768..c8fa25deffae1d2dc335e4fa0ad1f547a66de6f9 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_applier/TriggerApplier.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_applier/TriggerApplier.java @@ -26,4 +26,9 @@ public interface TriggerApplier { */ FOFormula apply(FORule rule, Substitution substitution, FactBase fb); + + /** + * Defautl method to describe the rule scheduler + */ + default String describe(){return this.getClass().getSimpleName();} } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_checker/TriggerChecker.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_checker/TriggerChecker.java index 7ca56943ec3671589dfae59eefab33bc04fe9154..cf480a9cb37cc15f01df79dc630fe2653ff75901 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_checker/TriggerChecker.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_checker/TriggerChecker.java @@ -17,4 +17,9 @@ public interface TriggerChecker { */ boolean check(FORule rule, Substitution substitution, FactBase fb); + + /** + * Defautl method to describe the rule scheduler + */ + default String describe(){return this.getClass().getSimpleName();} } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_computer/TriggerComputer.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_computer/TriggerComputer.java index 9f2e55d98a2047783a39fe0bbcb67a0f05e72dc0..16380ba2cff89c28fe959854c8a386012b4fdb92 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_computer/TriggerComputer.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_computer/TriggerComputer.java @@ -26,4 +26,9 @@ public interface TriggerComputer { */ Iterator<Substitution> compute(FOQuery<?> body, FactBase fb); + + /** + * Defautl method to describe the rule scheduler + */ + default String describe(){return this.getClass().getSimpleName();} } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/GRDScheduler.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/GRDScheduler.java index db0e4464f058db81717680c9e58a02f20ec3664b..bd95819bc283488eac3a0ccc6bdde28c5524f8e1 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/GRDScheduler.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/GRDScheduler.java @@ -3,10 +3,13 @@ package fr.boreal.forward_chaining.chase.rule_scheduler; import java.util.Collection; import java.util.stream.Collectors; +import fr.boreal.configuration.parameters.IGParameter; import fr.boreal.grd.api.GraphOfFORuleDependencies; import fr.boreal.grd.impl.GRDImpl; import fr.boreal.model.kb.api.RuleBase; import fr.boreal.model.rule.api.FORule; +import fr.boreal.configuration.keywords.InteGraalKeywords; +import org.eclipse.rdf4j.query.algebra.In; /** * Schedules all the rules that can be triggered by rules applied at the previous step @@ -41,4 +44,12 @@ public class GRDScheduler implements RuleScheduler { .collect(Collectors.toSet()); } + public String describe(){ + return getCorrespondingParameter().value().toString(); + } + + public IGParameter<InteGraalKeywords,?> getCorrespondingParameter(){ + return new IGParameter<>(InteGraalKeywords.SCHEDULER,InteGraalKeywords.Algorithms.Parameters.Chase.Scheduler.GRD); + } + } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/NaiveScheduler.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/NaiveScheduler.java index f28e10e4c7c0b9f2ace21617af3d615267eecb76..fd0ebce8b66059e78ced2fa9e5e9ec5382b48ac2 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/NaiveScheduler.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/NaiveScheduler.java @@ -2,8 +2,10 @@ package fr.boreal.forward_chaining.chase.rule_scheduler; import java.util.Collection; +import fr.boreal.configuration.parameters.IGParameter; import fr.boreal.model.kb.api.RuleBase; import fr.boreal.model.rule.api.FORule; +import fr.boreal.configuration.keywords.InteGraalKeywords; /** * Schedules all the rules for every step @@ -29,5 +31,12 @@ public class NaiveScheduler implements RuleScheduler { return this.rb.getRules(); } + public String describe(){ + return getCorrespondingParameter().value().toString(); + } + + public IGParameter<InteGraalKeywords,?> getCorrespondingParameter(){ + return new IGParameter<>(InteGraalKeywords.SCHEDULER,InteGraalKeywords.Algorithms.Parameters.Chase.Scheduler.NAIVE_SCHEDULER); + } } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/RuleScheduler.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/RuleScheduler.java index 0f29bb38501aa9a93763f5cb15c93567a6a14bc4..b9312da3e34b5f123936d934dd26868fef9badc9 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/RuleScheduler.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/RuleScheduler.java @@ -2,6 +2,8 @@ package fr.boreal.forward_chaining.chase.rule_scheduler; import java.util.Collection; +import fr.boreal.configuration.keywords.InteGraalKeywords; +import fr.boreal.configuration.parameters.IGParameter; import fr.boreal.model.kb.api.RuleBase; import fr.boreal.model.rule.api.FORule; @@ -21,5 +23,15 @@ public interface RuleScheduler { * @return the rules to apply at the next step */ Collection<FORule> getRulesToApply(Collection<FORule> last_applied_rules); - + + /** + * Defautl method to describe the rule scheduler + */ + String describe(); + + /** + * + * @return the parameter corresponding to this object + */ + IGParameter<InteGraalKeywords,?> getCorrespondingParameter(); } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/treatment/Treatment.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/treatment/Treatment.java index 531d5e59c29e35f53d632061029801fefb6aa37c..c45c68fd32acfebbe6fd94fcc804f514683be25e 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/treatment/Treatment.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/treatment/Treatment.java @@ -17,7 +17,10 @@ public interface Treatment { * Applies the treatment */ void apply(); - - + + /** + * Defautl method to describe the rule scheduler + */ + default String describe(){return this.getClass().getSimpleName();} } diff --git a/integraal/integraal-forward-chaining/src/main/java/module-info.java b/integraal/integraal-forward-chaining/src/main/java/module-info.java index 2395c00170fef5dc28fa033cec6ef6bea710a110..da7ffc9984c03c1351761ecd00408f06a0646230 100644 --- a/integraal/integraal-forward-chaining/src/main/java/module-info.java +++ b/integraal/integraal-forward-chaining/src/main/java/module-info.java @@ -5,11 +5,8 @@ * */ module fr.boreal.forward_chaining { - - requires transitive fr.boreal.model; - + requires fr.boreal.query_evaluation; - requires fr.lirmm.boreal.util; requires fr.boreal.storage; requires fr.boreal.grd; requires fr.boreal.core; @@ -17,9 +14,13 @@ module fr.boreal.forward_chaining { requires org.slf4j; requires org.jgrapht.core; + requires com.fasterxml.jackson.databind; + requires fr.boreal.configuration; + requires rdf4j.queryalgebra.model; - exports fr.boreal.forward_chaining.api; + exports fr.boreal.forward_chaining.api; exports fr.boreal.forward_chaining.chase; + exports fr.boreal.forward_chaining.chase.description; exports fr.boreal.forward_chaining.chase.halting_condition; exports fr.boreal.forward_chaining.chase.rule_applier; exports fr.boreal.forward_chaining.chase.rule_applier.body_to_query_transformer; diff --git a/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/api/PredicateFactory.java b/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/api/PredicateFactory.java index a198f62465619b8d490c1872363c02429d50ca5a..28714a863b0c764ff0a7161981da65f993185234 100644 --- a/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/api/PredicateFactory.java +++ b/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/api/PredicateFactory.java @@ -1,5 +1,7 @@ package fr.boreal.model.logicalElements.factory.api; +import java.util.Optional; + import fr.boreal.model.logicalElements.api.Predicate; /** @@ -38,4 +40,13 @@ public interface PredicateFactory { */ boolean forgetPredicate(String label); + /** + * Gets a previously created predicate. + * <br/> + * This predicate will no longer be considered as already existing in the factory. + * + * @param label the label of the previously created predicate + * @return an optional that contains the predicate if there is one + */ + Optional<Predicate> getPredicate(String label); } diff --git a/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/impl/SameObjectPredicateFactory.java b/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/impl/SameObjectPredicateFactory.java index 4f1533773b81cd668018f49d0c06dcda54500fcf..56108db78f0b3053884cd7a86b456f2224445d6b 100644 --- a/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/impl/SameObjectPredicateFactory.java +++ b/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/impl/SameObjectPredicateFactory.java @@ -2,6 +2,7 @@ package fr.boreal.model.logicalElements.factory.impl; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import fr.boreal.model.logicalElements.api.Predicate; import fr.boreal.model.logicalElements.factory.api.PredicateFactory; @@ -69,4 +70,9 @@ public class SameObjectPredicateFactory implements PredicateFactory { else return false; } + @Override + public Optional<Predicate> getPredicate(String label) { + return Optional.ofNullable(this.predicates.get(label)); + } + } diff --git a/integraal/integraal-query-evaluation/src/main/java/module-info.java b/integraal/integraal-query-evaluation/src/main/java/module-info.java index 2acc5edcf2dcfcc9c4ae678f6da1270d0fe8b305..4044d0c26d09e9d689b7c2514db6168c207ed8ea 100644 --- a/integraal/integraal-query-evaluation/src/main/java/module-info.java +++ b/integraal/integraal-query-evaluation/src/main/java/module-info.java @@ -25,6 +25,6 @@ module fr.boreal.query_evaluation { exports fr.boreal.query_evaluation.conjunction.backtrack; exports fr.boreal.query_evaluation.generic; exports fr.boreal.query_evaluation.negation; - exports fr.boreal.query_evaluation.component; + exports fr.boreal.query_evaluation.union; } \ No newline at end of file diff --git a/integraal/integraal-util/pom.xml b/integraal/integraal-util/pom.xml index aec9df5c5b99158e75a0f365d00147049b475865..8ab21c37d099838290f7887dd16b947e3820e5b2 100644 --- a/integraal/integraal-util/pom.xml +++ b/integraal/integraal-util/pom.xml @@ -23,14 +23,6 @@ <groupId>${groupId}</groupId> <artifactId>integraal-graal-ruleset-analysis</artifactId> </dependency> - <dependency> - <groupId>fr.lirmm.graphik</groupId> - <artifactId>graal-api</artifactId> - </dependency> - <dependency> - <groupId>fr.lirmm.graphik</groupId> - <artifactId>graal-core</artifactId> - </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/CallableWithTimeout.java b/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/timeout/CallableWithTimeout.java similarity index 97% rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/CallableWithTimeout.java rename to integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/timeout/CallableWithTimeout.java index b2f071b799563e6fb99682cbd70994b1ae002785..1b65516d0beee20f64fda6aa972124e8136cdfe8 100644 --- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/CallableWithTimeout.java +++ b/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/timeout/CallableWithTimeout.java @@ -1,4 +1,4 @@ -package fr.lirmm.boreal.util.evaluator; +package fr.lirmm.boreal.util.timeout; import java.time.Duration; import java.util.Objects; diff --git a/integraal/integraal-util/src/main/java/module-info.java b/integraal/integraal-util/src/main/java/module-info.java index 669038cf688cd2632d8f1f01bf85095e87b645c9..1018e2dd4abdc004c6c453ce873a350f1735d90f 100644 --- a/integraal/integraal-util/src/main/java/module-info.java +++ b/integraal/integraal-util/src/main/java/module-info.java @@ -13,7 +13,6 @@ module fr.lirmm.boreal.util { requires org.slf4j; exports fr.lirmm.boreal.util; - exports fr.lirmm.boreal.util.keywords; exports fr.lirmm.boreal.util.time; exports fr.lirmm.boreal.util.converter; exports fr.lirmm.boreal.util.stream; @@ -22,9 +21,8 @@ module fr.lirmm.boreal.util { exports fr.lirmm.boreal.util.validator.data; exports fr.lirmm.boreal.util.validator.query; exports fr.lirmm.boreal.util.validator.rule; - exports fr.lirmm.boreal.util.evaluator; exports fr.lirmm.boreal.util.object_analyzer; exports fr.lirmm.boreal.util.enumerations; - exports fr.lirmm.boreal.util.externalHaltingConditions; + exports fr.lirmm.boreal.util.timeout; } \ No newline at end of file diff --git a/integraal/integraal-util/src/test/java/evaluators/CallableWithTimeoutTest.java b/integraal/integraal-util/src/test/java/timeout/CallableWithTimeoutTest.java similarity index 95% rename from integraal/integraal-util/src/test/java/evaluators/CallableWithTimeoutTest.java rename to integraal/integraal-util/src/test/java/timeout/CallableWithTimeoutTest.java index 3305321e40e3455a3ed7d1538cf08a04cedddc91..e245942156efbe455566e6c4c3ba7a3218aa2d46 100644 --- a/integraal/integraal-util/src/test/java/evaluators/CallableWithTimeoutTest.java +++ b/integraal/integraal-util/src/test/java/timeout/CallableWithTimeoutTest.java @@ -1,4 +1,4 @@ -package evaluators; +package timeout; import static org.junit.Assert.assertNull; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -7,9 +7,9 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.time.Duration; import java.util.concurrent.Callable; +import fr.lirmm.boreal.util.timeout.CallableWithTimeout; import org.junit.Test; -import fr.lirmm.boreal.util.evaluator.CallableWithTimeout; public class CallableWithTimeoutTest { diff --git a/integraal/integraal-views/src/main/java/fr/boreal/views/builder/ViewBuilder.java b/integraal/integraal-views/src/main/java/fr/boreal/views/builder/ViewBuilder.java index 1c7f2a54887fd9acee991c069c8eb8017003c931..20a7e8b6d9e9afbf1b3251ae6c4e9e3784673afc 100644 --- a/integraal/integraal-views/src/main/java/fr/boreal/views/builder/ViewBuilder.java +++ b/integraal/integraal-views/src/main/java/fr/boreal/views/builder/ViewBuilder.java @@ -86,6 +86,7 @@ public class ViewBuilder { } }; + wrapper.setName(d.getId()); for (ViewDefinition m : document.getMappingsByDatasource(d)) { String query = m.getNativeQuery(); Optional<String> position = m.getPositioning(); @@ -141,6 +142,8 @@ public class ViewBuilder { */ public static class ViewBuilderException extends Exception { + private static final long serialVersionUID = 1L; + /** * @param message the message of the exception */ diff --git a/integraal/integraal-views/src/main/java/fr/boreal/views/datasource/AbstractViewWrapper.java b/integraal/integraal-views/src/main/java/fr/boreal/views/datasource/AbstractViewWrapper.java index 91538d5eb40c820366e59e7e62ad087245a7ce15..a3c7ad7c6d1f1bab1d90699ea3ddede8a4b6bd55 100644 --- a/integraal/integraal-views/src/main/java/fr/boreal/views/datasource/AbstractViewWrapper.java +++ b/integraal/integraal-views/src/main/java/fr/boreal/views/datasource/AbstractViewWrapper.java @@ -24,6 +24,7 @@ import fr.lirmm.boreal.util.stream.filter.MatchFilter; */ public abstract class AbstractViewWrapper<NativeQueryType, NativeResultType> implements Readable { + private String name; private final Specializer<NativeQueryType> specializer; private final NativeQueryEvaluator<NativeQueryType, NativeResultType> evaluator; private final Transformer<NativeResultType> transformer; @@ -37,6 +38,18 @@ public abstract class AbstractViewWrapper<NativeQueryType, NativeResultType> imp * @param transformer to transform the native result into atoms */ public AbstractViewWrapper(Specializer<NativeQueryType> specializer, NativeQueryEvaluator<NativeQueryType, NativeResultType> evaluator, Transformer<NativeResultType> transformer) { + this(null, specializer,evaluator,transformer); + } + + /** + * Create a new wrapper over a data-source with a relational view + * @param name to identify the datasource + * @param specializer to specialize the native query + * @param evaluator to evaluate the native query + * @param transformer to transform the native result into atoms + */ + public AbstractViewWrapper(String name, Specializer<NativeQueryType> specializer, NativeQueryEvaluator<NativeQueryType, NativeResultType> evaluator, Transformer<NativeResultType> transformer) { + this.name = name; this.specializer = specializer; this.evaluator = evaluator; this.transformer = transformer; @@ -85,9 +98,28 @@ public abstract class AbstractViewWrapper<NativeQueryType, NativeResultType> imp return this.transformer; } + /** + * @return the predicates corresponding to the relational views of the datasource + */ public Collection<Predicate> getPredicates() { return this.viewByPredicate.keySet(); } + + /** + * @return an optional that contains the datasource name if there is one + */ + public Optional<String> getName() { + return Optional.ofNullable(this.name); + } + + /** + * @param name the new datasource name + */ + public void setName(String name) { + this.name=name; + } + + ///////////////////////////////////////////////// // FactStorage methods