List of usage examples for com.mongodb BasicDBObject markAsPartialObject
@Override public void markAsPartialObject()
From source file:com.softinstigate.restheart.db.CollectionDAO.java
License:Open Source License
/** * Upsert the collection properties./* w w w.j a v a 2s. com*/ * * @param dbName the database name of the collection * @param collName the collection name * @param content the new collection properties * @param etag the entity tag. must match to allow actual write (otherwise * http error code is returned) * @param updating true if updating existing document * @param patching true if use patch semantic (update only specified fields) * @return the HttpStatus code to set in the http response */ public static int upsertCollection(String dbName, String collName, DBObject content, ObjectId etag, boolean updating, boolean patching) { DB db = DBDAO.getDB(dbName); DBCollection coll = db.getCollection(collName); if (patching && !updating) { return HttpStatus.SC_NOT_FOUND; } if (updating) { if (etag == null) { return HttpStatus.SC_CONFLICT; } BasicDBObject idAndEtagQuery = new BasicDBObject("_id", "_properties"); idAndEtagQuery.append("_etag", etag); if (coll.count(idAndEtagQuery) < 1) { return HttpStatus.SC_PRECONDITION_FAILED; } } ObjectId timestamp = new ObjectId(); Instant now = Instant.ofEpochSecond(timestamp.getTimestamp()); if (content == null) { content = new BasicDBObject(); } content.removeField("_id"); // make sure we don't change this field if (updating) { content.removeField("_crated_on"); // don't allow to update this field content.put("_etag", timestamp); } else { content.put("_id", "_properties"); content.put("_created_on", now.toString()); content.put("_etag", timestamp); } if (patching) { coll.update(PROPS_QUERY, new BasicDBObject("$set", content), true, false); return HttpStatus.SC_OK; } else { // we use findAndModify to get the @created_on field value from the existing properties document // we need to put this field back using a second update // it is not possible in a single update even using $setOnInsert update operator // in this case we need to provide the other data using $set operator and this makes it a partial update (patch semantic) DBObject old = coll.findAndModify(PROPS_QUERY, fieldsToReturn, null, false, content, false, true); if (old != null) { Object oldTimestamp = old.get("_created_on"); if (oldTimestamp == null) { oldTimestamp = now.toString(); logger.warn("properties of collection {} had no @created_on field. set to now", coll.getFullName()); } // need to readd the @created_on field BasicDBObject createdContet = new BasicDBObject("_created_on", "" + oldTimestamp); createdContet.markAsPartialObject(); coll.update(PROPS_QUERY, new BasicDBObject("$set", createdContet), true, false); return HttpStatus.SC_OK; } else { // need to readd the @created_on field BasicDBObject createdContet = new BasicDBObject("_created_on", now.toString()); createdContet.markAsPartialObject(); coll.update(PROPS_QUERY, new BasicDBObject("$set", createdContet), true, false); initDefaultIndexes(coll); return HttpStatus.SC_CREATED; } } }
From source file:com.softinstigate.restheart.db.DBDAO.java
License:Open Source License
/** * * @param dbName/*from w w w. j ava 2 s .co m*/ * @param content * @param etag * @param patching * @return */ public static int upsertDB(String dbName, DBObject content, ObjectId etag, boolean patching) { DB db = client.getDB(dbName); boolean existing = db.getCollectionNames().size() > 0; if (patching && !existing) { return HttpStatus.SC_NOT_FOUND; } DBCollection coll = db.getCollection("_properties"); // check the etag if (db.collectionExists("_properties")) { if (etag == null) { return HttpStatus.SC_CONFLICT; } BasicDBObject idAndEtagQuery = new BasicDBObject("_id", "_properties"); idAndEtagQuery.append("_etag", etag); if (coll.count(idAndEtagQuery) < 1) { return HttpStatus.SC_PRECONDITION_FAILED; } } // apply new values ObjectId timestamp = new ObjectId(); Instant now = Instant.ofEpochSecond(timestamp.getTimestamp()); if (content == null) { content = new BasicDBObject(); } content.put("_etag", timestamp); content.removeField("_created_on"); // make sure we don't change this field content.removeField("_id"); // make sure we don't change this field if (patching) { coll.update(METADATA_QUERY, new BasicDBObject("$set", content), true, false); return HttpStatus.SC_OK; } else { // we use findAndModify to get the @created_on field value from the existing document // we need to put this field back using a second update // it is not possible in a single update even using $setOnInsert update operator // in this case we need to provide the other data using $set operator and this makes it a partial update (patch semantic) DBObject old = coll.findAndModify(METADATA_QUERY, fieldsToReturn, null, false, content, false, true); if (old != null) { Object oldTimestamp = old.get("_created_on"); if (oldTimestamp == null) { oldTimestamp = now.toString(); logger.warn("properties of collection {} had no @created_on field. set to now", coll.getFullName()); } // need to readd the @created_on field BasicDBObject createdContet = new BasicDBObject("_created_on", "" + oldTimestamp); createdContet.markAsPartialObject(); coll.update(METADATA_QUERY, new BasicDBObject("$set", createdContet), true, false); return HttpStatus.SC_OK; } else { // need to readd the @created_on field BasicDBObject createdContet = new BasicDBObject("_created_on", now.toString()); createdContet.markAsPartialObject(); coll.update(METADATA_QUERY, new BasicDBObject("$set", createdContet), true, false); return HttpStatus.SC_CREATED; } } }
From source file:com.softinstigate.restheart.db.DocumentDAO.java
License:Open Source License
/** * * * @param dbName/* ww w . j a v a2s. c o m*/ * @param collName * @param documentId * @param content * @param requestEtag * @param patching * @return the HttpStatus code to retrun */ public static int upsertDocument(String dbName, String collName, String documentId, DBObject content, ObjectId requestEtag, boolean patching) { DB db = DBDAO.getDB(dbName); DBCollection coll = db.getCollection(collName); ObjectId timestamp = new ObjectId(); Instant now = Instant.ofEpochSecond(timestamp.getTimestamp()); if (content == null) { content = new BasicDBObject(); } content.put("_etag", timestamp); BasicDBObject idQuery = new BasicDBObject("_id", getId(documentId)); if (patching) { content.removeField("_created_on"); // make sure we don't change this field DBObject oldDocument = coll.findAndModify(idQuery, null, null, false, new BasicDBObject("$set", content), false, false); if (oldDocument == null) { return HttpStatus.SC_NOT_FOUND; } else { // check the old etag (in case restore the old document version) return optimisticCheckEtag(coll, oldDocument, requestEtag, HttpStatus.SC_OK); } } else { content.put("_created_on", now.toString()); // let's assume this is an insert. in case we'll set it back with a second update // we use findAndModify to get the @created_on field value from the existing document // in case this is an update well need to put it back using a second update // it is not possible to do it with a single update // (even using $setOnInsert update because we'll need to use the $set operator for other data and this would make it a partial update (patch semantic) DBObject oldDocument = coll.findAndModify(idQuery, null, null, false, content, false, true); if (oldDocument != null) { // upsert Object oldTimestamp = oldDocument.get("_created_on"); if (oldTimestamp == null) { oldTimestamp = now.toString(); logger.warn("properties of document /{}/{}/{} had no @created_on field. set to now", dbName, collName, documentId); } // need to readd the @created_on field BasicDBObject created = new BasicDBObject("_created_on", "" + oldTimestamp); created.markAsPartialObject(); coll.update(idQuery, new BasicDBObject("$set", created), true, false); // check the old etag (in case restore the old document version) return optimisticCheckEtag(coll, oldDocument, requestEtag, HttpStatus.SC_OK); } else { // insert return HttpStatus.SC_CREATED; } } }
From source file:com.softinstigate.restheart.db.DocumentDAO.java
License:Open Source License
/** * * * @param exchange//from www . j a v a 2s.co m * @param dbName * @param collName * @param content * @param requestEtag * @return the HttpStatus code to retrun */ public static int upsertDocumentPost(HttpServerExchange exchange, String dbName, String collName, DBObject content, ObjectId requestEtag) { DB db = DBDAO.getDB(dbName); DBCollection coll = db.getCollection(collName); ObjectId timestamp = new ObjectId(); Instant now = Instant.ofEpochSecond(timestamp.getTimestamp()); if (content == null) { content = new BasicDBObject(); } content.put("_etag", timestamp); content.put("_created_on", now.toString()); // make sure we don't change this field Object _id = content.get("_id"); content.removeField("_id"); if (_id == null) { ObjectId id = new ObjectId(); content.put("_id", id); coll.insert(content); exchange.getResponseHeaders().add(HttpString.tryFromString("Location"), getReferenceLink(exchange.getRequestURL(), id.toString()).toString()); return HttpStatus.SC_CREATED; } BasicDBObject idQuery = new BasicDBObject("_id", getId("" + _id)); // we use findAndModify to get the @created_on field value from the existing document // we need to put this field back using a second update // it is not possible in a single update even using $setOnInsert update operator // in this case we need to provide the other data using $set operator and this makes it a partial update (patch semantic) DBObject oldDocument = coll.findAndModify(idQuery, null, null, false, content, false, true); if (oldDocument != null) { // upsert Object oldTimestamp = oldDocument.get("_created_on"); if (oldTimestamp == null) { oldTimestamp = now.toString(); logger.warn("properties of document /{}/{}/{} had no @created_on field. set to now", dbName, collName, _id.toString()); } // need to readd the @created_on field BasicDBObject createdContet = new BasicDBObject("_created_on", "" + oldTimestamp); createdContet.markAsPartialObject(); coll.update(idQuery, new BasicDBObject("$set", createdContet), true, false); // check the old etag (in case restore the old document version) return optimisticCheckEtag(coll, oldDocument, requestEtag, HttpStatus.SC_OK); } else { // insert return HttpStatus.SC_CREATED; } }