return (BSON_VCMD_SKIP_AFTER);
}
if (bt == BSON_ARRAY) {
+ if (after) {
+ bson_append_finish_array(ctx->bsout);
+ return (BSON_VCMD_OK);
+ }
bson_iterator_from_buffer(&mit, ctx->mbuf);
bt = bson_find_fieldpath_value2(fpath, fpathlen, &mit);
- if (bt == BSON_EOO || (ctx->expandall && bt != BSON_ARRAY)) {
+ if (bt == BSON_EOO) {
+ bson_append_start_array(ctx->bsout, key);
+ return (BSON_VCMD_OK);
+ }
+ if (ctx->expandall && bt != BSON_ARRAY) {
bson_append_field_from_iterator(it, ctx->bsout);
return (BSON_VCMD_SKIP_NESTED | BSON_VCMD_SKIP_AFTER);
}
}
bson_iterator_from_buffer(&it, inbuf);
if (pull) {
- bson_visit_fields(&it, BSON_TRAVERSE_ARRAYS_EXCLUDED, bson_merge_array_sets_pull_tf, &ctx);
+ bson_visit_fields(&it, 0, bson_merge_array_sets_pull_tf, &ctx);
} else {
- bson_visit_fields(&it, BSON_TRAVERSE_ARRAYS_EXCLUDED, bson_merge_array_sets_tf, &ctx);
+ bson_visit_fields(&it, 0, bson_merge_array_sets_tf, &ctx);
}
if (ctx.mfields == 0 || pull) {
return ctx.ecode;
bson r;
bson_oid_t oid;
- for (int i = 0; i < 1000; ++i) {
+ for (int i = 0; i < 10; ++i) {
bson_init(&r);
bson_append_start_array(&r, "arr1");
bson_append_start_object(&r, "0");
uint32_t count = 0;
ejdbqryexecute(ccoll, q1, &count, JBQRYCOUNT, NULL);
CU_ASSERT_TRUE(ejdbecode(jb) == 0);
- CU_ASSERT_EQUAL(count, 1000);
+ CU_ASSERT_EQUAL(count, 10);
ejdbquerydel(q1);
bson_destroy(&bsq1);
bson_finish(&bsq2);
q1 = ejdbcreatequery(jb, &bsq2, NULL, 0, NULL);
ejdbqryexecute(ccoll, q1, &count, JBQRYCOUNT, NULL);
- CU_ASSERT_EQUAL(count, 1000);
+ CU_ASSERT_EQUAL(count, 10);
ejdbquerydel(q1);
bson_destroy(&bsq2);
}
+void testTicket89() { //https://github.com/Softmotions/ejdb/issues/89
+ EJCOLL *ccoll = ejdbcreatecoll(jb, "ticket89", NULL);
+ CU_ASSERT_PTR_NOT_NULL(ccoll);
+
+ bson r;
+ bson_oid_t oid;
+
+ bson_init(&r);
+ //{"test":[["aaa"],["bbb"]]}
+ bson_append_start_array(&r, "test");
+ bson_append_start_array(&r, "0");
+ bson_append_string(&r, "0", "aaa");
+ bson_append_finish_array(&r);
+ bson_append_start_array(&r, "1");
+ bson_append_string(&r, "0", "bbb");
+ bson_append_finish_array(&r);
+ bson_append_finish_array(&r);
+ bson_finish(&r);
+ CU_ASSERT_TRUE(ejdbsavebson(ccoll, &r, &oid));
+ bson_destroy(&r);
+
+ bson bsq1;
+ bson_init_as_query(&bsq1);
+ bson_append_start_object(&bsq1, "$addToSet");
+ bson_append_string(&bsq1, "test.0", "bbb");
+ bson_append_finish_object(&bsq1);
+ bson_finish(&bsq1);
+
+ EJQ *q1 = ejdbcreatequery(jb, &bsq1, NULL, 0, NULL);
+ CU_ASSERT_PTR_NOT_NULL_FATAL(q1);
+ uint32_t count = 0;
+ ejdbqryexecute(ccoll, q1, &count, JBQRYCOUNT, NULL);
+ CU_ASSERT_TRUE(ejdbecode(jb) == 0);
+ CU_ASSERT_EQUAL(count, 1);
+ ejdbquerydel(q1);
+ bson_destroy(&bsq1);
+
+ bson_init_as_query(&bsq1);
+ bson_append_string(&bsq1, "test.0.1", "bbb");
+ bson_finish(&bsq1);
+ q1 = ejdbcreatequery(jb, &bsq1, NULL, 0, NULL);
+ CU_ASSERT_PTR_NOT_NULL_FATAL(q1);
+ ejdbqryexecute(ccoll, q1, &count, JBQRYCOUNT, NULL);
+ CU_ASSERT_TRUE(ejdbecode(jb) == 0);
+ CU_ASSERT_EQUAL(count, 1);
+ ejdbquerydel(q1);
+ bson_destroy(&bsq1);
+}
+
void testQueryBool() {
EJCOLL *coll = ejdbcreatecoll(jb, "contacts", NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(coll);
(NULL == CU_add_test(pSuite, "testUpdate1", testUpdate1)) ||
(NULL == CU_add_test(pSuite, "testUpdate2", testUpdate2)) ||
(NULL == CU_add_test(pSuite, "testTicket88", testTicket88)) ||
+ (NULL == CU_add_test(pSuite, "testTicket89", testTicket89)) ||
(NULL == CU_add_test(pSuite, "testQueryBool", testQueryBool)) ||
(NULL == CU_add_test(pSuite, "testDropAll", testDropAll)) ||
(NULL == CU_add_test(pSuite, "testTokens$begin", testTokens$begin)) ||