@Override
		public boolean hasPrevious() throws IOException {
			synchronized (db) {
				if (modCount != expectedModCount) {
					reset();
				}
				if (!hasPrev) {

					if (bufferId < 0) {
						return false;
					}

					// Check previous key index
					int prevIndex = keyIndex - 1;

					// Process previous leaf if needed
					if (prevIndex < 0) {
						try {
							FieldKeyRecordNode leaf =
								((FieldKeyRecordNode) getFieldKeyNode(bufferId)).getPreviousLeaf();
							if (leaf == null) {
								return false;
							}
							prevIndex = leaf.getKeyCount() - 1;
							if (minKey != null &&
								leaf.getKeyField(prevIndex).compareTo(minKey) < 0) {
								return false;
							}
							getKeys(leaf);
							key = keys[prevIndex];
							keyIndex = prevIndex;
							hasNext = false;
							hasPrev = true;
						}
						finally {
							nodeMgr.releaseNodes();
						}
					}

					// else, use keys cache
					else {
						hasPrev = minKey == null || keys[prevIndex].compareTo(minKey) >= 0;
						if (hasPrev) {
							key = keys[prevIndex];
							keyIndex = prevIndex;
							hasNext = false;
						}
					}
				}
				return hasPrev;
			}
		}
Reset iterator (require DBHandle lock)
@throws IOException if IO error occurs
Ghidra/Framework/DB/src/main/java/db/Table.java