package org.basex.index.value; import static org.basex.core.Text.*; import org.basex.data.Data; import org.basex.index.IndexIterator; import org.basex.index.IndexStats; import org.basex.index.IndexToken; import org.basex.util.Array; import org.basex.util.TokenBuilder; /** * This class provides a main memory access to attribute values and * text contents. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class UpdatableMemValues extends MemValues { /** * Constructor. * @param d data instance */ public UpdatableMemValues(final Data d) { super(d); } @Override public void delete(final byte[] key, final int id) { final int i = id(key); if(i == 0 || len[i] == 0) return; // find the position where the id is stored int p = -1; while(++p < len[i]) if(ids[i][p] == id) break; // if not the last element, we need to shift forwards if(p < len[i] - 1) Array.move(ids[i], p + 1, -1, len[i] - (p + 1)); len[i]--; } @Override public IndexIterator iter(final IndexToken tok) { final int i = id(tok.get()); if(i > 0) { final int[] pres = data.pre(ids[i], 0, len[i]); if(pres.length > 0) { return new IndexIterator() { int p; @Override public boolean more() { return p < pres.length; } @Override public int next() { return pres[p++]; } @Override public double score() { return -1; } @Override public int size() { return pres.length; } }; } } return IndexIterator.EMPTY; } @Override public byte[] info() { final TokenBuilder tb = new TokenBuilder(); tb.add(LI_STRUCTURE + SORTED_LIST + NL); final IndexStats stats = new IndexStats(data); for(int m = 1; m < size; ++m) { final int oc = len[m]; if(stats.adding(oc)) stats.add(key(m)); } stats.print(tb); return tb.finish(); } }