Search in sources :

Example 21 with DbDoc

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);
}
Also used : DbDoc(com.mysql.cj.xdevapi.DbDoc) Test(org.junit.jupiter.api.Test)

Example 22 with DbDoc

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());
}
Also used : DbDoc(com.mysql.cj.xdevapi.DbDoc) RowResult(com.mysql.cj.xdevapi.RowResult) Table(com.mysql.cj.xdevapi.Table) JsonString(com.mysql.cj.xdevapi.JsonString) DocResult(com.mysql.cj.xdevapi.DocResult) Test(org.junit.jupiter.api.Test)

Example 23 with DbDoc

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());
}
Also used : JsonArray(com.mysql.cj.xdevapi.JsonArray) DbDoc(com.mysql.cj.xdevapi.DbDoc) DbDocImpl(com.mysql.cj.xdevapi.DbDocImpl) XProtocolError(com.mysql.cj.protocol.x.XProtocolError) JsonNumber(com.mysql.cj.xdevapi.JsonNumber) JsonString(com.mysql.cj.xdevapi.JsonString) JsonString(com.mysql.cj.xdevapi.JsonString) DocResult(com.mysql.cj.xdevapi.DocResult) Test(org.junit.jupiter.api.Test)

Example 24 with DbDoc

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());
}
Also used : DbDoc(com.mysql.cj.xdevapi.DbDoc) DocResult(com.mysql.cj.xdevapi.DocResult) Test(org.junit.jupiter.api.Test)

Example 25 with DbDoc

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());
}
Also used : DbDoc(com.mysql.cj.xdevapi.DbDoc) RowResult(com.mysql.cj.xdevapi.RowResult) DbDocImpl(com.mysql.cj.xdevapi.DbDocImpl) Table(com.mysql.cj.xdevapi.Table) JsonNumber(com.mysql.cj.xdevapi.JsonNumber) JsonString(com.mysql.cj.xdevapi.JsonString) JsonString(com.mysql.cj.xdevapi.JsonString) Row(com.mysql.cj.xdevapi.Row) DocResult(com.mysql.cj.xdevapi.DocResult) Test(org.junit.jupiter.api.Test)

Aggregations

DbDoc (com.mysql.cj.xdevapi.DbDoc)99 Test (org.junit.jupiter.api.Test)98 DocResult (com.mysql.cj.xdevapi.DocResult)87 JsonString (com.mysql.cj.xdevapi.JsonString)81 DbDocImpl (com.mysql.cj.xdevapi.DbDocImpl)56 JsonNumber (com.mysql.cj.xdevapi.JsonNumber)56 AddResult (com.mysql.cj.xdevapi.AddResult)36 Result (com.mysql.cj.xdevapi.Result)21 JsonArray (com.mysql.cj.xdevapi.JsonArray)18 RowResult (com.mysql.cj.xdevapi.RowResult)14 Table (com.mysql.cj.xdevapi.Table)12 Row (com.mysql.cj.xdevapi.Row)11 Collection (com.mysql.cj.xdevapi.Collection)10 Session (com.mysql.cj.xdevapi.Session)10 SqlResult (com.mysql.cj.xdevapi.SqlResult)9 BigDecimal (java.math.BigDecimal)9 ExecutionException (java.util.concurrent.ExecutionException)9 CompletableFuture (java.util.concurrent.CompletableFuture)6 SessionFactory (com.mysql.cj.xdevapi.SessionFactory)5 ArrayList (java.util.ArrayList)5