use of com.mysql.cj.xdevapi.DbDoc in project aws-mysql-jdbc by awslabs.
the class CollectionFindTest method getOne.
@Test
public void getOne() {
if (!mysqlVersionMeetsMinimum(ServerVersion.parseVersion("8.0.5"))) {
this.collection.add("{\"_id\": \"1\", \"a\":1}").execute();
this.collection.add("{\"_id\": \"2\", \"a\":2}").execute();
} else {
this.collection.add("{\"a\":1}").execute();
this.collection.add("{\"a\":2}").execute();
}
this.collection.add("{\"_id\":\"existingId\",\"a\":3}").execute();
DbDoc doc = this.collection.getOne("existingId");
assertNotNull(doc);
assertEquals(new Integer(3), ((JsonNumber) doc.get("a")).getInteger());
doc = this.collection.getOne("NotExistingId");
assertNull(doc);
doc = this.collection.getOne(null);
assertNull(doc);
}
use of com.mysql.cj.xdevapi.DbDoc in project aws-mysql-jdbc by awslabs.
the class CollectionFindTest method testCollectionFindInValidFunction.
@Test
public void testCollectionFindInValidFunction() throws Exception {
assumeTrue(mysqlVersionMeetsMinimum(ServerVersion.parseVersion("8.0.0")), "MySQL 8.0+ is required to run this test.");
DbDoc doc = null;
DocResult docs = null;
this.collection.add("{\"_id\": \"1001\", \"ARR\":[1,1,2], \"ARR1\":[\"name1\", \"name2\", \"name3\"]}").execute();
this.collection.add("{\"_id\": \"1002\", \"ARR\":[1,2,3], \"ARR1\":[\"name4\", \"name5\", \"name6\"]}").execute();
this.collection.add("{\"_id\": \"1003\", \"ARR\":[1,4,5], \"ARR1\":[\"name1\", \"name1\", \"name5\"]}").execute();
docs = this.collection.find("[1,1,3] in $.ARR").execute();
doc = docs.next();
assertEquals("1002", (((JsonString) doc.get("_id")).getString()));
assertFalse(docs.hasNext());
docs = this.collection.find("[2,5] in $.ARR").execute();
assertFalse(docs.hasNext());
docs = this.collection.find("(1+2) in (1, 2, 3)").execute();
doc = docs.next();
docs = this.collection.find("concat('name', '6') in ('name1', 'name2', 'name6')").execute();
doc = docs.next();
Table tabNew = this.schema.getCollectionAsTable(this.collectionName);
RowResult rows = tabNew.select("doc->$._id as _id").where("(1+2) in (1, 2, 3)").execute();
rows.next();
assertThrows(XProtocolError.class, "ERROR 5154 \\(HY000\\) CONT_IN expression requires operator that produce a JSON value\\.", () -> tabNew.select("doc->$._id as _id").where("(1+2) in [1, 2, 3]").execute());
assertThrows(XProtocolError.class, "ERROR 5154 \\(HY000\\) CONT_IN expression requires operator that produce a JSON value\\.", () -> tabNew.select("doc->$._id as _id").where("(1+2) in doc->$.ARR").execute());
assertThrows(XProtocolError.class, "ERROR 5154 \\(HY000\\) CONT_IN expression requires function that produce a JSON value\\.", () -> this.collection.find("concat('name', '6') in ['name1', 'name2', 'name6']").execute());
assertThrows(XProtocolError.class, "ERROR 5154 \\(HY000\\) CONT_IN expression requires operator that produce a JSON value\\.", () -> this.collection.find("(1+2) in $.ARR").execute());
assertThrows(XProtocolError.class, "ERROR 5154 \\(HY000\\) CONT_IN expression requires function that produce a JSON value\\.", () -> this.collection.find("concat('name', '6') in $.ARR1").execute());
}
use of com.mysql.cj.xdevapi.DbDoc in project aws-mysql-jdbc by awslabs.
the class CollectionFindTest method testCollectionFindInInvalid.
@Test
public void testCollectionFindInInvalid() throws Exception {
assumeTrue(mysqlVersionMeetsMinimum(ServerVersion.parseVersion("8.0.0")), "MySQL 8.0+ is required to run this test.");
int i = 0, j = 0, maxrec = 8, minArraySize = 3;
DocResult docs = null;
String json = "";
for (i = 0; i < maxrec; i++) {
DbDoc newDoc2 = new DbDocImpl();
newDoc2.add("_id", new JsonString().setValue(String.valueOf(i + 1000)));
newDoc2.add("F1", new JsonNumber().setValue(String.valueOf(i + 1)));
JsonArray jarray = new JsonArray();
for (j = 0; j < (minArraySize + i); j++) {
jarray.addValue(new JsonString().setValue("Field-1-Data-" + i));
}
newDoc2.add("ARR1", jarray);
this.collection.add(newDoc2).execute();
newDoc2 = null;
jarray = null;
}
assertEquals((maxrec), this.collection.count());
/* add(DbDoc[] docs) */
DbDoc[] jsonlist = new DbDocImpl[maxrec];
for (i = 0; i < maxrec; i++) {
DbDoc newDoc2 = new DbDocImpl();
newDoc2.add("_id", new JsonString().setValue(String.valueOf(i + 1100)));
newDoc2.add("ARR1", new JsonString().setValue("Field-1-Data-" + i));
newDoc2.add("F2", new JsonString().setValue("10-15-201" + i));
jsonlist[i] = newDoc2;
newDoc2 = null;
}
this.collection.add(jsonlist).execute();
json = "{\"_id\":\"1201\",\"XYZ\":2222, \"DATAX\":{\"D1\":1, \"D2\":2, \"D3\":3}}";
this.collection.add(json).execute();
/* find with invalid IN in document */
try {
docs = this.collection.find("{\"D1\":3, \"D2\":2, \"D3\":3} in $.DATAX").execute();
assertFalse(docs.hasNext());
} catch (XProtocolError Ex) {
Ex.printStackTrace();
if (Ex.getErrorCode() != MysqlErrorNumbers.ER_BAD_NULL_ERROR) {
throw Ex;
}
}
/* find with IN that does not match */
docs = this.collection.find("\"2222\" in $.XYZ").execute();
assertFalse(docs.hasNext());
/* find with NULL IN */
docs = this.collection.find("NULL in $.ARR1").execute();
assertFalse(docs.hasNext());
/* find with NULL IN */
docs = this.collection.find("NULL in $.DATAX").execute();
assertFalse(docs.hasNext());
/* find with IN for non existant key */
docs = this.collection.find("\"ABC\" in $.nonexistant").execute();
assertFalse(docs.hasNext());
}
use of com.mysql.cj.xdevapi.DbDoc in project aws-mysql-jdbc by awslabs.
the class CollectionFindTest method testProjection.
@Test
public void testProjection() {
// TODO: the "1" is coming back from the server as a string. checking with xplugin team if this is ok
this.collection.add("{\"_id\":\"the_id\",\"g\":1}").execute();
DocResult docs = this.collection.find().fields("$._id as _id, $.g as g, 1 + 1 as q").execute();
DbDoc doc = docs.next();
assertEquals("the_id", ((JsonString) doc.get("_id")).getString());
assertEquals(new Integer(1), ((JsonNumber) doc.get("g")).getInteger());
assertEquals(new Integer(2), ((JsonNumber) doc.get("q")).getInteger());
// multiple projection strings
docs = this.collection.find().fields("$._id as _id", "$.g as g", "1 + 1 as q").execute();
doc = docs.next();
assertEquals("the_id", ((JsonString) doc.get("_id")).getString());
assertEquals(new Integer(1), ((JsonNumber) doc.get("g")).getInteger());
assertEquals(new Integer(2), ((JsonNumber) doc.get("q")).getInteger());
}
use of com.mysql.cj.xdevapi.DbDoc in project aws-mysql-jdbc by awslabs.
the class CollectionFindTest method testCollectionFindInSanity.
@Test
public void testCollectionFindInSanity() throws Exception {
assumeTrue(mysqlVersionMeetsMinimum(ServerVersion.parseVersion("8.0.0")), "MySQL 8.0+ is required to run this test.");
int i = 0, maxrec = 10;
DbDoc doc = null;
DocResult docs = null;
DbDoc[] jsonlist = new DbDocImpl[maxrec];
for (i = 0; i < maxrec; i++) {
DbDoc newDoc2 = new DbDocImpl();
newDoc2.add("_id", new JsonString().setValue(String.valueOf(i + 1000)));
newDoc2.add("F1", new JsonString().setValue("Field-1-Data-" + i));
newDoc2.add("F2", new JsonNumber().setValue(String.valueOf(10 * (i + 1) + 0.1234)));
newDoc2.add("F3", new JsonNumber().setValue(String.valueOf(i + 1)));
newDoc2.add("F4", new JsonNumber().setValue(String.valueOf(10000 - i)));
jsonlist[i] = newDoc2;
newDoc2 = null;
}
this.collection.add(jsonlist).execute();
assertEquals((maxrec), this.collection.count());
/* find without Condition */
docs = this.collection.find().fields("$._id as _id, $.F1 as f1, $.F2 as f2, $.F3 as f3,$.F2/10 as tmp1,1/2 as tmp2").orderBy("$.F3").execute();
i = 0;
while (docs.hasNext()) {
doc = docs.next();
i++;
}
assertEquals((maxrec), i);
/* find with single element IN which uses json_contains */
docs = this.collection.find("'1001' in $._id").execute();
doc = docs.next();
assertEquals("1001", (((JsonString) doc.get("_id")).getString()));
assertFalse(docs.hasNext());
/* find with multiple IN which uses json_contains */
String findCond = "";
for (i = 1; i < maxrec; i++) {
findCond = findCond + "'";
findCond = findCond + String.valueOf(i + 1000) + "' not in $._id";
if (i != maxrec - 1) {
findCond = findCond + " and ";
}
}
docs = this.collection.find(findCond).execute();
doc = docs.next();
assertEquals("1000", (((JsonString) doc.get("_id")).getString()));
assertFalse(docs.hasNext());
/* find with single IN for string with orderBy */
docs = this.collection.find("'Field-1-Data-2' in $.F1").orderBy("CAST($.F4 as SIGNED)").execute();
doc = docs.next();
assertEquals(String.valueOf(1002), (((JsonString) doc.get("_id")).getString()));
assertFalse(docs.hasNext());
/* find with single IN for numeric with orderBy */
docs = this.collection.find("10000 in $.F4").orderBy("CAST($.F4 as SIGNED)").execute();
doc = docs.next();
assertEquals(String.valueOf(1000), (((JsonString) doc.get("_id")).getString()));
assertFalse(docs.hasNext());
/* find with single IN for float with orderBy */
docs = this.collection.find("20.1234 in $.F2").orderBy("CAST($.F4 as SIGNED)").execute();
doc = docs.next();
assertEquals(String.valueOf(1001), (((JsonString) doc.get("_id")).getString()));
assertFalse(docs.hasNext());
/* Testing with table */
Table table = this.schema.getCollectionAsTable(this.collectionName);
/* find with single IN for string */
RowResult rows = table.select("doc->$._id as _id").where("'1001' in doc->$._id").execute();
Row r = rows.next();
assertEquals(r.getString("_id"), "\"1001\"");
assertFalse(rows.hasNext());
/* find with multiple IN in single select */
findCond = "";
for (i = 1; i < maxrec; i++) {
findCond = findCond + "'";
findCond = findCond + String.valueOf(i + 1000) + "' not in doc->$._id";
if (i != maxrec - 1) {
findCond = findCond + " and ";
}
}
/* find with single IN for string */
rows = table.select("doc->$._id as _id").where(findCond).execute();
r = rows.next();
assertEquals(r.getString("_id"), "\"1000\"");
assertFalse(rows.hasNext());
/* find with single IN for float */
rows = table.select("doc->$._id as _id").where("20.1234 in doc->$.F2").execute();
r = rows.next();
assertEquals(r.getString("_id"), "\"1001\"");
assertFalse(rows.hasNext());
/* find with single IN for string */
rows = table.select("doc->$._id as _id").where("'Field-1-Data-2' in doc->$.F1").execute();
r = rows.next();
assertEquals(r.getString("_id"), "\"1002\"");
assertFalse(rows.hasNext());
/* find with single IN for numeric */
rows = table.select("doc->$._id as _id").where("10000 in doc->$.F4").execute();
r = rows.next();
assertEquals(r.getString("_id"), "\"1000\"");
assertFalse(rows.hasNext());
}
Aggregations