|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||
java.lang.Objectorg.mapdb.Bind
public final class Bind
Binding is simple yet powerful way to keep secondary collection synchronized with primary collection. Primary collection provides notification on updates and secondary collection is modified accordingly. This way MapDB provides secondary indexes, values and keys. It also supports less usual scenarios such as histograms, inverse lookup index (on maps), group counters and so on. There are two things to keep on mind when using binding: * Binding is not persistent, so it needs to be restored every time store is reopened. If you modify primary collection before binding is restored, secondary collection does not get updated and becomes inconsistent. * If secondary collection is empty, binding will recreate its content based on primary collection. If there is even single item on secondary collection, binding assumes it is consistent and leaves it as its. Any thread-safe collection can be used as secondary (not just collections provided by MapDB). This gives great flexibility for modeling and scaling your data. For example primary data can be stored in durable DB with transactions and large secondary indexes may be stored in other faster non-durable DB. Or primary collection may be stored on disk and smaller secondary index (such as category counters) can be stored in memory for faster lookups. Also you may use ordinary `java.util.*` collections (if they are thread safe) to get additional speed. There are many [code examples](https://github.com/jankotek/MapDB/tree/master/src/test/java/examples) how Collection Binding can be used. NOTE: Binding just installs Modification Listener on primary collection. Binding itself is not persistent and has to be restored after primary collection is loaded. Data contained in secondary collection are persistent.
| Nested Class Summary | |
|---|---|
static interface |
Bind.MapListener<K,V>
Listener called when `Map` is modified. |
static interface |
Bind.MapWithModificationListener<K,V>
Primary Maps must provide notifications when it is modified. |
| Method Summary | ||
|---|---|---|
static
|
histogram(Bind.MapWithModificationListener<K,V> primary,
ConcurrentMap<C,Long> histogram,
Fun.Function2<C,K,V> entryToCategory)
Binds Secondary Map so it it creates [histogram](http://en.wikipedia.org/wiki/Histogram) from data in Primary Map. |
|
static
|
mapInverse(Bind.MapWithModificationListener<K,V> primary,
Map<V,K> inverse)
Binds Secondary Set so it contains inverse mapping to Primary Map: Primary Value will become Secondary Key. |
|
static
|
mapInverse(Bind.MapWithModificationListener<K,V> primary,
Set<Fun.Tuple2<V,K>> inverse)
Binds Secondary Set so it contains inverse mapping to Primary Map: Primary Value will become Secondary Key. |
|
static
|
secondaryKey(Bind.MapWithModificationListener<K,V> map,
Map<K2,K> secondary,
Fun.Function2<K2,K,V> fun)
Binds Secondary Set so it contains Secondary Key (Index). |
|
static
|
secondaryKey(Bind.MapWithModificationListener<K,V> map,
Set<Fun.Tuple2<K2,K>> secondary,
Fun.Function2<K2,K,V> fun)
Binds Secondary Set so it contains Secondary Key (Index). |
|
static
|
secondaryKeys(Bind.MapWithModificationListener<K,V> map,
Set<Fun.Tuple2<K2,K>> secondary,
Fun.Function2<K2[],K,V> fun)
Binds Secondary Set so it contains Secondary Key (Index). |
|
static
|
secondaryValue(Bind.MapWithModificationListener<K,V> map,
Map<K,V2> secondary,
Fun.Function2<V2,K,V> fun)
Binds Secondary Map so that it contains Key from Primary Map and custom Value. |
|
static
|
secondaryValues(Bind.MapWithModificationListener<K,V> map,
Set<Fun.Tuple2<K,V2>> secondary,
Fun.Function2<V2[],K,V> fun)
Binds Secondary Map so that it contains Key from Primary Map and custom Value. |
|
static
|
size(Bind.MapWithModificationListener<K,V> map,
Atomic.Long sizeCounter)
Binds Atomic.Long to Primary Map so the Atomic.Long contains size of Map. |
|
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Method Detail |
|---|
public static <K,V> void size(Bind.MapWithModificationListener<K,V> map,
Atomic.Long sizeCounter)
Atomic.Long to Primary Map so the Atomic.Long contains size of Map.
`Atomic.Long` is incremented on each insert and decremented on each entry removal.
MapDB collections usually do not keep their size, but require complete traversal to count items.
If `Atomic.Long` has zero value, it will be updated with value from `map.size()` and than
bind to map.
NOTE: Binding just installs Modification Listener on primary collection. Binding itself is not persistent
and has to be restored after primary collection is loaded. Data contained in secondary collection are persistent.
NOTE: BTreeMap and HTreeMap already supports this directly as optional parameter named `counter`.
In that case all calls to `Map.size()` are forwarded to underlying counter. Check parameters at
DB.createHashMap(String) and
DB.createTreeMap(String)
map - primary map whose size needs to be trackedsizeCounter - number updated when Map Entry is added or removed.
public static <K,V,V2> void secondaryValue(Bind.MapWithModificationListener<K,V> map,
Map<K,V2> secondary,
Fun.Function2<V2,K,V> fun)
map - Primary Mapsecondary - Secondary Map with customfun - function which calculates secondary value from primary key and value
public static <K,V,V2> void secondaryValues(Bind.MapWithModificationListener<K,V> map,
Set<Fun.Tuple2<K,V2>> secondary,
Fun.Function2<V2[],K,V> fun)
map - Primary Mapsecondary - Secondary Map with customfun - function which calculates secondary values from primary key and value
public static <K,V,K2> void secondaryKey(Bind.MapWithModificationListener<K,V> map,
Set<Fun.Tuple2<K2,K>> secondary,
Fun.Function2<K2,K,V> fun)
Fun.filter(java.util.NavigableSet, Object)
If Secondary Set is empty its content will be recreated from Primary Map.
This binding is not persistent. You need to restore it every time store is reopened.
NOTE: Binding just installs Modification Listener on primary collection. Binding itself is not persistent
and has to be restored after primary collection is loaded. Data contained in secondary collection are persistent.
Type params:
* `
map - primary mapsecondary - secondary setfun - function which calculates Secondary Key from Primary Key and Value
public static <K,V,K2> void secondaryKey(Bind.MapWithModificationListener<K,V> map,
Map<K2,K> secondary,
Fun.Function2<K2,K,V> fun)
map - primary mapsecondary - secondary setfun - function which calculates Secondary Key from Primary Key and Value
public static <K,V,K2> void secondaryKeys(Bind.MapWithModificationListener<K,V> map,
Set<Fun.Tuple2<K2,K>> secondary,
Fun.Function2<K2[],K,V> fun)
Fun.filter(java.util.NavigableSet, Object)}
If Secondary Set is empty its content will be recreated from Primary Map.
NOTE: Binding just installs Modification Listener on primary collection. Binding itself is not persistent
and has to be restored after primary collection is loaded. Data contained in secondary collection are persistent.
Type params:
* `
map - primary mapsecondary - secondary setfun - function which calculates Secondary Keys from Primary Key and Value
public static <K,V> void mapInverse(Bind.MapWithModificationListener<K,V> primary,
Set<Fun.Tuple2<V,K>> inverse)
Fun.filter(java.util.NavigableSet, Object)
If Secondary Set is empty its content will be recreated from Primary Map.
NOTE: Binding just installs Modification Listener on primary collection. Binding itself is not persistent
and has to be restored after primary collection is loaded. Data contained in secondary collection are persistent.
Type params:
* `
primary - Primary Map for which inverse mapping will be createdinverse - Secondary Set which will contain inverse mapping
public static <K,V> void mapInverse(Bind.MapWithModificationListener<K,V> primary,
Map<V,K> inverse)
primary - Primary Map for which inverse mapping will be createdinverse - Secondary Set which will contain inverse mapping
public static <K,V,C> void histogram(Bind.MapWithModificationListener<K,V> primary,
ConcurrentMap<C,Long> histogram,
Fun.Function2<C,K,V> entryToCategory)
primary - Primary Map to create histogram forhistogram - Secondary Map to create histogram for, key is Category, value is number of items in categoryentryToCategory - returns Category in which entry from Primary Map belongs to.
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||