use of com.torodb.core.document.ToroDocument in project torodb by torodb.
the class UpdateImplementation method apply.
@Override
public Status<UpdateResult> apply(Request req, Command<? super UpdateArgument, ? super UpdateResult> command, UpdateArgument arg, WriteMongodTransaction context) {
UpdateStatus updateStatus = new UpdateStatus();
try {
if (!context.getTorodTransaction().existsCollection(req.getDatabase(), arg.getCollection())) {
context.getTorodTransaction().createIndex(req.getDatabase(), arg.getCollection(), Constants.ID_INDEX, ImmutableList.<IndexFieldInfo>of(new IndexFieldInfo(new AttributeReference(Arrays.asList(new Key[] { new ObjectKey(Constants.ID) })), FieldIndexOrdering.ASC.isAscending())), true);
}
for (UpdateStatement updateStatement : arg.getStatements()) {
BsonDocument query = updateStatement.getQuery();
UpdateAction updateAction = UpdateActionTranslator.translate(updateStatement.getUpdate());
Cursor<ToroDocument> candidatesCursor;
switch(query.size()) {
case 0:
{
candidatesCursor = context.getTorodTransaction().findAll(req.getDatabase(), arg.getCollection()).asDocCursor();
break;
}
case 1:
{
try {
candidatesCursor = findByAttribute(context.getTorodTransaction(), req.getDatabase(), arg.getCollection(), query);
} catch (CommandFailed ex) {
return Status.from(ex);
}
break;
}
default:
{
return Status.from(ErrorCode.COMMAND_FAILED, "The given query is not supported right now");
}
}
if (candidatesCursor.hasNext()) {
try {
Stream<List<ToroDocument>> candidatesbatchStream;
if (updateStatement.isMulti()) {
candidatesbatchStream = StreamSupport.stream(Spliterators.spliteratorUnknownSize(candidatesCursor.batch(100), Spliterator.ORDERED), false);
} else {
candidatesbatchStream = Stream.of(ImmutableList.of(candidatesCursor.next()));
}
Stream<KvDocument> updatedCandidates = candidatesbatchStream.map(candidates -> {
updateStatus.increaseCandidates(candidates.size());
context.getTorodTransaction().delete(req.getDatabase(), arg.getCollection(), candidates);
return candidates;
}).flatMap(l -> l.stream()).map(candidate -> {
try {
updateStatus.increaseUpdated();
return update(updateAction, candidate);
} catch (UserException userException) {
throw new UserWrappedException(userException);
}
});
context.getTorodTransaction().insert(req.getDatabase(), arg.getCollection(), updatedCandidates);
} catch (UserWrappedException userWrappedException) {
throw userWrappedException.getCause();
}
} else if (updateStatement.isUpsert()) {
KvDocument toInsertCandidate;
if (updateAction instanceof SetDocumentUpdateAction) {
toInsertCandidate = ((SetDocumentUpdateAction) updateAction).getNewValue();
} else {
toInsertCandidate = update(updateAction, new ToroDocument(-1, (KvDocument) MongoWpConverter.translate(query)));
}
if (!toInsertCandidate.containsKey(Constants.ID)) {
KvDocument.Builder builder = new KvDocument.Builder();
for (DocEntry<?> entry : toInsertCandidate) {
builder.putValue(entry.getKey(), entry.getValue());
}
builder.putValue(Constants.ID, MongoWpConverter.translate(objectIdFactory.consumeObjectId()));
toInsertCandidate = builder.build();
}
updateStatus.increaseCandidates(1);
updateStatus.increaseCreated(toInsertCandidate.get(Constants.ID));
Stream<KvDocument> toInsertCandidates = Stream.of(toInsertCandidate);
context.getTorodTransaction().insert(req.getDatabase(), arg.getCollection(), toInsertCandidates);
}
}
} catch (UserException ex) {
//TODO: Improve error reporting
return Status.from(ErrorCode.COMMAND_FAILED, ex.getLocalizedMessage());
}
mongodMetrics.getUpdateModified().mark(updateStatus.updated);
mongodMetrics.getUpdateMatched().mark(updateStatus.candidates);
mongodMetrics.getUpdateUpserted().mark(updateStatus.upsertResults.size());
return Status.ok(new UpdateResult(updateStatus.updated, updateStatus.candidates, ImmutableList.copyOf(updateStatus.upsertResults)));
}
use of com.torodb.core.document.ToroDocument in project torodb by torodb.
the class R2DTranslatorTest method readMultipleDocument.
/*
* Document 1 { "name" : "jero" } Document 2 { "name" : "john" }
*/
@Test
public void readMultipleDocument() {
MetaDocPartBuilder builder = new MetaDocPartBuilder(rootRef);
builder.addMetaField("name", "name_s", FieldType.STRING);
builder.addRow(1, null, 1, null, "jero");
builder.addRow(2, null, 2, null, "john");
MockedDocPartResult root = builder.getResultSet();
List<DocPartResult> lst = Collections.singletonList(root);
R2DTranslator r2dTranslator = new R2DTranslatorImpl();
ToroDocument[] readedDocuments = r2dTranslator.translate(lst.iterator()).toArray(new ToroDocument[0]);
assertEquals(2, readedDocuments.length);
KvDocument doc1 = readedDocuments[0].getRoot();
assertEquals("jero", doc1.get("name").getValue());
KvDocument doc2 = readedDocuments[1].getRoot();
assertEquals("john", doc2.get("name").getValue());
}
use of com.torodb.core.document.ToroDocument in project torodb by torodb.
the class R2DTranslatorTest method readTwoLevelDocument.
/*
* Document: { "name" : "jero", "address" : { "street" : "myhouse" } }
*/
@Test
public void readTwoLevelDocument() {
/*
* Root Level
*/
MetaDocPartBuilder builder = new MetaDocPartBuilder(rootRef);
builder.addMetaField("name", "name_s", FieldType.STRING);
builder.addMetaField("address", "address_e", FieldType.CHILD);
builder.addRow(1, null, 1, null, "jero", IsDocument);
MockedDocPartResult root = builder.getResultSet();
/*
* Second Level
*/
TableRef secondRef = fact.createChild(rootRef, "address");
MetaDocPartBuilder secondBuilder = new MetaDocPartBuilder(secondRef);
secondBuilder.addMetaField("street", "street_s", FieldType.STRING);
secondBuilder.addRow(1, 1, 20, null, "myhouse");
MockedDocPartResult secondLevel = secondBuilder.getResultSet();
List<DocPartResult> lst = Lists.newArrayList(secondLevel, root);
R2DTranslator r2dTranslator = new R2DTranslatorImpl();
Collection<ToroDocument> readedDocuments = r2dTranslator.translate(lst.iterator());
assertEquals(1, readedDocuments.size());
KvDocument doc = readedDocuments.iterator().next().getRoot();
assertEquals("jero", doc.get("name").getValue());
KvValue<?> kvValue = doc.get("address");
assertTrue(kvValue instanceof KvDocument);
}
use of com.torodb.core.document.ToroDocument in project torodb by torodb.
the class R2DTranslatorTest method readDocumentWithNullField.
/*
* Document: { "name" : "jero", "address" : null }
*/
@Test
public void readDocumentWithNullField() {
MetaDocPartBuilder builder = new MetaDocPartBuilder(rootRef);
builder.addMetaField("name", "name_s", FieldType.STRING);
builder.addMetaField("address", "address_s", FieldType.STRING);
builder.addMetaField("address", "address_n", FieldType.NULL);
builder.addRow(1, null, 1, null, "jero", null, true);
MockedDocPartResult root = builder.getResultSet();
List<DocPartResult> lst = Collections.singletonList(root);
R2DTranslator r2dTranslator = new R2DTranslatorImpl();
Collection<ToroDocument> readedDocuments = r2dTranslator.translate(lst.iterator());
assertEquals(1, readedDocuments.size());
KvDocument doc = readedDocuments.iterator().next().getRoot();
assertEquals("jero", doc.get("name").getValue());
assertEquals(KvNull.getInstance(), doc.get("address"));
}
use of com.torodb.core.document.ToroDocument in project torodb by torodb.
the class R2DTranslatorTest method readTwoInnerArray.
/*
* Document: { "name" : "jero", "numbers" : [666, [4,8, 15, 16]] }
*/
@Test
public void readTwoInnerArray() {
int did = 1;
/*
* Root Level
*/
MetaDocPartBuilder builder = new MetaDocPartBuilder(rootRef);
builder.addMetaField("name", "name_s", FieldType.STRING);
builder.addMetaField("numbers", "numbers_e", FieldType.CHILD);
builder.addRow(did, null, did, null, "jero", IsArray);
MockedDocPartResult root = builder.getResultSet();
/*
* Second Level
*/
int pid = did;
TableRef secondRef = fact.createChild(rootRef, "numbers");
MetaDocPartBuilder secondBuilder = new MetaDocPartBuilder(secondRef);
secondBuilder.addMetaScalar("v_i", FieldType.INTEGER);
secondBuilder.addMetaScalar("v_e", FieldType.CHILD);
secondBuilder.addRow(did, pid, 20, 0, 666, null);
secondBuilder.addRow(did, pid, 21, 1, null, IsArray);
MockedDocPartResult secondLevel = secondBuilder.getResultSet();
/*
* Third Level
*/
int pid1 = 21;
TableRef thirdRef = fact.createChild(secondRef, 2);
MetaDocPartBuilder thirdBuilder = new MetaDocPartBuilder(thirdRef);
thirdBuilder.addMetaScalar("v_i", FieldType.INTEGER);
thirdBuilder.addRow(did, pid1, 30, 0, 4);
thirdBuilder.addRow(did, pid1, 31, 1, 8);
thirdBuilder.addRow(did, pid1, 33, 2, 15);
thirdBuilder.addRow(did, pid1, 34, 3, 16);
MockedDocPartResult thirdLevel = thirdBuilder.getResultSet();
List<DocPartResult> lst = Lists.newArrayList(thirdLevel, secondLevel, root);
R2DTranslator r2dTranslator = new R2DTranslatorImpl();
Collection<ToroDocument> readedDocuments = r2dTranslator.translate(lst.iterator());
assertEquals(1, readedDocuments.size());
KvDocument doc = readedDocuments.iterator().next().getRoot();
assertEquals("jero", doc.get("name").getValue());
KvValue<?> kvValue = doc.get("numbers");
assertTrue(kvValue instanceof KvArray);
KvArray array = (KvArray) kvValue;
assertEquals(2, array.size());
assertEquals(666, array.get(0).getValue());
KvValue<?> kvValueSecond = array.get(1);
assertNotNull(kvValueSecond);
assertTrue(kvValueSecond instanceof KvArray);
KvArray array2 = (KvArray) kvValueSecond;
assertEquals(4, array2.size());
assertEquals(4, array2.get(0).getValue());
assertEquals(8, array2.get(1).getValue());
assertEquals(15, array2.get(2).getValue());
assertEquals(16, array2.get(3).getValue());
}
Aggregations