1 package org.simantics.db.impl.query;
\r
3 import java.util.ArrayList;
\r
4 import java.util.Collection;
\r
6 public class CacheCollectionResult {
\r
7 public static final int LEVELS = 10;
\r
8 private int level = 0;
\r
9 private int position = -1;
\r
10 private int currentLength = 0;
\r
11 private int size = 0;
\r
12 private ArrayList<CacheEntryBase> currentLevel;
\r
13 public ArrayList<CacheEntryBase> levels[] = new ArrayList[LEVELS];
\r
14 public CacheCollectionResult() {
\r
15 for(int i=0;i<LEVELS;i++) {
\r
16 levels[i] = new ArrayList<CacheEntryBase>();
\r
19 public void add(CacheEntryBase entry) {
\r
20 short level = entry.getLevel();
\r
21 if(level < (LEVELS-1)) levels[level].add(entry);
\r
22 else levels[(LEVELS-1)].add(entry);
\r
25 public Collection<CacheEntryBase> toCollection() {
\r
26 ArrayList<CacheEntryBase> result = new ArrayList<CacheEntryBase>(size());
\r
27 for(int i=0;i<LEVELS;i++)
\r
28 result.addAll(levels[i]);
\r
34 public boolean isAtStart() {
\r
35 return level == 0 && position == -1;
\r
37 public void restart() {
\r
40 currentLevel = levels[0];
\r
41 currentLength = currentLevel.size();
\r
43 public CacheEntryBase next(int maxLevel) {
\r
44 //System.err.println("next " + position + " " + level);
\r
46 if(position >= currentLength) {
\r
47 if(level == (LEVELS-1)) return null;
\r
48 if(level == maxLevel) return null;
\r
51 currentLevel = levels[level];
\r
52 currentLength = currentLevel.size();
\r
53 return next(maxLevel);
\r
55 return currentLevel.get(position);
\r
57 public void remove() {
\r
58 int lastPosition = currentLevel.size()-1;
\r
59 CacheEntryBase last = currentLevel.remove(lastPosition);
\r
60 if(lastPosition > position) {
\r
61 currentLevel.set(position, last);
\r
67 public void setLevel(CacheEntryBase current, int level) {
\r
68 if(level == current.level) return;
\r
69 current.level = (short)level;
\r