/**************************************************************************************************
* EJDB database library http://ejdb.org
- * Copyright (C) 2012-2013 Softmotions Ltd <info@softmotions.com>
+ * Copyright (C) 2012-2015 Softmotions Ltd <info@softmotions.com>
*
* This file is part of EJDB.
* EJDB is free software; you can redistribute it and/or modify it under the terms of
case JBEQINCEXCL:
return "$fields hint cannot mix include and exclude fields";
case JBEQACTKEY:
- return "action key in $do block can only be one of: $join";
+ return "action key in $do block can be one of: $join, $slice";
case JBEMAXNUMCOLS:
return "exceeded the maximum number of collections per database: 1024";
case JBEEJSONPARSE:
assert(dofield->updateobj && (dofield->flags & EJCONDOIT));
BSON_ITERATOR_INIT(&doit, dofield->updateobj);
while ((bt = bson_iterator_next(&doit)) != BSON_EOO) {
- if (bt != BSON_STRING || strcmp("$join", BSON_ITERATOR_KEY(&doit))) continue;
- coll = _getcoll(ictx->jb, bson_iterator_string(&doit));
- if (!coll) break;
- bson_oid_t loid;
- if (lbt == BSON_STRING) {
- sval = bson_iterator_string(it);
- if (!ejdbisvalidoidstr(sval)) break;
- bson_oid_from_string(&loid, sval);
- } else if (lbt == BSON_OID) {
- loid = *(bson_iterator_oid(it));
- }
- if (lbt == BSON_STRING || lbt == BSON_OID) {
- tcxstrclear(ictx->q->colbuf);
- tcxstrclear(ictx->q->tmpbuf);
- if (!tchdbgetintoxstr(coll->tdb->hdb, &loid, sizeof (loid), ictx->q->colbuf) ||
- !tcmaploadoneintoxstr(TCXSTRPTR(ictx->q->colbuf), TCXSTRSIZE(ictx->q->colbuf),
- JDBCOLBSON, JDBCOLBSONL, ictx->q->tmpbuf)) {
- break;
- }
- BSON_ITERATOR_FROM_BUFFER(&bufit, TCXSTRPTR(ictx->q->tmpbuf));
- bson_append_object_from_iterator(BSON_ITERATOR_KEY(it), &bufit, ictx->sbson);
- break;
- }
- if (lbt == BSON_ARRAY) {
- BSON_ITERATOR_SUBITERATOR(it, &sit);
- bson_append_start_array(ictx->sbson, BSON_ITERATOR_KEY(it));
- while ((bt = bson_iterator_next(&sit)) != BSON_EOO) {
- if (bt != BSON_STRING && bt != BSON_OID) {
- bson_append_field_from_iterator(&sit, ictx->sbson);
- continue;
- }
- if (bt == BSON_STRING) {
- sval = bson_iterator_string(&sit);
- if (!ejdbisvalidoidstr(sval)) break;
- bson_oid_from_string(&loid, sval);
- } else if (bt == BSON_OID) {
- loid = *(bson_iterator_oid(&sit));
- }
- tcxstrclear(ictx->q->colbuf);
- tcxstrclear(ictx->q->tmpbuf);
- if (!tchdbgetintoxstr(coll->tdb->hdb, &loid, sizeof (loid), ictx->q->colbuf) ||
- !tcmaploadoneintoxstr(TCXSTRPTR(ictx->q->colbuf), TCXSTRSIZE(ictx->q->colbuf),
- JDBCOLBSON, JDBCOLBSONL, ictx->q->tmpbuf)) {
- bson_append_field_from_iterator(&sit, ictx->sbson);
- continue;
- }
- BSON_ITERATOR_FROM_BUFFER(&bufit, TCXSTRPTR(ictx->q->tmpbuf));
- bson_append_object_from_iterator(BSON_ITERATOR_KEY(&sit), &bufit, ictx->sbson);
- }
- bson_append_finish_array(ictx->sbson);
- rv = (BSON_VCMD_SKIP_AFTER | BSON_VCMD_SKIP_NESTED);
- }
- }
+ const char *dofname = BSON_ITERATOR_KEY(&doit);
+
+ if (bt == BSON_STRING && !strcmp("$join", dofname)) {
+ coll = _getcoll(ictx->jb, bson_iterator_string(&doit));
+ if (!coll) break;
+ bson_oid_t loid;
+ if (lbt == BSON_STRING) {
+ sval = bson_iterator_string(it);
+ if (!ejdbisvalidoidstr(sval)) break;
+ bson_oid_from_string(&loid, sval);
+ } else if (lbt == BSON_OID) {
+ loid = *(bson_iterator_oid(it));
+ }
+ if (lbt == BSON_STRING || lbt == BSON_OID) {
+ tcxstrclear(ictx->q->colbuf);
+ tcxstrclear(ictx->q->tmpbuf);
+ if (!tchdbgetintoxstr(coll->tdb->hdb, &loid, sizeof (loid), ictx->q->colbuf) ||
+ !tcmaploadoneintoxstr(TCXSTRPTR(ictx->q->colbuf), TCXSTRSIZE(ictx->q->colbuf),
+ JDBCOLBSON, JDBCOLBSONL, ictx->q->tmpbuf)) {
+ break;
+ }
+ BSON_ITERATOR_FROM_BUFFER(&bufit, TCXSTRPTR(ictx->q->tmpbuf));
+ bson_append_object_from_iterator(BSON_ITERATOR_KEY(it), &bufit, ictx->sbson);
+ break;
+ }
+ if (lbt == BSON_ARRAY) {
+ BSON_ITERATOR_SUBITERATOR(it, &sit);
+ bson_append_start_array(ictx->sbson, BSON_ITERATOR_KEY(it));
+ while ((bt = bson_iterator_next(&sit)) != BSON_EOO) {
+ if (bt != BSON_STRING && bt != BSON_OID) {
+ bson_append_field_from_iterator(&sit, ictx->sbson);
+ continue;
+ }
+ if (bt == BSON_STRING) {
+ sval = bson_iterator_string(&sit);
+ if (!ejdbisvalidoidstr(sval)) break;
+ bson_oid_from_string(&loid, sval);
+ } else if (bt == BSON_OID) {
+ loid = *(bson_iterator_oid(&sit));
+ }
+ tcxstrclear(ictx->q->colbuf);
+ tcxstrclear(ictx->q->tmpbuf);
+ if (!tchdbgetintoxstr(coll->tdb->hdb, &loid, sizeof (loid), ictx->q->colbuf) ||
+ !tcmaploadoneintoxstr(TCXSTRPTR(ictx->q->colbuf), TCXSTRSIZE(ictx->q->colbuf),
+ JDBCOLBSON, JDBCOLBSONL, ictx->q->tmpbuf)) {
+ bson_append_field_from_iterator(&sit, ictx->sbson);
+ continue;
+ }
+ BSON_ITERATOR_FROM_BUFFER(&bufit, TCXSTRPTR(ictx->q->tmpbuf));
+ bson_append_object_from_iterator(BSON_ITERATOR_KEY(&sit), &bufit, ictx->sbson);
+ }
+ bson_append_finish_array(ictx->sbson);
+ rv = (BSON_VCMD_SKIP_AFTER | BSON_VCMD_SKIP_NESTED);
+ }
+
+ } else if (lbt == BSON_ARRAY &&
+ (bt == BSON_ARRAY || BSON_IS_NUM_TYPE(bt)) &&
+ !strcmp("$slice", dofname)) {
+
+ bson_append_start_array(ictx->sbson, BSON_ITERATOR_KEY(it));
+ int skip = 0, limit, idx = 0, i;
+ char nbuff[TCNUMBUFSIZ];
+
+ if (bt == BSON_ARRAY) { // $slice : [skip, limit]
+ bson_type bt2;
+ bson_iterator sit2;
+ BSON_ITERATOR_SUBITERATOR(&doit, &sit2);
+
+ bt2 = bson_find_fieldpath_value2("0", 1, &sit2);
+ if (!BSON_IS_NUM_TYPE(bt2)) {
+ bson_append_field_from_iterator(it, ictx->sbson);
+ break;
+ }
+ skip = bson_iterator_int(&sit2);
+
+ bt2 = bson_find_fieldpath_value2("1", 1, &sit2);
+ if (!BSON_IS_NUM_TYPE(bt2)) {
+ bson_append_field_from_iterator(it, ictx->sbson);
+ break;
+ }
+ limit = abs(bson_iterator_int(&sit2));
+ } else { // $slice : limit
+ limit = abs(bson_iterator_int(&doit));
+ }
+
+ if (skip < 0) {
+ int cnt = 0;
+ BSON_ITERATOR_SUBITERATOR(it, &sit);
+ while (bson_iterator_next(&sit) != BSON_EOO) ++cnt;
+ skip = cnt + skip % cnt;
+ if (skip == cnt) {
+ skip = 0;
+ }
+ }
+
+ limit = (limit <= INT_MAX - skip) ? limit + skip : INT_MAX;
+ BSON_ITERATOR_SUBITERATOR(it, &sit);
+ for (i = 0; idx < limit && (bt = bson_iterator_next(&sit)) != BSON_EOO; ++idx) {
+ if (idx >= skip) {
+ bson_numstrn(nbuff, TCNUMBUFSIZ, i++);
+ bson_append_field_from_iterator2(nbuff, &sit, ictx->sbson);
+ }
+ }
+ bson_append_finish_array(ictx->sbson);
+ rv = (BSON_VCMD_SKIP_AFTER | BSON_VCMD_SKIP_NESTED);
+ }
+ }
break;
}
default:
int ac = 0;
while ((sbt = bson_iterator_next(&sit)) != BSON_EOO) {
const char *akey = BSON_ITERATOR_KEY(&sit);
- if (!strcmp("$join", akey)) {
+ if (!strcmp("$join", akey) || !strcmp("$slice", akey)) {
bson_append_field_from_iterator(&sit, qf.updateobj);
++ac;
}
}
}
return false;
-}
+}
\ No newline at end of file
return 0;
}
-void testAddData() {
+void testAddData(void) {
CU_ASSERT_PTR_NOT_NULL_FATAL(jb);
bson_oid_t oid;
EJCOLL *ccoll = ejdbcreatecoll(jb, "contacts", NULL);
bson_destroy(&a1);
}
-void testInvalidQueries1() {
+void testInvalidQueries1(void) {
}
-void testSetIndex1() {
+void testSetIndex1(void) {
EJCOLL *ccoll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(ccoll);
CU_ASSERT_TRUE(ejdbsetindex(ccoll, "ab.c.d", JBIDXSTR));
bson_destroy(&a1);
}
-void testQuery1() {
+void testQuery1(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
tcxstrdel(log);
}
-void testQuery2() {
+void testQuery2(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
tcxstrdel(log);
}
-void testQuery3() {
+void testQuery3(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
CU_ASSERT_TRUE(ejdbsetindex(contacts, "address.zip", JBIDXDROPALL));
tcxstrdel(log);
}
-void testQuery4() {
+void testQuery4(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
CU_ASSERT_TRUE(ejdbsetindex(contacts, "name", JBIDXDROPALL));
tcxstrdel(log);
}
-void testQuery5() {
-
+void testQuery5(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
bson bsq1;
ejdbquerydel(q1);
}
-void testQuery6() {
+void testQuery6(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
CU_ASSERT_TRUE(ejdbsetindex(contacts, "labels", JBIDXARR));
ejdbquerydel(q1);
}
-void testQuery7() {
+void testQuery7(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
ejdbquerydel(q1);
}
-void testQuery8() {
+void testQuery8(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
ejdbquerydel(q1);
}
-void testQuery9() {
+void testQuery9(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
CU_ASSERT_TRUE(ejdbsetindex(contacts, "labels", JBIDXDROPALL));
ejdbquerydel(q1);
}
-void testQuery10() {
+void testQuery10(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
CU_ASSERT_TRUE(ejdbsetindex(contacts, "address.street", JBIDXSTR));
ejdbquerydel(q1);
}
-void testQuery11() {
+void testQuery11(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
CU_ASSERT_TRUE(ejdbsetindex(contacts, "address.street", JBIDXDROPALL));
ejdbquerydel(q1);
}
-void testQuery12() {
+void testQuery12(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
ejdbquerydel(q1);
}
-void testQuery13() {
+void testQuery13(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
ejdbquerydel(q1);
}
-void testQuery14() {
+void testQuery14(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
CU_ASSERT_TRUE(ejdbsetindex(contacts, "drinks", JBIDXARR));
ejdbquerydel(q1);
}
-void testQuery15() {
+void testQuery15(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
CU_ASSERT_TRUE(ejdbsetindex(contacts, "dblscore", JBIDXNUM));
ejdbquerydel(q1);
}
-void testQuery16() {
+void testQuery16(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
CU_ASSERT_TRUE(ejdbsetindex(contacts, "dblscore", JBIDXDROPALL));
ejdbquerydel(q1);
}
-void testQuery17() {
+void testQuery17(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
CU_ASSERT_TRUE(ejdbsetindex(contacts, "dblscore", JBIDXNUM));
ejdbquerydel(q1);
}
-void testQuery18() {
+void testQuery18(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
CU_ASSERT_TRUE(ejdbsetindex(contacts, "name", JBIDXARR));
ejdbquerydel(q1);
}
-void testQuery19() {
+void testQuery19(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
CU_ASSERT_TRUE(ejdbsetindex(contacts, "name", JBIDXARR));
ejdbquerydel(q1);
}
-void testQuery20() {
+void testQuery20(void) {
//dblscore
//{'dblscore' : {'$gte' : 0.93}}
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
ejdbquerydel(q1);
}
-void testQuery21() {
+void testQuery21(void) {
//{'dblscore' : {'lte' : 0.93}}
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
ejdbquerydel(q1);
}
-void testQuery22() {
+void testQuery22(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
CU_ASSERT_TRUE(ejdbsetindex(contacts, "address.country", JBIDXSTR));
ejdbquerydel(q1);
}
-void testQuery23() {
+void testQuery23(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
ejdbquerydel(q1);
}
-void testQuery24() {
+void testQuery24(void) {
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
}
-void testQuery25() { //$or
+void testQuery25(void) { //$or
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
}
}
-void testQuery25_2() { //$or alternative
+void testQuery25_2(void) { //$or alternative
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
ejdbquerydel(q1);
}
-void testQuery26() { //$not $nin
+void testQuery26(void) { //$not $nin
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
ejdbquerydel(q1);
}
-void testQuery27() { //$exists
+void testQuery27(void) { //$exists
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
ejdbquerydel(q1);
}
-void testOIDSMatching() { //OID matching
+void testOIDSMatching(void) { //OID matching
EJCOLL *contacts = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(contacts);
ejdbquerydel(q1);
}
-void testEmptyFieldIndex() {
+void testEmptyFieldIndex(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
CU_ASSERT_TRUE(ejdbsetindex(coll, "name", JBIDXDROPALL));
CU_ASSERT_EQUAL(ejdbecode(coll->jb), 0);
}
-void testICaseIndex() {
+void testICaseIndex(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
CU_ASSERT_TRUE(ejdbsetindex(coll, "name", JBIDXISTR)); //Ignore case string index
ejdbquerydel(q1);
}
-void testTicket7() { //https://github.com/Softmotions/ejdb/issues/7
+void testTicket7(void) { //https://github.com/Softmotions/ejdb/issues/7
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
ejdbquerydel(q2);
}
-void testTicket8() { //https://github.com/Softmotions/ejdb/issues/8
+void testTicket8(void) { //https://github.com/Softmotions/ejdb/issues/8
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
}
-void testUpdate1() { //https://github.com/Softmotions/ejdb/issues/9
-
+void testUpdate1(void) { //https://github.com/Softmotions/ejdb/issues/9
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
}
-void testUpdate2() { //https://github.com/Softmotions/ejdb/issues/9
+void testUpdate2(void) { //https://github.com/Softmotions/ejdb/issues/9
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
CU_ASSERT_TRUE(ejdbsetindex(coll, "age", JBIDXNUM));
}
-void testUpdate3() {
+void testUpdate3(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
}
-void testTicket88() { //https://github.com/Softmotions/ejdb/issues/88
+void testTicket88(void) { //https://github.com/Softmotions/ejdb/issues/88
EJCOLL *ccoll = ejdbcreatecoll(jb, "ticket88", NULL);
CU_ASSERT_PTR_NOT_NULL(ccoll);
bson_destroy(&bsq2);
}
-void testTicket89() { //https://github.com/Softmotions/ejdb/issues/89
+void testTicket89(void) { //https://github.com/Softmotions/ejdb/issues/89
EJCOLL *ccoll = ejdbcreatecoll(jb, "ticket89", NULL);
CU_ASSERT_PTR_NOT_NULL(ccoll);
bson_destroy(&bsq1);
}
-void testQueryBool() {
+void testQueryBool(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
ejdbquerydel(q1);
}
-void testDropAll() {
+void testDropAll(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
CU_ASSERT_TRUE(ejdbsetindex(coll, "name", JBIDXSTR));
ejdbquerydel(q1);
}
-void testTokens$begin() {
+void testTokens$begin(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
CU_ASSERT_TRUE(ejdbsetindex(coll, "name", JBIDXSTR));
ejdbquerydel(q1);
}
-void testOneFieldManyConditions() {
+void testOneFieldManyConditions(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
ejdbquerydel(q1);
}
-void test$addToSet() {
+void test$addToSet(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
bson bsq1;
ejdbquerydel(q1);
}
-void test$pull() {
+void test$pull(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
bson bsq1;
ejdbquerydel(q1);
}
-void testFindInComplexArray() {
+void testFindInComplexArray(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
bson bsq1;
ejdbquerydel(q1);
}
-void test$elemMatch() {
+void test$elemMatch(void) {
// { complexarr: { $elemMatch: { key: 'title', value: 'some title' } } }
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
ejdbquerydel(q1);
}
-void test$not$elemMatch() {
+void test$not$elemMatch(void) {
// { complexarr: { $not: { $elemMatch: { key: 'title', value: 'some title' } } } }
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
ejdbquerydel(q1);
}
-void testTicket16() {
+void testTicket16(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "abcd", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
CU_ASSERT_EQUAL(coll->tdb->inum, 0);
CU_ASSERT_EQUAL(coll->tdb->inum, 0);
}
-void test$upsert() {
+void test$upsert(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "abcd", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
bson bsq1;
ejdbquerydel(q1);
}
-void testPrimitiveCases1() {
+void testPrimitiveCases1(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "abcd", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
bson bsq1;
ejdbquerydel(q1);
}
-void testTicket29() {
+void testTicket29(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
CU_ASSERT_TRUE(ejdbsetindex(coll, "name", JBIDXARR));
ejdbquerydel(q1);
}
-void testTicket28() {
+void testTicket28(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
//{$some:2}
tclistdel(q1res);
}
-void testTicket38() {
+void testTicket38(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "ticket38", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
tclistdel(q1res);
}
-void testTicket43() {
+void testTicket43(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "ticket43", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
tcxstrdel(log);
}
-void testTicket54() {
+void testTicket54(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "ticket54", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
bson b;
CU_ASSERT_TRUE(ejdbsetindex(coll, "value", JBIDXNUM));
}
-void testMetaInfo() {
+void testMetaInfo(void) {
bson *meta = ejdbmeta(jb);
CU_ASSERT_PTR_NOT_NULL_FATAL(meta);
const char *metabsdata = bson_data(meta);
bson_del(meta);
}
-void testTicket81() {
+void testTicket81(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "ticket81", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
// https://github.com/Softmotions/ejdb/issues/15
// http://docs.mongodb.org/manual/reference/projection/positional/#proj._S_
-void testDQprojection() {
+void testDQprojection(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "f_projection", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
bson_destroy(&bsq1);
}
-void testTicket96() {
+void testTicket96(void) {
EJCOLL *coll = ejdbgetcoll(jb, "f_projection");
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
// https://github.com/Softmotions/ejdb/issues/15
// http://docs.mongodb.org/manual/reference/projection/positional/#proj._S_
-void testDQupdate() {
+void testDQupdate(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "f_update", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
}
-void testDQupdate2() {
+void testDQupdate2(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "f_update", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
bson_destroy(&bsq1);
}
-void testTicket99() {
+void testTicket99(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "ticket99", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
}
-void testTicket101() {
+void testTicket101(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "ticket101", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
ejdbquerydel(q1);
}
-void testTicket110() {
+void testTicket110(void) {
EJCOLL *coll = ejdbcreatecoll(jb, "ticket110", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
ejdbquerydel(q1);
}
+// Ticket #14
+void testSlice(void) {
+ EJCOLL *coll = ejdbgetcoll(jb, "f_projection");
+ CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
+
+ bson_iterator it;
+
+// { z : 44, $do : { arr : {$slice : 1} } }
+ bson bsq;
+ bson_init_as_query(&bsq);
+ bson_append_int(&bsq, "z", 44);
+ bson_append_start_object(&bsq, "$do");
+ bson_append_start_object(&bsq, "arr");
+ bson_append_int(&bsq, "$slice", 1);
+ bson_append_finish_object(&bsq);
+ bson_append_finish_object(&bsq);
+ bson_finish(&bsq);
+ CU_ASSERT_FALSE_FATAL(bsq.err);
+
+ EJQ *q1 = ejdbcreatequery(jb, &bsq, NULL, 0, NULL);
+ CU_ASSERT_PTR_NOT_NULL_FATAL(q1);
+
+ uint32_t count = 0;
+ TCLIST *q1res = ejdbqryexecute(coll, q1, &count, 0, NULL);
+ //fprintf(stderr, "\n%s", TCXSTRPTR(log));
+ CU_ASSERT_EQUAL(TCLISTNUM(q1res), 1);
+ for (int i = 0; i < TCLISTNUM(q1res); ++i) {
+ void *bsdata = TCLISTVALPTR(q1res, i);
+ CU_ASSERT_PTR_NOT_NULL_FATAL(bsdata);
+ CU_ASSERT_FALSE(bson_compare_long(1, bsdata, "arr.0.h"));
+ bson_iterator_from_buffer(&it, bsdata);
+ CU_ASSERT_TRUE(bson_find_fieldpath_value("arr.1.h", &it) == BSON_EOO);
+ }
+ tclistdel(q1res);
+ bson_destroy(&bsq);
+ ejdbquerydel(q1);
+
+ // { z : 44, $do : { arr : {$slice : 2} } }
+ bson_init_as_query(&bsq);
+ bson_append_int(&bsq, "z", 44);
+ bson_append_start_object(&bsq, "$do");
+ bson_append_start_object(&bsq, "arr");
+ bson_append_int(&bsq, "$slice", 2);
+ bson_append_finish_object(&bsq);
+ bson_append_finish_object(&bsq);
+ bson_finish(&bsq);
+ CU_ASSERT_FALSE_FATAL(bsq.err);
+
+ q1 = ejdbcreatequery(jb, &bsq, NULL, 0, NULL);
+ CU_ASSERT_PTR_NOT_NULL_FATAL(q1);
+
+ count = 0;
+ q1res = ejdbqryexecute(coll, q1, &count, 0, NULL);
+ CU_ASSERT_EQUAL(TCLISTNUM(q1res), 1);
+ CU_ASSERT_EQUAL(count, 1);
+ for (int i = 0; i < TCLISTNUM(q1res); ++i) {
+ void *bsdata = TCLISTVALPTR(q1res, i);
+ CU_ASSERT_PTR_NOT_NULL_FATAL(bsdata);
+ CU_ASSERT_FALSE(bson_compare_long(1, bsdata, "arr.0.h"));
+ CU_ASSERT_FALSE(bson_compare_long(2, bsdata, "arr.1.h"));
+ bson_iterator_from_buffer(&it, bsdata);
+ CU_ASSERT_TRUE(bson_find_fieldpath_value("arr.2.h", &it) == BSON_EOO);
+ }
+ tclistdel(q1res);
+ bson_destroy(&bsq);
+ ejdbquerydel(q1);
+
+ // { $do : { arr : {$slice : [1, 2]} } }
+ bson_init_as_query(&bsq);
+ bson_append_start_object(&bsq, "$do");
+ bson_append_start_object(&bsq, "arr");
+ bson_append_start_array(&bsq, "$slice");
+ bson_append_int(&bsq, "0", 1);
+ bson_append_int(&bsq, "1", 2);
+ bson_append_finish_array(&bsq);
+ bson_append_finish_object(&bsq);
+ bson_append_finish_object(&bsq);
+ bson_finish(&bsq);
+ CU_ASSERT_FALSE_FATAL(bsq.err);
+
+ q1 = ejdbcreatequery(jb, &bsq, NULL, 0, NULL);
+ CU_ASSERT_PTR_NOT_NULL_FATAL(q1);
+
+ count = 0;
+ q1res = ejdbqryexecute(coll, q1, &count, 0, NULL);
+ CU_ASSERT_EQUAL(TCLISTNUM(q1res), 3);
+ CU_ASSERT_EQUAL(count, 3);
+ for (int i = 0; i < TCLISTNUM(q1res); ++i) {
+ void *bsdata = TCLISTVALPTR(q1res, i);
+ CU_ASSERT_PTR_NOT_NULL_FATAL(bsdata);
+ if (i == 0) {
+ CU_ASSERT_FALSE(bson_compare_long(1, bsdata, "arr.0"));
+ CU_ASSERT_FALSE(bson_compare_long(2, bsdata, "arr.1"));
+ bson_iterator_from_buffer(&it, bsdata);
+ CU_ASSERT_TRUE(bson_find_fieldpath_value("arr.2", &it) == BSON_EOO);
+ } else if (i == 1) {
+ CU_ASSERT_FALSE(bson_compare_long(2, bsdata, "arr.0"));
+ CU_ASSERT_FALSE(bson_compare_long(1, bsdata, "arr.1"));
+ bson_iterator_from_buffer(&it, bsdata);
+ CU_ASSERT_TRUE(bson_find_fieldpath_value("arr.2", &it) == BSON_EOO);
+ } else if (i == 2) {
+ CU_ASSERT_FALSE(bson_compare_long(2, bsdata, "arr.0.h"));
+ bson_iterator_from_buffer(&it, bsdata);
+ CU_ASSERT_TRUE(bson_find_fieldpath_value("arr.1", &it) == BSON_EOO);
+ }
+ }
+ tclistdel(q1res);
+ bson_destroy(&bsq);
+ ejdbquerydel(q1);
+
+
+
+//{ _id: '54d7a2f07e671e140000001f',
+// z: 33,
+// arr: [ 0, 1, 2, 3 ] }
+//{ _id: '54d7a2f07e671e1400000020',
+// z: 33,
+// arr: [ 3, 2, 1, 0 ] }
+//{ _id: '54d7a2f07e671e1400000021',
+// z: 44,
+// arr: [ { h: 1 }, { h: 2 } ] }
+
+ // { $do : { arr : {$slice : [-3, 1]} } }
+ bson_init_as_query(&bsq);
+ bson_append_start_object(&bsq, "$do");
+ bson_append_start_object(&bsq, "arr");
+ bson_append_start_array(&bsq, "$slice");
+ bson_append_int(&bsq, "0", -3);
+ bson_append_int(&bsq, "1", 1);
+ bson_append_finish_array(&bsq);
+ bson_append_finish_object(&bsq);
+ bson_append_finish_object(&bsq);
+ bson_finish(&bsq);
+ CU_ASSERT_FALSE_FATAL(bsq.err);
+
+ q1 = ejdbcreatequery(jb, &bsq, NULL, 0, NULL);
+ CU_ASSERT_PTR_NOT_NULL_FATAL(q1);
+
+ count = 0;
+ q1res = ejdbqryexecute(coll, q1, &count, 0, NULL);
+ CU_ASSERT_EQUAL(TCLISTNUM(q1res), 3);
+ CU_ASSERT_EQUAL(count, 3);
+ for (int i = 0; i < TCLISTNUM(q1res); ++i) {
+ void *bsdata = TCLISTVALPTR(q1res, i);
+ CU_ASSERT_PTR_NOT_NULL_FATAL(bsdata);
+ if (i == 0) {
+ CU_ASSERT_FALSE(bson_compare_long(1, bsdata, "arr.0"));
+ bson_iterator_from_buffer(&it, bsdata);
+ CU_ASSERT_TRUE(bson_find_fieldpath_value("arr.1", &it) == BSON_EOO);
+ } else if (i == 1) {
+ CU_ASSERT_FALSE(bson_compare_long(2, bsdata, "arr.0"));
+ bson_iterator_from_buffer(&it, bsdata);
+ CU_ASSERT_TRUE(bson_find_fieldpath_value("arr.1", &it) == BSON_EOO);
+ } else if (i == 2) {
+ CU_ASSERT_FALSE(bson_compare_long(2, bsdata, "arr.0.h"));
+ bson_iterator_from_buffer(&it, bsdata);
+ CU_ASSERT_TRUE(bson_find_fieldpath_value("arr.1", &it) == BSON_EOO);
+ }
+ }
+ tclistdel(q1res);
+ bson_destroy(&bsq);
+ ejdbquerydel(q1);
+}
+
+
int main() {
setlocale(LC_ALL, "en_US.UTF-8");
(NULL == CU_add_test(pSuite, "testTicket99", testTicket99)) ||
(NULL == CU_add_test(pSuite, "testTicket101", testTicket101)) ||
(NULL == CU_add_test(pSuite, "testTicket110", testTicket110)) ||
+ (NULL == CU_add_test(pSuite, "testSlice", testSlice)) ||
(NULL == CU_add_test(pSuite, "testMetaInfo", testMetaInfo))
) {