Search in sources :

Example 6 with IdMap

use of de.fhg.igd.mongomvcc.helper.IdMap in project mongomvcc by igd-geo.

the class Tree method resolveCollectionObjects.

private static IdMap resolveCollectionObjects(DBObject o) {
    Set<String> keys = o.keySet();
    IdMap r = new IdHashMap(keys.size());
    for (String k : keys) {
        r.put(Long.parseLong(k), (Long) o.get(k));
    }
    return r;
}
Also used : IdMap(de.fhg.igd.mongomvcc.helper.IdMap) IdHashMap(de.fhg.igd.mongomvcc.helper.IdHashMap)

Example 7 with IdMap

use of de.fhg.igd.mongomvcc.helper.IdMap in project mongomvcc by igd-geo.

the class MongoDBVCollection method find.

@Override
public VCursor find() {
    //ask index for OIDs
    IdMap objs = _branch.getIndex().find(_name);
    if (objs.size() == 0) {
        return MongoDBVCursor.EMPTY;
    }
    //ask MongoDB for objects with the given OIDs
    if (objs.size() == 1) {
        //shortcut for one object
        return createCursor(_delegate.find(new BasicDBObject(OID, objs.values()[0])), null);
    } else {
        DBObject qo = new BasicDBObject();
        qo.putAll(_branch.getQueryObject());
        return createCursor(_delegate.find(qo), new OIDInIndexFilter());
    }
}
Also used : BasicDBObject(com.mongodb.BasicDBObject) IdMap(de.fhg.igd.mongomvcc.helper.IdMap) BasicDBObject(com.mongodb.BasicDBObject) DBObject(com.mongodb.DBObject)

Example 8 with IdMap

use of de.fhg.igd.mongomvcc.helper.IdMap in project mongomvcc by igd-geo.

the class MongoDBVMaintenance method doFindUnreferencedDocuments.

private long[] doFindUnreferencedDocuments(String collection, long expiry, TimeUnit unit) {
    long maxTime = getMaxTime(expiry, unit);
    //fetch the OIDs of all documents older than the expiry time
    DBCollection collDocs = _db.getDB().getCollection(collection);
    DBCursor docs = collDocs.find(new BasicDBObject(MongoDBConstants.TIMESTAMP, //also include docs without a timestamp
    new BasicDBObject("$not", new BasicDBObject("$gte", maxTime))), new BasicDBObject(MongoDBConstants.ID, 1));
    IdSet oids = new IdHashSet(docs.count());
    for (DBObject o : docs) {
        oids.add((Long) o.get(MongoDBConstants.ID));
    }
    //iterate through all commits and eliminate referenced documents
    DBCollection collCommits = _db.getDB().getCollection(MongoDBConstants.COLLECTION_COMMITS);
    for (DBObject o : collCommits.find()) {
        Commit c = Tree.deserializeCommit(o);
        Map<String, IdMap> allObjs = c.getObjects();
        IdMap objs = allObjs.get(collection);
        if (objs != null) {
            //eliminate OIDs referenced by this commit
            IdMapIterator mi = objs.iterator();
            while (mi.hasNext()) {
                mi.advance();
                oids.remove(mi.value());
            }
        }
    }
    //the remaining OIDs must be the unreferenced ones
    return oids.toArray();
}
Also used : DBCollection(com.mongodb.DBCollection) BasicDBObject(com.mongodb.BasicDBObject) DBCursor(com.mongodb.DBCursor) IdMap(de.fhg.igd.mongomvcc.helper.IdMap) Commit(de.fhg.igd.mongomvcc.impl.internal.Commit) IdSet(de.fhg.igd.mongomvcc.helper.IdSet) IdMapIterator(de.fhg.igd.mongomvcc.helper.IdMapIterator) IdHashSet(de.fhg.igd.mongomvcc.helper.IdHashSet) BasicDBObject(com.mongodb.BasicDBObject) DBObject(com.mongodb.DBObject)

Example 9 with IdMap

use of de.fhg.igd.mongomvcc.helper.IdMap in project mongomvcc by igd-geo.

the class MongoDBVBranch method commit.

