public Node splitEdge(Suffix suffix) { remove(); Edge newEdge = new Edge(beginIndex, beginIndex + suffix.getSpan(), suffix.getOriginNode()); newEdge.insert(); newEdge.endNode.setSuffixNode(suffix.getOriginNode()); beginIndex += suffix.getSpan() + 1; startNode = newEdge.getEndNode(); insert(); return newEdge.getEndNode(); }
public static SuffixTree create(Text text) { SuffixTree tree = new SuffixTree(text); Suffix active = new Suffix(tree.root, 0, -1); for (int i = 0; i < text.length(); i++) { tree.addPrefix(active, i); } return tree; }
public void canonize() { if (isImplicit()) { Edge edge = originNode.findEdge(originNode.symbolAt(beginIndex)); int edgeSpan = edge.getSpan(); while (edgeSpan <= getSpan()) { beginIndex += edgeSpan + 1; originNode = edge.getEndNode(); if (beginIndex <= endIndex) { edge = edge.getEndNode().findEdge(originNode.symbolAt(beginIndex)); edgeSpan = edge.getSpan(); } } } }
private void report(Node node) { reporter.startOfGroup(node.endSize - node.startSize, node.depth); for (int i = node.startSize; i < node.endSize; i++) { int start = tree.text.length() - list.get(i); int end = start + node.depth; reporter.part(start, end); } reporter.endOfGroup(); }
public static List<CloneGroup> detect(CloneIndex cloneIndex, Collection<Block> fileBlocks) { if (fileBlocks.isEmpty()) { return Collections.emptyList(); } TextSet text = createTextSet(cloneIndex, fileBlocks); if (text == null) { return Collections.emptyList(); } DuplicationsCollector reporter = new DuplicationsCollector(text); Search.perform(text, reporter); return reporter.getResult(); }
private static List<CloneGroup> detect(CloneIndex index, Collection<Block> blocks) { return SuffixTreeCloneDetectionAlgorithm.detect(index, blocks); }
/** * Each inner-node represents prefix of some suffixes, thus substring of text. */ private void visitInnerNodes() { for (Node node : innerNodes) { if (containsOrigin(node)) { report(node); } } }
public void insert() { startNode.addEdge(beginIndex, this); }
public Object symbolAt(int index) { return suffixTree.symbolAt(index); }
public Edge(int beginIndex, int endIndex, Node startNode) { this.beginIndex = beginIndex; this.endIndex = endIndex; this.startNode = startNode; this.endNode = new Node(startNode, null); }
public TextSet build() { return new TextSet(symbols, lengthOfOrigin); }
public boolean isImplicit() { return !isExplicit(); }
public void changeOriginNode() { originNode = originNode.getSuffixNode(); }
public static Builder builder() { return new Builder(); }
public int indexOf(String str) { return indexOf(suffixTree, new StringText(str)); }
public boolean contains(String str) { return contains(suffixTree, new StringText(str)); }
public static boolean contains(SuffixTree tree, Text str) { return indexOf(tree, str) >= 0; }
public static StringSuffixTree create(String text) { return new StringSuffixTree(text); }
private SuffixTree(Text text) { this.text = text; root = new Node(this, null); }