package org.mapdb.serializer; import org.mapdb.DataInput2; import org.mapdb.DataOutput2; import org.mapdb.Serializer; import java.io.IOException; import java.util.Comparator; /** * Extension of {@link Serializer} to serialize group of objects together. * <p/> * This is mostly used in BTreeMap where BTree node stores multiple values in single array. * Some data types can be optimized when stored together. For example multiple {@code java.util.Date}s can be * represented by primitive {@code long[]} with much improved memory usage. * GroupSerializer is than used to access Nth item from {@code long[]} and convert it from/to object. * <p/> * GroupSerializer might also compress serialized data. * For example sorted data can be efficiently compressed with delta compression. */ public interface GroupSerializer<A> extends Serializer<A> { default A valueArrayBinaryGet(DataInput2 input, int keysLen, int pos) throws IOException { Object keys = valueArrayDeserialize(input, keysLen); return valueArrayGet(keys, pos); // A a=null; // while(pos-- >= 0){ // a = deserialize(input, -1); // } // return a; } default int valueArrayBinarySearch(A key, DataInput2 input, int keysLen, Comparator comparator) throws IOException { Object keys = valueArrayDeserialize(input, keysLen); return valueArraySearch(keys, key, comparator); // for(int pos=0; pos<keysLen; pos++){ // A from = deserialize(input, -1); // int comp = compare(key, from); // if(comp==0) // return pos; // if(comp<0) // return -(pos+1); // } // return -(keysLen+1); } int valueArraySearch(Object keys, A key); int valueArraySearch(Object keys, A key, Comparator comparator); void valueArraySerialize(DataOutput2 out, Object vals) throws IOException; Object valueArrayDeserialize(DataInput2 in, int size) throws IOException; A valueArrayGet(Object vals, int pos); int valueArraySize(Object vals); Object valueArrayEmpty(); Object valueArrayPut(Object vals, int pos, A newValue); Object valueArrayUpdateVal(Object vals, int pos, A newValue); Object valueArrayFromArray(Object[] objects); Object valueArrayCopyOfRange(Object vals, int from, int to); Object valueArrayDeleteValue(Object vals, int pos); default Object[] valueArrayToArray(Object vals){ Object[] ret = new Object[valueArraySize(vals)]; for(int i=0;i<ret.length;i++){ ret[i] = valueArrayGet(vals,i); } return ret; } /** returns value+1, or null if there is no bigger value. */ default A nextValue(A value){ throw new UnsupportedOperationException("Next Value not supported"); } }