@Override
public long commit() {
    Index idx = getIndex();
    //clone dirty objects because we clear them below
    Map<String, IdMap> dos = new HashMap<String, IdMap>(idx.getDirtyObjects());
    Commit head = getHeadCommit();
    Commit c = new Commit(_db.getCounter().getNextId(), head.getCID(), _rootCid, dos);
    _tree.addCommit(c);
    updateHead(c);
    //mark deleted objects as deleted in the database
    DB db = _db.getDB();
    String lifetimeAttr = MongoDBConstants.LIFETIME + "." + getRootCid();
    for (Map.Entry<String, IdSet> e : idx.getDeletedOids().entrySet()) {
        DBCollection dbc = db.getCollection(e.getKey());
        IdSetIterator li = e.getValue().iterator();
        while (li.hasNext()) {
            long oid = li.next();
            //save the CID of the commit where the object has been deleted
            dbc.update(new BasicDBObject(MongoDBConstants.ID, oid), new BasicDBObject("$set", new BasicDBObject(lifetimeAttr, head.getCID())));
        }
    }
    //mark dirty objects as inserted
    String instimeAttr = MongoDBConstants.LIFETIME + ".i" + getRootCid();
    for (Map.Entry<String, IdMap> e : dos.entrySet()) {
        DBCollection dbc = db.getCollection(e.getKey());
        IdMap m = e.getValue();
        IdMapIterator li = m.iterator();
        while (li.hasNext()) {
            li.advance();
            long oid = li.value();
            if (oid == -1) {
                //do not save time of insertion
                continue;
            }
            //save the CID of the commit where the object has been inserted
            dbc.update(new BasicDBObject(MongoDBConstants.ID, oid), new BasicDBObject("$set", new BasicDBObject(instimeAttr, head.getCID())));
        }
    }
    //reset index
    idx.clearDirtyObjects();
    //update named branch's head
    if (_name != null) {
        //and then update it
        synchronized (this) {
            //check for conflicts (i.e. if another thread has already updated the branch's head)
            if (_tree.resolveBranch(_name).getCID() != c.getParentCID()) {
                throw new VException("Branch " + _name + " has already been " + "updated by another commit");
            }
            _tree.updateBranchHead(_name, c.getCID());
        }
    }
    return c.getCID();
}
Also used : HashMap(java.util.HashMap) IdMapIterator(de.fhg.igd.mongomvcc.helper.IdMapIterator) Index(de.fhg.igd.mongomvcc.impl.internal.Index) IdSetIterator(de.fhg.igd.mongomvcc.helper.IdSetIterator) DBCollection(com.mongodb.DBCollection) BasicDBObject(com.mongodb.BasicDBObject) IdMap(de.fhg.igd.mongomvcc.helper.IdMap) Commit(de.fhg.igd.mongomvcc.impl.internal.Commit) IdSet(de.fhg.igd.mongomvcc.helper.IdSet) VException(de.fhg.igd.mongomvcc.VException) HashMap(java.util.HashMap) IdMap(de.fhg.igd.mongomvcc.helper.IdMap) Map(java.util.Map) DB(com.mongodb.DB)

Example 10 with IdMap

use of de.fhg.igd.mongomvcc.helper.IdMap in project mongomvcc by igd-geo.

the class Tree method deserializeCommit.

/**
	 * Deserializes a database object to a commit
	 * @param o the object
	 * @return the commit
	 */
public static Commit deserializeCommit(DBObject o) {
    long cid = (Long) o.get(MongoDBConstants.ID);
    Long timestampL = (Long) o.get(MongoDBConstants.TIMESTAMP);
    long timestamp = timestampL != null ? timestampL : 0;
    long parentCID = (Long) o.get(PARENT_CID);
    long rootCID = (Long) o.get(ROOT_CID);
    DBObject objs = (DBObject) o.get(OBJECTS);
    Map<String, IdMap> objects = new HashMap<String, IdMap>();
    for (String k : objs.keySet()) {
        if (!k.equals(MongoDBConstants.ID)) {
            objects.put(k, resolveCollectionObjects((DBObject) objs.get(k)));
        }
    }
    return new Commit(cid, timestamp, parentCID, rootCID, objects);
}
Also used : IdMap(de.fhg.igd.mongomvcc.helper.IdMap) IdHashMap(de.fhg.igd.mongomvcc.helper.IdHashMap) HashMap(java.util.HashMap) BasicDBObject(com.mongodb.BasicDBObject) DBObject(com.mongodb.DBObject)

Aggregations

IdMap (de.fhg.igd.mongomvcc.helper.IdMap)10 IdHashMap (de.fhg.igd.mongomvcc.helper.IdHashMap)6 BasicDBObject (com.mongodb.BasicDBObject)5 DBObject (com.mongodb.DBObject)4 IdMapIterator (de.fhg.igd.mongomvcc.helper.IdMapIterator)4 IdSet (de.fhg.igd.mongomvcc.helper.IdSet)4 HashMap (java.util.HashMap)4 Map (java.util.Map)3 DBCollection (com.mongodb.DBCollection)2 Commit (de.fhg.igd.mongomvcc.impl.internal.Commit)2 DB (com.mongodb.DB)1 DBCursor (com.mongodb.DBCursor)1 VException (de.fhg.igd.mongomvcc.VException)1 IdHashSet (de.fhg.igd.mongomvcc.helper.IdHashSet)1 IdSetIterator (de.fhg.igd.mongomvcc.helper.IdSetIterator)1 Index (de.fhg.igd.mongomvcc.impl.internal.Index)1 ArrayDeque (java.util.ArrayDeque)1