Package org.h2.mvstore

# Class Page<K,V>

java.lang.Object
org.h2.mvstore.Page<K,V>

All Implemented Interfaces:
  `Cloneable`

public abstract class Page<K,V> extends Object implements Cloneable
A page (a node or a leaf).

For b-tree nodes, the key at a given index is larger than the largest key of the child at the same index.

Serialized format: length of a serialized page in bytes (including this field): int check value: short page number (0-based sequential number within a chunk): varInt map id: varInt number of keys: varInt type: byte (0: leaf, 1: node; +2: compressed) children of the non-leaf node (1 more than keys) compressed: bytes saved (varInt) keys values of the leaf node (one for each key)

## Nested Class Summary

Nested Classes
Modifier and Type
Class
Description
`static final class`
`Page.PageReference<K,V>`
A pointer to a page, either in-memory or using a page position.

## Field Summary

Fields
Modifier and Type
Field
Description
`final MVMap<K,V>`
`map`
Map this page belongs to
`int`
`pageNo`
Sequential 0-based number of the page within containing chunk.

## Method Summary

Modifier and Type
Method
Description
`protected int`
`calculateMemory()`
Calculate estimated memory used in persistent case.
`protected final Page<K,V>`
`clone()`
`final Page<K,V>`
`copy()`
Create a copy of this page.
`final K[]`
`createKeyStorage(int size)`
Create array for keys storage.
`static <K, V> Page<K,V>`
`createNode(MVMap<K,V> map, K[] keys, Page.PageReference<K,V>[] children, long totalCount, int memory)`
Create a new non-leaf page.
`static <K, V> Page.PageReference<K,V>[]`
`createRefStorage(int size)`
Create an array of page references.
`protected void`
`dump(StringBuilder buff)`
Dump debug data for this page.
`abstract CursorPos<K,V>`
`getAppendCursorPos(CursorPos<K,V> cursorPos)`
Extend path from a given CursorPos chain to "append point" in a B-tree, rooted at this Page.
`abstract Page<K,V>`
`getChildPage(int index)`
Get the child page at the given index.
`abstract long`
`getChildPagePos(int index)`
Get the position of the child.
`final long`
`getDiskSpaceUsed(boolean approximate)`
Amount of used disk space in persistent case including child pages.
`K`
`getKey(int index)`
Get the key at the given index.
`final int`
`getKeyCount()`
Get the number of keys in this page.
`final int`
`getMapId()`
Get the id of the page's owner map
`final int`
`getMemory()`
`abstract int`
`getNodeType()`
`final long`
`getPos()`
Get the position of the page
`abstract CursorPos<K,V>`
`getPrependCursorPos(CursorPos<K,V> cursorPos)`
Extend path from a given CursorPos chain to "prepend point" in a B-tree, rooted at this Page.
`abstract int`
`getRawChildPageCount()`
`abstract long`
`getTotalCount()`
Get the total number of key-value pairs, including child pages.
`abstract V`
`getValue(int index)`
Get the value at the given index.
`abstract void`
`insertLeaf(int index, K key, V value)`
Insert a key-value pair into this leaf.
`abstract void`
`insertNode(int index, K key, Page<K,V> childPage)`
Insert a child page into this node.
`boolean`
`isComplete()`
`final boolean`
`isLeaf()`
Check whether this is a leaf page.
`protected final boolean`
`isPersistent()`
`final boolean`
`isRemoved()`
`final boolean`
`isSaved()`
`protected abstract void`
`readPayLoad(ByteBuffer buff)`
Read the page payload from the buffer.
`void`
`remove(int index)`
Remove the key and value (or child) at the given index.
`abstract int`
`removeAllRecursive(long version)`
Remove all page data recursively.
`final int`
`removePage(long version)`
Make accounting changes (chunk occupancy or "unsaved" RAM), related to this page removal.
`abstract void`
`setChild(int index, Page<K,V> c)`
Replace the child page.
`void`
`setComplete()`
Called when done with copying page.
`final void`
`setKey(int index, K key)`
Replace the key at an index in this page.
`abstract V`
`setValue(int index, V value)`
Replace the value at an index in this page.
`String`
`toString()`
`protected final int`
`write(FileStore<?>.PageSerializationManager pageSerializationManager)`
Serializes this page into provided buffer, which represents content of the specified chunk to be persisted and updates the "position" of the page.
`protected abstract void`
`writeChildren(WriteBuffer buff, boolean withCounts)`
Write page children to the buff.
`protected abstract void`
`writeValues(WriteBuffer buff)`
Write values that the buffer contains to the buff.

### Methods inherited from class java.lang.Object

`equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

## Field Details

### map

public final MVMap<K,V> map
Map this page belongs to

### pageNo

public int pageNo
Sequential 0-based number of the page within containing chunk.

## Method Details

### createNode

public static <K, V> Page<K,V> createNode(MVMap<K,V> map, K[] keys, Page.PageReference<K,V>[] children, long totalCount, int memory)
Create a new non-leaf page. The arrays are not cloned.

Type Parameters:
  `K` - the key class
  `V` - the value class
Parameters:
  `map` - the map
  `keys` - the keys
  `children` - the child page positions
  `totalCount` - the total number of keys
  `memory` - the memory used in bytes
Returns:
  the page

### getMapId

public final int getMapId()
Get the id of the page's owner map

Returns:
  id

### getKey

public K getKey(int index)
Get the key at the given index.

Parameters:
  `index` - the index
Returns:
  the key

### getChildPage

public abstract Page<K,V> getChildPage(int index)
Get the child page at the given index.

Parameters:
  `index` - the index
Returns:
  the child page

### getChildPagePos

public abstract long getChildPagePos(int index)
Get the position of the child.

Parameters:
  `index` - the index
Returns:
  the position

### getValue

public abstract V getValue(int index)
Get the value at the given index.

Parameters:
  `index` - the index
Returns:
  the value

### getKeyCount

public final int getKeyCount()
Get the number of keys in this page.

Returns:
  the number of keys

### isLeaf

public final boolean isLeaf()
Check whether this is a leaf page.

Returns:
  true if it is a leaf

### getNodeType

public abstract int getNodeType()

### getPos

public final long getPos()
Get the position of the page

Returns:
  the position

### toString

public String toString()

Overrides:
  `toString` in class `Object`

### dump

protected void dump(StringBuilder buff)
Dump debug data for this page.

Parameters:
  `buff` - append buffer

### copy

public final Page<K,V> copy()
Create a copy of this page.

Returns:
  a mutable copy of this page

### clone

protected final Page<K,V> clone()

Overrides:
  `clone` in class `Object`

### getTotalCount

public abstract long getTotalCount()
Get the total number of key-value pairs, including child pages.

Returns:
  the number of key-value pairs

### setChild

public abstract void setChild(int index, Page<K,V> c)
Replace the child page.

Parameters:
  `index` - the index
  `c` - the new child page

### setKey

public final void setKey(int index, K key)
Replace the key at an index in this page.

Parameters:
  `index` - the index
  `key` - the new key

### setValue

public abstract V setValue(int index, V value)
Replace the value at an index in this page.

Parameters:
  `index` - the index
  `value` - the new value
Returns:
  the old value

### insertLeaf

public abstract void insertLeaf(int index, K key, V value)
Insert a key-value pair into this leaf.

Parameters:
  `index` - the index
  `key` - the key
  `value` - the value

### insertNode

public abstract void insertNode(int index, K key, Page<K,V> childPage)
Insert a child page into this node.

Parameters:
  `index` - the index
  `key` - the key
  `childPage` - the child page

### remove

public void remove(int index)
Remove the key and value (or child) at the given index.

Parameters:
  `index` - the index

### readPayLoad

protected abstract void readPayLoad(ByteBuffer buff)
Read the page payload from the buffer.

Parameters:
  `buff` - the buffer

### isSaved

public final boolean isSaved()

### isRemoved

public final boolean isRemoved()

### write

protected final int write(FileStore<?>.PageSerializationManager pageSerializationManager)
Serializes this page into provided buffer, which represents content of the specified chunk to be persisted and updates the "position" of the page.

Parameters:
  `pageSerializationManager` - which provides a target buffer and can be queried for various attributes related to serialization
Returns:
  the position of the buffer, where serialized child page references (if any) begin

### writeValues

protected abstract void writeValues(WriteBuffer buff)
Write values that the buffer contains to the buff.

Parameters:
  `buff` - the target buffer

### writeChildren

protected abstract void writeChildren(WriteBuffer buff, boolean withCounts)
Write page children to the buff.

Parameters:
  `buff` - the target buffer
  `withCounts` - true if the descendant counts should be written

### getRawChildPageCount

public abstract int getRawChildPageCount()

### isPersistent

protected final boolean isPersistent()

### getMemory

public final int getMemory()

### getDiskSpaceUsed

public final long getDiskSpaceUsed(boolean approximate)
Amount of used disk space in persistent case including child pages.

Parameters:
  `approximate` - `true` to return quick approximation
Returns:
  amount of used disk space in persistent case

### calculateMemory

protected int calculateMemory()
Calculate estimated memory used in persistent case.

Returns:
  memory in bytes

### isComplete

public boolean isComplete()

### setComplete

public void setComplete()
Called when done with copying page.

### removePage

public final int removePage(long version)
Make accounting changes (chunk occupancy or "unsaved" RAM), related to this page removal.

Parameters:
  `version` - at which page was removed
Returns:
  amount (negative), by which "unsaved memory" should be adjusted, if page is unsaved one, and 0 for page that was already saved, or in case of non-persistent map

### getPrependCursorPos

public abstract CursorPos<K,V> getPrependCursorPos(CursorPos<K,V> cursorPos)
Extend path from a given CursorPos chain to "prepend point" in a B-tree, rooted at this Page.

Parameters:
  `cursorPos` - presumably pointing to this Page (null if real root), to build upon
Returns:
  new head of the CursorPos chain

### getAppendCursorPos

public abstract CursorPos<K,V> getAppendCursorPos(CursorPos<K,V> cursorPos)
Extend path from a given CursorPos chain to "append point" in a B-tree, rooted at this Page.

Parameters:
  `cursorPos` - presumably pointing to this Page (null if real root), to build upon
Returns:
  new head of the CursorPos chain

### removeAllRecursive

public abstract int removeAllRecursive(long version)
Remove all page data recursively.

Parameters:
  `version` - at which page got removed
Returns:
  adjustment for "unsaved memory" amount

### createKeyStorage

public final K[] createKeyStorage(int size)
Create array for keys storage.

Parameters:
  `size` - number of entries
Returns:
  values array

### createRefStorage

public static <K, V> Page.PageReference<K,V>[] createRefStorage(int size)
Create an array of page references.

Type Parameters:
  `K` - the key class
  `V` - the value class
Parameters:
  `size` - the number of entries
Returns:
  the array