#21
authorVyacheslav Tyutyunkov <tyutyunkov@gmail.com>
Thu, 21 Mar 2013 05:16:31 +0000 (12:16 +0700)
committerVyacheslav Tyutyunkov <tyutyunkov@gmail.com>
Thu, 21 Mar 2013 05:16:31 +0000 (12:16 +0700)
jejdb/src/cpp/jejdb.c
jejdb/src/cpp/jejdb.h
jejdb/src/cpp/org_ejdb_driver_EJDB.h [changed mode: 0644->0755]
jejdb/src/cpp/org_ejdb_driver_EJDBCollection.h
jejdb/src/cpp/org_ejdb_driver_EJDBCollection_Index.h [new file with mode: 0644]
jejdb/src/cpp/org_ejdb_driver_EJDBCollection_IndexType.h [new file with mode: 0644]
jejdb/src/java/org/ejdb/Test2.java
jejdb/src/java/org/ejdb/driver/EJDB.java
jejdb/src/java/org/ejdb/driver/EJDBCollection.java

index 1c37715..d420685 100755 (executable)
@@ -19,9 +19,6 @@ static void set_ejdb_to_object(JNIEnv *env, jobject obj, EJDB *db) {
        jclass clazz = (*env)->GetObjectClass(env, obj);
        jfieldID dbpID = (*env)->GetFieldID(env, clazz, "dbPointer", "J");
        (*env)->SetLongField(env, obj, dbpID, (jlong)db);
-
-       jfieldID pathID = (*env)->GetFieldID(env, clazz, "path", "Ljava/lang/String;");
-       (*env)->SetObjectField(env, obj, pathID, db ? (*env)->NewStringUTF(env, db->metadb->hdb->path) : NULL);
 };
 
 static EJDB *get_ejdb_from_object(JNIEnv *env, jobject obj) {
@@ -80,7 +77,7 @@ static void fill_ejdb_collopts(JNIEnv *env, jobject obj, EJCOLLOPTS *ejcopts) {
        jclass clazz = (*env)->GetObjectClass(env, obj);
 
        jfieldID recordsFID = (*env)->GetFieldID(env, clazz, "records", "J");
-       jfieldID cachedrecordsFID = (*env)->GetFieldID(env, clazz, "cachedrecords", "I");
+       jfieldID cachedrecordsFID = (*env)->GetFieldID(env, clazz, "cachedRecords", "I");
        jfieldID largeFID = (*env)->GetFieldID(env, clazz, "large", "Z");
        jfieldID compressedFID = (*env)->GetFieldID(env, clazz, "compressed", "Z");
 
@@ -143,6 +140,89 @@ static void set_rs_to_object(JNIEnv *env, jobject obj, TCLIST *rs) {
        (*env)->SetLongField(env, obj, rspID, (jlong)rs);
 };
 
+static void update_coll_meta(JNIEnv *env, jobject obj, EJCOLL *coll) {
+       jclass clazz = (*env)->GetObjectClass(env, obj);
+       jfieldID existsID = (*env)->GetFieldID(env, clazz, "exists", "Z");
+       (*env)->SetBooleanField(env, obj, existsID, coll ? JNI_TRUE : JNI_FALSE);
+
+       jclass optionsClazz = (*env)->FindClass(env, "org/ejdb/driver/EJDBCollection$Options");
+       jfieldID optionsID = (*env)->GetFieldID(env, clazz, "options", "Lorg/ejdb/driver/EJDBCollection$Options;");
+       jobject jopts = (*env)->GetObjectField(env, obj, optionsID);
+       
+       if (!jopts) {
+               jmethodID initOptions = (*env)->GetMethodID(env, optionsClazz, "<init>", "()V");
+               jopts = (*env)->NewObject(env, optionsClazz, initOptions);
+               (*env)->SetObjectField(env, obj, optionsID, jopts);
+       }
+
+       jfieldID bucketsID = (*env)->GetFieldID(env, optionsClazz, "buckets", "J");
+       jfieldID cachedID = (*env)->GetFieldID(env, optionsClazz, "cachedRecords", "I");
+       jfieldID largeID = (*env)->GetFieldID(env, optionsClazz, "large", "Z");
+       jfieldID compressedID = (*env)->GetFieldID(env, optionsClazz, "compressed", "Z");
+
+       (*env)->SetLongField(env, jopts, bucketsID, coll->tdb->hdb->bnum);
+    (*env)->SetIntField(env, jopts, cachedID, coll->tdb->hdb->rcnum);
+       (*env)->SetBooleanField(env, jopts, largeID, coll->tdb->opts & TDBTLARGE ? JNI_TRUE : JNI_FALSE);
+       (*env)->SetBooleanField(env, jopts, compressedID, coll->tdb->opts & TDBTDEFLATE ? JNI_TRUE : JNI_FALSE);
+
+       // TODO: indexes
+       jclass indexClazz = (*env)->FindClass(env, "org/ejdb/driver/EJDBCollection$Index");
+       jclass indexTypeClazz = (*env)->FindClass(env, "org/ejdb/driver/EJDBCollection$IndexType");
+       jmethodID initIndex = (*env)->GetMethodID(env, indexClazz, "<init>", "()V");
+       jfieldID indexesID = (*env)->GetFieldID(env, clazz, "indexes", "Ljava/util/Collection;");
+
+       jclass arrayListClazz = (*env)->FindClass(env, "Ljava/util/ArrayList;");
+       jmethodID initArrayList = (*env)->GetMethodID(env, arrayListClazz, "<init>", "(I)V");
+       jmethodID addToList = (*env)->GetMethodID(env, arrayListClazz, "add", "(Ljava/lang/Object;)Z");
+
+       jfieldID fieldID = (*env)->GetFieldID(env, indexClazz, "field", "Ljava/lang/String;");
+       jfieldID nameID = (*env)->GetFieldID(env, indexClazz, "name", "Ljava/lang/String;");
+       jfieldID fileID = (*env)->GetFieldID(env, indexClazz, "file", "Ljava/lang/String;");
+       jfieldID typeID = (*env)->GetFieldID(env, indexClazz, "type", "Lorg/ejdb/driver/EJDBCollection$IndexType;");
+       jfieldID recordsID = (*env)->GetFieldID(env, indexClazz, "records", "I");
+
+       jobject indexes = (*env)->NewObject(env, arrayListClazz, initArrayList, coll->tdb->inum);
+
+       for (int j = 0; j < coll->tdb->inum; ++j) {
+               TDBIDX *idx = (coll->tdb->idxs + j);
+               assert(idx);
+               if (idx->type != TDBITLEXICAL && idx->type != TDBITDECIMAL && idx->type != TDBITTOKEN) {
+                       continue;
+               }
+
+               jobject index = (*env)->NewObject(env, indexClazz, initIndex);
+
+               (*env)->SetObjectField(env, index, fieldID, (*env)->NewStringUTF(env, idx->name+1));
+               (*env)->SetObjectField(env, index, nameID, (*env)->NewStringUTF(env, idx->name));
+
+               jfieldID indexTypeID = NULL;
+               switch (idx->type) {
+                       case TDBITLEXICAL:
+                               indexTypeID = (*env)->GetStaticFieldID(env, indexTypeClazz, "Lexical", "Lorg/ejdb/driver/EJDBCollection$IndexType;");
+                               break;
+                       case TDBITDECIMAL:
+                               indexTypeID = (*env)->GetStaticFieldID(env, indexTypeClazz, "Numeric", "Lorg/ejdb/driver/EJDBCollection$IndexType;");
+                               break;
+                       case TDBITTOKEN:
+                               indexTypeID = (*env)->GetStaticFieldID(env, indexTypeClazz, "Token", "Lorg/ejdb/driver/EJDBCollection$IndexType;");
+                               break;
+               }
+               if (indexTypeID) {
+                       (*env)->SetObjectField(env, index, typeID, (*env)->GetStaticObjectField(env, indexTypeClazz, indexTypeID));
+               }
+
+               TCBDB *idb = (TCBDB*) idx->db;
+               if (idb) {
+                       (*env)->SetIntField(env, index, recordsID, idb->rnum);
+                       (*env)->SetObjectField(env, index, fileID, (*env)->NewStringUTF(env, idb->hdb->path));
+               }
+
+               (*env)->CallBooleanMethod(env, indexes, addToList, index);
+       }
+
+       (*env)->SetObjectField(env, obj, indexesID, indexes);
+};
+
 /*
 * Class:     org_ejdb_driver_EJDB
 * Method:    open
@@ -173,6 +253,7 @@ JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDB_open (JNIEnv *env, jobject obj,
        }
 
        set_ejdb_to_object(env, obj, db);
+       Java_org_ejdb_driver_EJDB_updateMeta(env, obj);
        return;
 };
 
@@ -203,6 +284,7 @@ JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDB_close (JNIEnv *env, jobject obj
        }
 
        set_ejdb_to_object(env, obj, NULL);
+       Java_org_ejdb_driver_EJDB_updateMeta(env, obj);
 };
 
 /*
@@ -223,6 +305,60 @@ JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDB_sync (JNIEnv *env, jobject obj)
 };
 
 /*
+ * Class:     org_ejdb_driver_EJDB
+ * Method:    updateMeta
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDB_updateMeta (JNIEnv *env, jobject obj) {
+       jclass clazz = (*env)->GetObjectClass(env, obj);
+       EJDB *db = get_ejdb_from_object(env, obj);
+
+       jfieldID pathID = (*env)->GetFieldID(env, clazz, "path", "Ljava/lang/String;");
+       (*env)->SetObjectField(env, obj, pathID, db ? (*env)->NewStringUTF(env, db->metadb->hdb->path) : NULL);
+
+       jfieldID collectionMapID = (*env)->GetFieldID(env, clazz, "collections", "Ljava/util/Map;");
+       jobject collmapold = (*env)->GetObjectField(env, obj, collectionMapID);
+       jclass mapClazz = (*env)->GetObjectClass(env, collmapold);
+       jmethodID getFromMap = (*env)->GetMethodID(env, mapClazz, "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
+
+       jclass hashMapClazz = (*env)->FindClass(env, "java/util/HashMap");
+       jmethodID initHashMap = (*env)->GetMethodID(env, hashMapClazz, "<init>", "(I)V");
+       jmethodID putIntoMap = (*env)->GetMethodID(env, hashMapClazz, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
+       jobject collmapnew = (*env)->NewObject(env, hashMapClazz, initHashMap, !db ? 0 : db->cdbsnum);
+
+       if (!db) {
+               (*env)->SetObjectField(env, obj, collectionMapID, collmapnew);
+               return;
+       } 
+
+       TCLIST *colls = ejdbgetcolls(db);
+    if (!colls) {
+        set_ejdb_error(env, db);
+        return;
+    }
+
+       jclass collectionClazz = (*env)->FindClass(env, "org/ejdb/driver/EJDBCollection");
+       jmethodID initCollection = (*env)->GetMethodID(env, collectionClazz, "<init>", "(Lorg/ejdb/driver/EJDB;Ljava/lang/String;)V");
+
+    for (int i = 0; i < TCLISTNUM(colls); ++i) {
+               EJCOLL *coll = (EJCOLL*) TCLISTVALPTR(colls, i);
+
+               jstring cname = (*env)->NewStringUTF(env, coll->cname);//, coll->cnamesz);
+
+               jobject cobj = (*env)->CallObjectMethod(env, collmapold, getFromMap, cname);
+               if (!cobj) {
+                       cobj = (*env)->NewObject(env, collectionClazz, initCollection, obj, cname);
+               }
+
+               update_coll_meta(env, cobj, coll);
+               
+               (*env)->CallObjectMethod(env, collmapnew, putIntoMap, cname, cobj);
+       }
+
+       (*env)->SetObjectField(env, obj, collectionMapID, collmapnew);
+};
+
+/*
 * Class:     org_ejdb_driver_EJDBCollection
 * Method:    ensureExists
 * Signature: (Lorg/ejdb/driver/EJDBCollection$Options;)V
@@ -249,7 +385,6 @@ JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDBCollection_ensureExists (JNIEnv
        }
 };
 
-
 /*
 * Class:     org_ejdb_driver_EJDBCollection
 * Method:    drop
@@ -304,6 +439,27 @@ JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDBCollection_sync (JNIEnv *env, jo
 
 /*
  * Class:     org_ejdb_driver_EJDBCollection
+ * Method:    updateMeta
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDBCollection_updateMeta (JNIEnv *env, jobject obj) {
+       EJDB *db = get_ejdb_from_object(env, obj);
+       if (!ejdbisopen(db)) {
+               set_error(env, 0, "EJDB not opened");
+               return;
+       }
+
+       jstring colname = get_coll_name(env, obj);
+
+       const char *cname = (*env)->GetStringUTFChars(env, colname, NULL);
+       EJCOLL * coll = ejdbgetcoll(db, cname);
+       (*env)->ReleaseStringUTFChars(env, colname, cname);
+
+       update_coll_meta(env, obj, coll);
+};
+
+/*
+ * Class:     org_ejdb_driver_EJDBCollection
  * Method:    load
  * Signature: (Lorg/bson/types/ObjectId;)Lorg/bson/BSONObject;
  */
index ef75df7..6d64024 100755 (executable)
@@ -5,6 +5,8 @@
 
 #include "org_ejdb_driver_EJDB.h"
 #include "org_ejdb_driver_EJDBCollection.h"
+#include "org_ejdb_driver_EJDBCollection_Index.h"
+#include "org_ejdb_driver_EJDBCollection_IndexType.h"
 #include "org_ejdb_driver_EJDBQuery.h"
 #include "org_ejdb_driver_EJDBQuery_QResult.h"
 #include "org_ejdb_driver_EJDBResultSet.h"
old mode 100644 (file)
new mode 100755 (executable)
index 2ba9eae..325cfec
@@ -55,6 +55,14 @@ JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDB_close
 JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDB_sync
   (JNIEnv *, jobject);
 
+/*
+ * Class:     org_ejdb_driver_EJDB
+ * Method:    updateMeta
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDB_updateMeta
+  (JNIEnv *, jobject);
+
 #ifdef __cplusplus
 }
 #endif
index 9d38672..4a23856 100755 (executable)
@@ -33,14 +33,6 @@ extern "C" {
 #define org_ejdb_driver_EJDBCollection_JBTXSTATUS 8L
 /*
  * Class:     org_ejdb_driver_EJDBCollection
- * Method:    txControl
- * Signature: (I)Z
- */
-JNIEXPORT jboolean JNICALL Java_org_ejdb_driver_EJDBCollection_txControl
-  (JNIEnv *, jobject, jint);
-
-/*
- * Class:     org_ejdb_driver_EJDBCollection
  * Method:    ensureExists
  * Signature: (Lorg/ejdb/driver/EJDBCollection/Options;)V
  */
@@ -65,6 +57,14 @@ JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDBCollection_sync
 
 /*
  * Class:     org_ejdb_driver_EJDBCollection
+ * Method:    updateMeta
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDBCollection_updateMeta
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     org_ejdb_driver_EJDBCollection
  * Method:    load
  * Signature: (Lorg/bson/types/ObjectId;)Lorg/bson/BSONObject;
  */
@@ -95,6 +95,14 @@ JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDBCollection_remove
 JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDBCollection_setIndex
   (JNIEnv *, jobject, jstring, jint);
 
+/*
+ * Class:     org_ejdb_driver_EJDBCollection
+ * Method:    txControl
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_ejdb_driver_EJDBCollection_txControl
+  (JNIEnv *, jobject, jint);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/jejdb/src/cpp/org_ejdb_driver_EJDBCollection_Index.h b/jejdb/src/cpp/org_ejdb_driver_EJDBCollection_Index.h
new file mode 100644 (file)
index 0000000..7a21d6d
--- /dev/null
@@ -0,0 +1,13 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class org_ejdb_driver_EJDBCollection_Index */
+
+#ifndef _Included_org_ejdb_driver_EJDBCollection_Index
+#define _Included_org_ejdb_driver_EJDBCollection_Index
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/jejdb/src/cpp/org_ejdb_driver_EJDBCollection_IndexType.h b/jejdb/src/cpp/org_ejdb_driver_EJDBCollection_IndexType.h
new file mode 100644 (file)
index 0000000..8c4a1fb
--- /dev/null
@@ -0,0 +1,13 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class org_ejdb_driver_EJDBCollection_IndexType */
+
+#ifndef _Included_org_ejdb_driver_EJDBCollection_IndexType
+#define _Included_org_ejdb_driver_EJDBCollection_IndexType
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
index 5de3cf9..be6e0ce 100644 (file)
@@ -26,10 +26,16 @@ public class Test2 {
 
         try {
             db.open("test5");
-            System.out.println("test EJDB opened: " + db.getPath());
+            System.out.println("test EJDB opened: " + db);
 
             EJDBCollection test = db.getCollection("test");
 
+            test.setIndex("random", EJDBCollection.JBIDXNUM);
+
+            test.updateMeta();
+
+            System.out.println(test);
+
             test.drop(true);
             System.out.println("test collection dropped");
             test.ensureExists();
index a99730a..70b509a 100644 (file)
@@ -1,5 +1,9 @@
 package org.ejdb.driver;
 
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * @author Tyutyunkov Vyacheslav (tve@softmotions.com)
  * @version $Id$
@@ -53,6 +57,11 @@ public class EJDB {
     private long dbPointer;
 
     private String path;
+    private Map<String, EJDBCollection> collections;
+
+    {
+        collections = new HashMap<String, EJDBCollection>();
+    }
 
     public String getPath() {
         return path;
@@ -70,6 +79,8 @@ public class EJDB {
 
     public native void sync();
 
+    public native void updateMeta();
+
     public EJDBCollection ensureCollection(String cname) {
         return this.ensureCollection(cname, null);
     }
@@ -98,7 +109,13 @@ public class EJDB {
     }
 
     public EJDBCollection getCollection(String cname, boolean ecreate, EJDBCollection.Options opts) {
-        EJDBCollection collection = new EJDBCollection(this, cname);
+        if (!this.isOpen()) {
+            // todo: check isOpen
+            throw new RuntimeException("EJDB not opened");
+//            throw new EJDBException(0, "EJDB not opened");
+        }
+
+        EJDBCollection collection = collections.containsKey(cname) ? collections.get(cname) : new EJDBCollection(this, cname);
 
         if (ecreate) {
             collection.ensureExists(opts);
@@ -107,11 +124,28 @@ public class EJDB {
         return collection;
     }
 
-    //////////////////////////////////////////
+    public Collection<String> getCollectionNames() {
+        return collections.keySet();
+    }
+
+    public Collection<EJDBCollection> getCollections() {
+        return collections.values();
+    }
+
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("EJDB");
+        sb.append("{path='").append(path).append('\'');
+        sb.append(", collections=").append(collections.values());
+        sb.append('}');
+        return sb.toString();
+    }
+
     @Override
     protected void finalize() throws Throwable {
         this.close();
         super.finalize();
     }
-
 }
index 007506e..7d8b76c 100644 (file)
@@ -4,6 +4,7 @@ import org.bson.BSONObject;
 import org.bson.types.ObjectId;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -12,16 +13,40 @@ import java.util.List;
  */
 public class EJDBCollection {
 
-    // Index modes, index types.
-    public final static int JBIDXDROP = 1 << 0; /**< Drop index. */
-    public final static int JBIDXDROPALL = 1 << 1; /**< Drop index for all types. */
-    public final static int JBIDXOP = 1 << 2; /**< Optimize index. */
-    public final static int JBIDXREBLD = 1 << 3; /**< Rebuild index. */
-    public final static int JBIDXNUM = 1 << 4; /**< Number index. */
-    public final static int JBIDXSTR = 1 << 5; /**< String index.*/
-    public final static int JBIDXARR = 1 << 6; /**< Array token index. */
-    public final static int JBIDXISTR = 1 << 7; /**< Case insensitive string index */
-
+    /**
+     * Drop index.
+     */
+    public final static int JBIDXDROP = 1 << 0;
+    /**
+     * Drop index for all types.
+     */
+    public final static int JBIDXDROPALL = 1 << 1;
+    /**
+     * Optimize index.
+     */
+    public final static int JBIDXOP = 1 << 2;
+    /**
+     * Rebuild index.
+     */
+    public final static int JBIDXREBLD = 1 << 3;
+    /**
+     * Number index.
+     */
+    public final static int JBIDXNUM = 1 << 4;
+    /**
+     * String index.
+     */
+    public final static int JBIDXSTR = 1 << 5;
+    /**
+     * Array token index.
+     */
+    public final static int JBIDXARR = 1 << 6;
+    /**
+     * Case insensitive string index
+     */
+    public final static int JBIDXISTR = 1 << 7;
+
+    // transaction control options (inner use only)
     protected final static int JBTXBEGIN = 1 << 0;
     protected final static int JBTXCOMMIT = 1 << 1;
     protected final static int JBTXROLLBACK = 1 << 2;
@@ -29,13 +54,34 @@ public class EJDBCollection {
 
     private EJDB db;
     private String cname;
+    private boolean exists;
+    private Options options;
+    private Collection<Index> indexes;
 
     EJDBCollection(EJDB db, String cname) {
         this.db = db;
         this.cname = cname;
     }
 
-    protected native boolean txControl(int mode);
+    public EJDB getDB() {
+        return db;
+    }
+
+    public String getName() {
+        return cname;
+    }
+
+    public boolean isExists() {
+        return exists;
+    }
+
+    public Options getOptions() {
+        return options;
+    }
+
+    public Collection<Index> getIndexes() {
+        return indexes;
+    }
 
     public void ensureExists() {
         this.ensureExists(null);
@@ -51,6 +97,8 @@ public class EJDBCollection {
 
     public native void sync();
 
+    public native void updateMeta();
+
     public native BSONObject load(ObjectId oid);
 
     public native ObjectId save(BSONObject object);
@@ -101,52 +149,112 @@ public class EJDBCollection {
         return this.txControl(JBTXSTATUS);
     }
 
+    protected native boolean txControl(int mode);
+
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("EJDBCollection");
+        sb.append("{cname='").append(cname).append('\'');
+        sb.append(", options=").append(options);
+        sb.append(", indexes=").append(indexes);
+        sb.append('}');
+        return sb.toString();
+    }
+
     public static class Options {
+        private long buckets;
         private boolean compressed;
         private boolean large;
         private long records;
-        private int cachedrecords;
+        private int cachedRecords;
 
         public Options() {
         }
 
-        public Options(boolean compressed, boolean large, long records, int cachedrecords) {
+        public Options(boolean compressed, boolean large, long records, int cachedRecords) {
             this.compressed = compressed;
             this.large = large;
             this.records = records;
-            this.cachedrecords = cachedrecords;
+            this.cachedRecords = cachedRecords;
         }
 
-        public boolean isCompressed() {
-            return compressed;
+        public long getBuckets() {
+            return buckets;
         }
 
-        public void setCompressed(boolean compressed) {
-            this.compressed = compressed;
+        public boolean isCompressed() {
+            return compressed;
         }
 
         public boolean isLarge() {
             return large;
         }
 
-        public void setLarge(boolean large) {
-            this.large = large;
+        public int getCachedRecords() {
+            return cachedRecords;
         }
 
-        public long getRecords() {
-            return records;
+        @Override
+        public String toString() {
+            final StringBuilder sb = new StringBuilder();
+            sb.append("Options");
+            sb.append("{buckets=").append(buckets);
+            sb.append(", compressed=").append(compressed);
+            sb.append(", large=").append(large);
+            sb.append(", cachedRecords=").append(cachedRecords);
+            sb.append('}');
+            return sb.toString();
         }
+    }
 
-        public void setRecords(long records) {
-            this.records = records;
+    public static enum IndexType {
+        Lexical,
+        Numeric,
+        Token;
+    }
+
+    public static class Index {
+        private String name;
+        private String field;
+        private IndexType type;
+        private String file;
+        private int records;
+
+        public String getName() {
+            return name;
         }
 
-        public int getCachedrecords() {
-            return cachedrecords;
+        public String getField() {
+            return field;
+        }
+
+        public IndexType getType() {
+            return type;
+        }
+
+        public String getFile() {
+            return file;
+        }
+
+        public int getRecords() {
+            return records;
         }
 
-        public void setCachedrecords(int cachedrecords) {
-            this.cachedrecords = cachedrecords;
+        @Override
+        public String toString() {
+            final StringBuilder sb = new StringBuilder();
+            sb.append("Index");
+            sb.append("{name='").append(name).append('\'');
+            sb.append(", field='").append(field).append('\'');
+            sb.append(", type=").append(type);
+            if (file != null) {
+                sb.append(", file='").append(file).append('\'');
+            }
+            sb.append(", records=").append(records);
+            sb.append('}');
+            return sb.toString();
         }
     }
 }