001package org.dllearner.kb.sparql;
002
003import org.dllearner.algorithms.qtl.datastructures.impl.GenericTree;
004
005import java.util.ArrayList;
006import java.util.Deque;
007import java.util.Map;
008
009/**
010 * @author Lorenz Buehmann
011 */
012public class CBDStructureTree extends GenericTree<String, CBDStructureTree> {
013
014        private static final String ROOT_NODE = "root";
015        private static final String IN_NODE = "in";
016        private static final String OUT_NODE = "out";
017
018        public CBDStructureTree() {
019                super(ROOT_NODE);
020        }
021
022        public CBDStructureTree(String data) {
023                super(data);
024        }
025
026        public boolean isInNode() {
027                return data.equals(IN_NODE);
028        }
029
030        public boolean isOutNode() {
031                return data.equals(OUT_NODE);
032        }
033
034        public CBDStructureTree addInNode() {
035                CBDStructureTree child = new CBDStructureTree(IN_NODE);
036                addChild(child);
037                return child;
038        }
039
040        public CBDStructureTree addOutNode() {
041                CBDStructureTree child = new CBDStructureTree(OUT_NODE);
042                addChild(child);
043                return child;
044        }
045
046        public boolean hasOutChild() {
047                return children.stream().anyMatch(CBDStructureTree::isOutNode);
048        }
049
050        public boolean hasInChild() {
051                return children.stream().anyMatch(CBDStructureTree::isInNode);
052        }
053
054        public static CBDStructureTree fromTreeString(String treeString) {
055                treeString = treeString.replace(":", "");
056
057                int i = treeString.indexOf("[");
058                String token = treeString.substring(0, i);
059                CBDStructureTree tree = new CBDStructureTree(token);
060                parseString(treeString.substring(i + 1, treeString.length() - 1), tree);
061                return tree;
062        }
063
064        private static int parseString(String input, CBDStructureTree parent) {
065                StringBuilder currentString = new StringBuilder();
066                int index = 0;
067                CBDStructureTree child = null;
068                while(index < input.length()) {
069                        char c = input.charAt(index);
070
071                        if(c == ' ') { // ignore spaces
072                                index++;
073                                continue;
074                        }
075
076                        if(c == ',') { // end of menu entry, add to the list
077                                if(!currentString.toString().isEmpty()) {
078                                        child = new CBDStructureTree(currentString.toString());
079                                        if(parent != null)
080                                                parent.addChild(child);
081                                }
082                                currentString.delete(0, currentString.length());
083                                index++;
084                                continue;
085                        }
086
087                        if(c == ']') { // end of sublist, return
088                                return index + 1;
089                        }
090
091                        if(c == '[') { // start of sublist, recursive call
092                                if(!currentString.toString().isEmpty()) {
093                                        child = new CBDStructureTree(currentString.toString());
094                                        if(parent != null)
095                                                parent.addChild(child);
096                                }
097                                currentString.delete(0, currentString.length());
098
099                                int temp = parseString(input.substring(index + 1), child);
100                                index += temp;
101                                index++;
102                                continue;
103                        }
104
105                        currentString.append(c);
106                        index++;
107                }
108                return 0;
109        }
110
111        public static void main(String[] args) {
112                CBDStructureTree tree = new CBDStructureTree();
113                tree.addInNode().addInNode();
114                System.out.println(tree.toStringVerbose());
115                fromTreeString("root:[in:[in:[]],out:[in:[]]]");
116        }
117}