package org.basex.index.path; import org.basex.data.Data; import org.basex.index.Index; import org.basex.index.IndexBuilder; import org.basex.util.list.IntList; /** * This interface defines the functions which are needed for building * new index structures. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class PathBuilder extends IndexBuilder { /** * Constructor. * @param d data reference */ public PathBuilder(final Data d) { super(d); } @Override public Index build() { abort(); final IntList pars = new IntList(); final PathSummary path = new PathSummary(data); for(pre = 0; pre < size; ++pre) { final byte kind = (byte) data.kind(pre); final int par = data.parent(pre, kind); while(!pars.empty() && pars.peek() > par) pars.pop(); if(kind == Data.DOC) { path.index(0, kind, pars.size()); pars.push(pre); } else if(kind == Data.ELEM) { path.index(data.name(pre), kind, pars.size()); pars.push(pre); } else if(kind == Data.ATTR) { path.index(data.name(pre), kind, pars.size(), data.text(pre, false), data.meta); } else { path.index(0, kind, pars.size(), data.text(pre, true), data.meta); } } data.meta.pathindex = true; return path; } @Override public void abort() { data.meta.pathindex = false; } }