?? objectblockiterator.java
字號:
package cn.js.fan.base;import org.apache.log4j.Logger;import java.util.Iterator;import cn.js.fan.db.PrimaryKey;import cn.js.fan.db.KeyUnit;import java.util.HashMap;public class ObjectBlockIterator implements Iterator { public Logger logger = Logger.getLogger(this.getClass().getName()); ObjectDb objectDb; private Object[] infoBlock; private int blockID; private int blockStart; private String query; private int startIndex; private int currentIndex; private int endIndex; private Object previousElement = null; private Object nextElement = null; public ObjectBlockIterator(ObjectDb objectDb, Object[] block, String query, int startIndex, int endIndex) { this.objectDb = objectDb; this.infoBlock = block; this.blockID = startIndex / objectDb.getBlockSize(); this.blockStart = blockID * objectDb.getBlockSize(); this.query = query; this.currentIndex = startIndex - 1; this.startIndex = startIndex; this.endIndex = endIndex; } public void remove() {} public boolean hasNext() { if (currentIndex == endIndex) { return false; } if (nextElement == null) { nextElement = getNextElement(); if (nextElement == null) { return false; } } return true; } public boolean hasPrevious() { if (currentIndex == startIndex) { return false; } if (previousElement == null) { previousElement = getPreviousElement(); if (previousElement == null) { return false; } } return true; } public Object next() throws java.util.NoSuchElementException { Object element = null; if (nextElement != null) { element = nextElement; this.nextElement = null; } else { element = getNextElement(); if (element == null) { throw new java.util.NoSuchElementException(); } } return element; } public Object previous() { Object element = null; if (previousElement != null) { element = previousElement; previousElement = null; } else { element = getPreviousElement(); if (element == null) { throw new java.util.NoSuchElementException(); } } return element; } private Object getNextElement() { previousElement = null; Object element = null; if (endIndex!=Integer.MAX_VALUE) { while (currentIndex + 1 < endIndex && element == null) { currentIndex++; element = getElement(currentIndex); } } else { if (currentIndex + 1 < endIndex) { currentIndex++; element = getElement(currentIndex); } } return element; } private Object getPreviousElement() { nextElement = null; Object element = null; while (currentIndex >= startIndex && element == null) { currentIndex--; element = getElement(currentIndex); } return element; } private Object getElement(int index) { if (index < 0) { return null; } if (index < blockStart || index >= blockStart + objectDb.getBlockSize()) { this.infoBlock = objectDb.getObjectBlock(query, index); this.blockID = index / objectDb.getBlockSize(); this.blockStart = blockID * objectDb.getBlockSize(); } Object element = null; int relativeIndex = index % objectDb.getBlockSize(); if (relativeIndex < infoBlock.length) { element = objectDb.getObjectDb(infoBlock[relativeIndex]); } return element; } public void setIndex(ObjectDb obj) { nextElement = null; previousElement = null; Object[] currentBlock; for (int i = startIndex; i < endIndex; i++) { currentBlock = obj.getObjectBlock(query, i); if (currentBlock.length == 0) { } int blockID = i / obj.getBlockSize(); int blockEnd = blockID * obj.getBlockSize() + obj.getBlockSize(); if (startIndex < blockEnd) { for (int j = startIndex % obj.getBlockSize(); j < currentBlock.length; j++, i++) { if (comparePrimarKey(obj.getPrimaryKey(), currentBlock[j])) { this.currentIndex = i; return; } } } else { for (int j = 0; j < currentBlock.length; j++, i++) { if (comparePrimarKey(obj.getPrimaryKey(), currentBlock[j])) { this.currentIndex = i; return; } } } } } public boolean comparePrimarKey(PrimaryKey primaryKey, Object objKey) { if (primaryKey.getKeyCount() == 1) { if (primaryKey.getType() == primaryKey.TYPE_LONG) return primaryKey.getLongValue()==((Long)objKey).longValue(); else if (primaryKey.getType() == primaryKey.TYPE_INT) return primaryKey.getIntValue()==((Integer)objKey).intValue(); else if (primaryKey.getType() == primaryKey.TYPE_STRING) return primaryKey.getStrValue().equals(((String)objKey)); } else if (primaryKey.getType() == primaryKey.TYPE_COMPOUND) { HashMap keys = primaryKey.getKeys(); Iterator ir = keys.keySet().iterator(); HashMap ks = (HashMap)objKey; while (ir.hasNext()) { String keyName = (String) ir.next(); KeyUnit ku = (KeyUnit) keys.get(keyName); KeyUnit ku2 = (KeyUnit)ks.get(keyName); if (ku2==null) throw new IllegalArgumentException("The key " + keyName + " is not exists in Primary"); return ku.getValue().equals(ku2.getValue()); } } return false; }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -