diff --git a/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/CompositeMarkdownInfo.java b/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/CompositeMarkdownInfo.java index 996947f89..fe07bc960 100644 --- a/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/CompositeMarkdownInfo.java +++ b/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/CompositeMarkdownInfo.java @@ -26,16 +26,22 @@ public class CompositeMarkdownInfo implements MarkdownInfo { @Override public FrontMatterInfo getFrontmatter() { - // calculate included topics - return null; + return elements.get(0).getFrontmatter(); } @Override public boolean hasAggregations() { - // was true, but now it is false after compositing return false; } + @Override + public MarkdownInfo withTopics(List assigning) { + MarkdownInfo leader = elements.get(0); + leader = leader.withTopics(assigning); + elements.set(0,leader); + return this; + } + public CompositeMarkdownInfo add(T element) { elements.add(element); return this; diff --git a/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/MarkdownDocs.java b/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/MarkdownDocs.java index 04d9416c5..9bc900634 100644 --- a/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/MarkdownDocs.java +++ b/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/MarkdownDocs.java @@ -10,6 +10,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.*; +import java.util.function.Supplier; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -55,24 +56,54 @@ public class MarkdownDocs { List markdownWithTopicGlobs = ListSplitterWhyDoesJavaNotDoThisAlready.partition(markdownInfos, MarkdownInfo::hasTopicGlobs); + List markdownWithOnlyTopicGlobs = + ListSplitterWhyDoesJavaNotDoThisAlready.partition(markdownWithTopicGlobs, m -> m.getTopics().size()==0); - int loopsremaining=100; - // TODO: add logic to deal with leaf nodes and kick intermediate nodes to the end of the processing list. - // TODO: Double check exit conditions and warn user - while (markdownWithTopicGlobs.size()>0 && loopsremaining>0) { - for (MarkdownInfo markdownWithTopicGlob : markdownWithTopicGlobs) { - markdownWithTopicGlob.getTopicGlobs(); - for (MarkdownInfo allInfo : markdownInfos) { -// allInfo.getTopics() + List ordered = new ArrayList<>(); + + + // At this point, we have three set of markdown infos + // a) with only globs + // b) with globs and literals + // c) with only literals + // We can do an O((n/2)^2) association check, which is better than O(n^2) + + ordered.addAll(markdownWithOnlyTopicGlobs); + ordered.addAll(markdownWithTopicGlobs); + ordered.addAll(markdownInfos); + + List>> edges = new ArrayList<>(); + List assigning = null; + + for (int i = 0; i < ordered.size()-1; i++) { + MarkdownInfo mdHavingGlobs = ordered.get(i); + List topicGlobs = mdHavingGlobs.getTopicGlobs(); + + // TODO track and warn if a glob doesn't match anything + for (int j = i+1; j < ordered.size(); j++) { + + MarkdownInfo mdHavingTopics = ordered.get(j); + List topics = mdHavingTopics.getTopics(); + + for (Pattern topicGlob : topicGlobs) { + + for (String topic : topics) { + if (topicGlob.matcher(topic).matches()) { + assigning=assigning==null ? new ArrayList<>() : assigning; + assigning.add(topic); + logger.debug("added topic=" + topic + " to " + i + "->" + j + " with " + topicGlob); + } + } + if (assigning!=null) { + assigning.addAll(mdHavingGlobs.getTopics()); + ordered.set(i,mdHavingGlobs.withTopics(assigning)); + logger.debug("assigned new mdinfo"); + } } } - loopsremaining--; - } - if (markdownWithTopicGlobs.size()>0) { - throw new RuntimeException("Non-terminal condition in markdown graph processing, unable to resolve all " + - "topic globs, " + markdownWithTopicGlobs.size() + " remaining: " + markdownWithTopicGlobs); } + int loopsremaining=100; // Assign glob topics to non-glob topics that match @@ -142,4 +173,28 @@ public class MarkdownDocs { || srcTopic.endsWith("$"); } + private static class Edge { + + private final int from; + private final int to; + private T edgeProps; + + public Edge(int from, int to, Supplier forT) { + this.from = from; + this.to = to; + edgeProps = forT.get(); + } + + public int from() { + return from; + } + public int to() { + return to; + } + public T props() { + return edgeProps; + } + + } + } diff --git a/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/ParsedFrontMatter.java b/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/ParsedFrontMatter.java index 896024f5c..1b88328c3 100644 --- a/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/ParsedFrontMatter.java +++ b/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/ParsedFrontMatter.java @@ -96,4 +96,18 @@ public class ParsedFrontMatter implements FrontMatterInfo { // TODO: allow functional version of this // this.data.put(FrontMatterInfo.TOPICS,newTopics); } + + public ParsedFrontMatter withTopics(List assigning) { + HashMap> newmap = new HashMap<>(); + newmap.putAll(this.data); + newmap.put(FrontMatterInfo.TOPICS,assigning); + return new ParsedFrontMatter(newmap); + } + + @Override + public String toString() { + return "ParsedFrontMatter{" + + "data=" + data + + '}'; + } } diff --git a/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/ParsedMarkdown.java b/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/ParsedMarkdown.java index c63c91c6a..fdbcc4b4a 100644 --- a/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/ParsedMarkdown.java +++ b/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/aggregator/ParsedMarkdown.java @@ -36,6 +36,11 @@ public class ParsedMarkdown implements MarkdownInfo, HasDiagnostics { logger.debug("created " + this.toString()); } + private ParsedMarkdown(ParsedFrontMatter frontMatter, Content content) { + this.frontMatter = frontMatter; + this.content = content; + } + @Override public Path getPath() { return content.asPath(); @@ -82,4 +87,15 @@ public class ParsedMarkdown implements MarkdownInfo, HasDiagnostics { public boolean hasAggregations() { return getFrontmatter().getAggregations().size()>0; } + + @Override + public MarkdownInfo withTopics(List assigning) { + return new ParsedMarkdown(frontMatter.withTopics(assigning), this.content); + } + + @Override + public String toString() { + return "ParsedMarkdown/" + + frontMatter.toString(); + } } diff --git a/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/types/MarkdownInfo.java b/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/types/MarkdownInfo.java index 0991f9ba7..0f171a4ee 100644 --- a/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/types/MarkdownInfo.java +++ b/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/types/MarkdownInfo.java @@ -39,4 +39,6 @@ public interface MarkdownInfo { default List getAggregators() { return getFrontmatter().getAggregations(); } + + MarkdownInfo withTopics(List assigning); } diff --git a/nb-api/src/test/resources/docs-for-testing-only/srctest-topics-b/intesting-topic2-1/intesting-entry-2-1-L.md b/nb-api/src/test/resources/docs-for-testing-only/srctest-topics-b/intesting-topic2-1/intesting-entry-2-1-L.md index 3c35c43ae..2720bf40c 100644 --- a/nb-api/src/test/resources/docs-for-testing-only/srctest-topics-b/intesting-topic2-1/intesting-entry-2-1-L.md +++ b/nb-api/src/test/resources/docs-for-testing-only/srctest-topics-b/intesting-topic2-1/intesting-entry-2-1-L.md @@ -1,6 +1,7 @@ --- title: srctest-Entry 2-1-L weight: 39 +topics: srctest-entry-2-1-L --- # Title Heading for srctest-Entry 2-1-L diff --git a/nb-api/src/test/resources/docs-for-testing-only/srctest-topics-b/intesting-topic2-1/md_having_glob.md b/nb-api/src/test/resources/docs-for-testing-only/srctest-topics-b/intesting-topic2-1/md_having_glob.md new file mode 100644 index 000000000..f316c0be4 --- /dev/null +++ b/nb-api/src/test/resources/docs-for-testing-only/srctest-topics-b/intesting-topic2-1/md_having_glob.md @@ -0,0 +1,9 @@ +--- +title: srctest-having-glob +topics: srctest-entry-.+ +weight: 39 +--- + +# Title Heading for srctest-having-glob + + diff --git a/nb-api/src/test/resources/docs-for-testing-only/srctest-topics-b/intesting-topic2-1/md_having_globs_and_topics.md b/nb-api/src/test/resources/docs-for-testing-only/srctest-topics-b/intesting-topic2-1/md_having_globs_and_topics.md new file mode 100644 index 000000000..417e190d3 --- /dev/null +++ b/nb-api/src/test/resources/docs-for-testing-only/srctest-topics-b/intesting-topic2-1/md_having_globs_and_topics.md @@ -0,0 +1,9 @@ +--- +title: srctest-having-globs-and-topics +topics: some-random-topic,srctest-entry-.+ +weight: 39 +--- + +# Title Heading for srctest-having-globs-and-topics + +