Search in sources :

Example 1 with DbDocImpl

use of com.mysql.cj.xdevapi.DbDocImpl in project aws-mysql-jdbc by awslabs.

the class DevApiSample method documentWalkthrough.

public static void documentWalkthrough(Schema schema) {
    // document walthrough
    Collection coll = schema.createCollection("myBooks", /* reuseExisting? */
    true);
    DbDoc newDoc = new DbDocImpl().add("isbn", new JsonString().setValue("12345"));
    newDoc.add("title", new JsonString().setValue("Effi Briest"));
    newDoc.add("author", new JsonString().setValue("Theodor Fontane"));
    newDoc.add("currentlyReadingPage", new JsonNumber().setValue(String.valueOf(42)));
    coll.add(newDoc).execute();
    // note: "$" prefix for document paths is optional. "$.title.somethingElse[0]" is the same as "title.somethingElse[0]" in document expressions
    DocResult docs = coll.find("$.title = 'Effi Briest' and $.currentlyReadingPage > 10").execute();
    DbDoc book = docs.next();
    System.err.println("Currently reading " + ((JsonString) book.get("title")).getString() + " on page " + ((JsonNumber) book.get("currentlyReadingPage")).getInteger());
    // increment the page number and fetch it again
    coll.modify("$.isbn = 12345").set("$.currentlyReadingPage", ((JsonNumber) book.get("currentlyReadingPage")).getInteger() + 1).execute();
    docs = coll.find("$.title = 'Effi Briest' and $.currentlyReadingPage > 10").execute();
    book = docs.next();
    System.err.println("Currently reading " + ((JsonString) book.get("title")).getString() + " on page " + ((JsonNumber) book.get("currentlyReadingPage")).getInteger());
    // remove the doc
    coll.remove("true").execute();
    System.err.println("Number of books in collection: " + coll.count());
    schema.dropCollection(coll.getName());
}
Also used : DbDoc(com.mysql.cj.xdevapi.DbDoc) DbDocImpl(com.mysql.cj.xdevapi.DbDocImpl) JsonNumber(com.mysql.cj.xdevapi.JsonNumber) Collection(com.mysql.cj.xdevapi.Collection) JsonString(com.mysql.cj.xdevapi.JsonString) DocResult(com.mysql.cj.xdevapi.DocResult)

Example 2 with DbDocImpl

use of com.mysql.cj.xdevapi.DbDocImpl in project aws-mysql-jdbc by awslabs.

the class RowLockingTest method testSelectRowLockingValid.

@Test
public void testSelectRowLockingValid() throws Exception {
    assumeTrue(mysqlVersionMeetsMinimum(ServerVersion.parseVersion("8.0.0")), "MySQL 8.0+ is required to run this test.");
    int i = 0;
    try {
        /* add(DbDoc[] docs) */
        DbDoc[] jsonlist = new DbDocImpl[10];
        for (i = 1; i <= 10; i++) {
            DbDoc newDoc2 = new DbDocImpl();
            newDoc2.add("F1", new JsonNumber().setValue(String.valueOf(i)));
            newDoc2.add("F2", new JsonString().setValue("Field-1-Data-" + i));
            newDoc2.add("F3", new JsonNumber().setValue(String.valueOf(10 * (i) + 0.1234)));
            jsonlist[i - 1] = newDoc2;
            newDoc2 = null;
        }
        this.collection.add(jsonlist).execute();
        assertEquals((10), this.collection.count());
        this.CheckFlag = 0;
        initException = new Throwable[2];
        SelectRowLock[] Thrd = new SelectRowLock[2];
        /* Two threads with same conditions, select for update in one and update in second */
        Thrd[0] = new SelectRowLock(1, 1, 0, 5, "doc->$.F1 = :bVal");
        Thrd[0].setUncaughtExceptionHandler(new MyUncaughtExceptionHandler(0));
        Thrd[0].start();
        Thrd[1] = new SelectRowLock(3, 0, 1, 5, "doc->$.F1 = :bVal");
        Thrd[1].setUncaughtExceptionHandler(new MyUncaughtExceptionHandler(1));
        Thrd[1].start();
        for (i = 0; i < 2; i++) {
            Thrd[i].join();
        }
        for (i = 0; i < 2; i++) {
            if (initException[i] != null) {
                throw new RuntimeException(initException[i]);
            }
        }
        /* Two threads with same conditions, select for share in one and update in second */
        this.CheckFlag = 0;
        initException = new Throwable[2];
        Thrd[0] = new SelectRowLock(1, 2, 0, 5, "doc->$.F1 = :bVal");
        Thrd[0].setUncaughtExceptionHandler(new MyUncaughtExceptionHandler(0));
        Thrd[0].start();
        Thrd[1] = new SelectRowLock(3, 0, 1, 5, "doc->$.F1 = :bVal");
        Thrd[1].setUncaughtExceptionHandler(new MyUncaughtExceptionHandler(1));
        Thrd[1].start();
        for (i = 0; i < 2; i++) {
            Thrd[i].join();
        }
        for (i = 0; i < 2; i++) {
            if (initException[i] != null) {
                throw new RuntimeException(initException[i]);
            }
        }
        /* Two threads with same conditions, select for update in one and update in second */
        this.CheckFlag = 0;
        initException = new Throwable[2];
        Thrd[0] = new SelectRowLock(2, 1, 0, 5, "doc->$.F1 = :bVal");
        Thrd[0].setUncaughtExceptionHandler(new MyUncaughtExceptionHandler(0));
        Thrd[0].start();
        Thrd[1] = new SelectRowLock(3, 0, 1, 5, "doc->$.F1 = :bVal");
        Thrd[1].setUncaughtExceptionHandler(new MyUncaughtExceptionHandler(1));
        Thrd[1].start();
        for (i = 0; i < 2; i++) {
            Thrd[i].join();
        }
        for (i = 0; i < 2; i++) {
            if (initException[i] != null) {
                throw new RuntimeException(initException[i]);
            }
        }
        /* Two threads with same conditions, select for share in one and update in second */
        this.CheckFlag = 0;
        initException = new Throwable[2];
        Thrd[0] = new SelectRowLock(2, 2, 0, 5, "doc->$.F1 = :bVal");
        Thrd[0].setUncaughtExceptionHandler(new MyUncaughtExceptionHandler(0));
        Thrd[0].start();
        Thrd[1] = new SelectRowLock(3, 0, 1, 5, "doc->$.F1 = :bVal");
        Thrd[1].setUncaughtExceptionHandler(new MyUncaughtExceptionHandler(1));
        Thrd[1].start();
        for (i = 0; i < 2; i++) {
            Thrd[i].join();
        }
        for (i = 0; i < 2; i++) {
            if (initException[i] != null) {
                throw new RuntimeException(initException[i]);
            }
        }
        /* Two threads with same conditions selecting multiple records, select for update in one and update in second */
        this.CheckFlag = 0;
        initException = new Throwable[2];
        Thrd[0] = new SelectRowLock(2, 2, 0, 5, "doc->$.F1 < :bVal");
        Thrd[0].setUncaughtExceptionHandler(new MyUncaughtExceptionHandler(0));
        Thrd[0].start();
        Thrd[1] = new SelectRowLock(3, 0, 1, 5, "doc->$.F1 < :bVal");
        Thrd[1].setUncaughtExceptionHandler(new MyUncaughtExceptionHandler(1));
        Thrd[1].start();
        for (i = 0; i < 2; i++) {
            Thrd[i].join();
        }
        for (i = 0; i < 2; i++) {
            if (initException[i] != null) {
                throw new RuntimeException(initException[i]);
            }
        }
        /* Two threads with same conditions selecting multiple records, select for share in one and update in second */
        this.CheckFlag = 0;
        initException = new Throwable[2];
        Thrd[0] = new SelectRowLock(2, 1, 0, 5, "doc->$.F1 < :bVal");
        Thrd[0].setUncaughtExceptionHandler(new MyUncaughtExceptionHandler(0));
        Thrd[0].start();
        Thrd[1] = new SelectRowLock(3, 0, 1, 5, "doc->$.F1 < :bVal");
        Thrd[1].setUncaughtExceptionHandler(new MyUncaughtExceptionHandler(1));
        Thrd[1].start();
        for (i = 0; i < 2; i++) {
            Thrd[i].join();
        }
        for (i = 0; i < 2; i++) {
            if (initException[i] != null) {
                throw new RuntimeException(initException[i]);
            }
        }
    } catch (RuntimeException e) {
        System.out.print("**************RuntimeException: " + i);
        System.out.println(e.getMessage());
        throw e;
    } catch (InterruptedException e) {
        System.out.print("InterruptedException: " + i);
        System.out.println(e.getMessage());
        throw e;
    }
}
Also used : DbDoc(com.mysql.cj.xdevapi.DbDoc) DbDocImpl(com.mysql.cj.xdevapi.DbDocImpl) JsonNumber(com.mysql.cj.xdevapi.JsonNumber) JsonString(com.mysql.cj.xdevapi.JsonString) Test(org.junit.jupiter.api.Test)

Example 3 with DbDocImpl

use of com.mysql.cj.xdevapi.DbDocImpl in project aws-mysql-jdbc by awslabs.

the class CollectionAddTest method testCollectionAddBigKeyData.

@Test
public void testCollectionAddBigKeyData() throws Exception {
    int i = 0, j = 0;
    int maxkey = 10;
    int maxrec = 5;
    int keylen = (10);
    int datalen = (1 * 5);
    String key_sub = buildString(keylen, 'X');
    String data_sub = buildString(datalen, 'X');
    /* Insert maxrec records with maxkey (key,value) pairs with key length=keylen and datalength=datalen */
    String key, data, query;
    for (i = 0; i < maxrec; i++) {
        DbDoc newDoc = new DbDocImpl();
        newDoc.add("_id", new JsonNumber().setValue(String.valueOf(i)));
        for (j = 0; j < maxkey; j++) {
            key = key_sub + j;
            data = data_sub + j;
            newDoc.add(key, new JsonString().setValue(data));
        }
        this.collection.add(newDoc).execute();
        newDoc = null;
    }
    assertEquals((maxrec), this.collection.count());
    /* Fetch all keys */
    query = "$._id as _id";
    for (j = 0; j < maxkey; j++) {
        key = key_sub + j;
        query = query + ",$." + key + " as " + key;
    }
    DocResult docs = this.collection.find().orderBy("$._id").fields(query).execute();
    DbDoc doc = null;
    i = 0;
    while (docs.hasNext()) {
        doc = docs.next();
        for (j = 0; j < maxkey; j++) {
            key = key_sub + j;
            data = data_sub + j;
            assertEquals((data), ((JsonString) doc.get(key)).getString());
        }
        i++;
    }
    assertEquals((maxrec), i);
}
Also used : DbDoc(com.mysql.cj.xdevapi.DbDoc) DbDocImpl(com.mysql.cj.xdevapi.DbDocImpl) 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 4 with DbDocImpl

use of com.mysql.cj.xdevapi.DbDocImpl in project aws-mysql-jdbc by awslabs.

the class CollectionAddTest method testGetGeneratedIds.

@Test
public void testGetGeneratedIds() throws Exception {
    assumeTrue(mysqlVersionMeetsMinimum(ServerVersion.parseVersion("8.0.0")), "MySQL 8.0+ is required to run this test.");
    AddResult res = null;
    DbDoc doc = null;
    DocResult docs = null;
    int i = 0;
    // One record using String
    String json = "{\"FLD1\":\"Data1\"}";
    res = this.collection.add(json).execute();
    List<String> docIds = res.getGeneratedIds();
    assertTrue(docIds.get(0).matches("[a-f0-9]{28}"));
    assertEquals(1, this.collection.count());
    assertEquals(1, docIds.size());
    // More than One record using String
    json = "{\"FLD1\":\"Data2\"}";
    res = this.collection.add(json).add("{}").add("{\"_id\":\"id1\"}").add("{\"FLD1\":\"Data3\"}").execute();
    docIds = res.getGeneratedIds();
    assertEquals(5, this.collection.count());
    assertEquals(3, docIds.size());
    // More than One record using String, and single add()
    json = "{\"FLD1\":\"Data15\"}";
    res = this.collection.add(json, "{}", "{\"_id\":\"id2\"}", "{\"FLD1\":\"Data16\"}").execute();
    docIds = res.getGeneratedIds();
    assertEquals(9, this.collection.count());
    assertEquals(3, docIds.size());
    // One record using DbDoc
    DbDoc newDoc2 = new DbDocImpl();
    newDoc2.add("FLD1", new JsonString().setValue("Data4"));
    res = this.collection.add(newDoc2).execute();
    docIds = res.getGeneratedIds();
    assertEquals(10, this.collection.count());
    assertEquals(1, docIds.size());
    assertTrue(docIds.get(0).matches("[a-f0-9]{28}"));
    // More Than One record using DbDoc
    newDoc2.clear();
    newDoc2.add("FLD1", new JsonString().setValue("Data5"));
    DbDoc newDoc3 = new DbDocImpl();
    newDoc3.add("FLD1", new JsonString().setValue("Data6"));
    res = this.collection.add(newDoc2).add(newDoc3).execute();
    docIds = res.getGeneratedIds();
    assertEquals(12, this.collection.count());
    assertEquals(2, docIds.size());
    assertTrue(docIds.get(0).compareTo(docIds.get(1)) < 0);
    // One record using DbDoc[]
    DbDoc[] jsonlist1 = new DbDocImpl[1];
    newDoc2.clear();
    newDoc2.add("FLD1", new JsonString().setValue("Data7"));
    jsonlist1[0] = newDoc2;
    res = this.collection.add(jsonlist1).execute();
    docIds = res.getGeneratedIds();
    assertEquals(13, this.collection.count());
    assertEquals(1, docIds.size());
    assertTrue(docIds.get(0).matches("[a-f0-9]{28}"));
    // More Than One record using DbDoc[]
    DbDoc[] jsonlist = new DbDocImpl[5];
    for (i = 0; i < 5; i++) {
        DbDoc newDoc = new DbDocImpl();
        newDoc.add("FLD1", new JsonString().setValue("Data" + (i + 8)));
        if (i % 2 == 0) {
            newDoc.add("_id", new JsonString().setValue("id-" + (i + 8)));
        }
        jsonlist[i] = newDoc;
        newDoc = null;
    }
    res = this.collection.add(jsonlist).execute();
    docIds = res.getGeneratedIds();
    assertEquals(18, this.collection.count());
    assertEquals(2, docIds.size());
    json = "{}";
    res = this.collection.add(json).execute();
    docIds = res.getGeneratedIds();
    assertTrue(docIds.get(0).matches("[a-f0-9]{28}"));
    assertEquals(19, this.collection.count());
    assertEquals(1, docIds.size());
    // Verify that when _id is provided by client, getGeneratedIds() will return empty
    res = this.collection.add("{\"_id\":\"00001273834abcdfe\",\"FLD1\":\"Data1\",\"name\":\"name1\"}", "{\"_id\":\"000012738uyie98rjdeje\",\"FLD2\":\"Data2\",\"name\":\"name1\"}", "{\"_id\":\"00001273y834uhf489fe\",\"FLD3\":\"Data3\",\"name\":\"name1\"}").execute();
    docIds = res.getGeneratedIds();
    assertEquals(22, this.collection.count());
    assertEquals(0, docIds.size());
    res = this.collection.add("{\"_id\":null,\"FLD1\":\"nulldata\"}").execute();
    docIds = res.getGeneratedIds();
    assertEquals(23, this.collection.count());
    assertEquals(0, docIds.size());
    docs = this.collection.find("$.FLD1 == 'nulldata'").execute();
    doc = docs.next();
    assertEquals("null", ((JsonLiteral) doc.get("_id")).toString());
    // Try inserting duplicate _ids. User should get error
    assertThrows(XProtocolError.class, "ERROR 5116 \\(HY000\\) Document contains a field value that is not unique but required to be", () -> this.collection.add("{\"_id\":\"abcd1234\",\"FLD1\":\"Data1\"}").add("{\"_id\":\"abcd1234\",\"FLD1\":\"Data2\"}").execute());
}
Also used : DbDoc(com.mysql.cj.xdevapi.DbDoc) DbDocImpl(com.mysql.cj.xdevapi.DbDocImpl) AddResult(com.mysql.cj.xdevapi.AddResult) 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 5 with DbDocImpl

use of com.mysql.cj.xdevapi.DbDocImpl in project aws-mysql-jdbc by awslabs.

the class CollectionAddTest method testCollectionAddBasic.

@Test
public void testCollectionAddBasic() throws Exception {
    assumeTrue(mysqlVersionMeetsMinimum(ServerVersion.parseVersion("8.0.0")), "MySQL 8.0+ is required to run this test.");
    int i = 0, maxrec = 100;
    /* 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 + 1000)));
        newDoc2.add("F1", new JsonString().setValue("Field-1-Data-" + i));
        newDoc2.add("F2", new JsonString().setValue("Field-2-Data-" + i));
        newDoc2.add("F3", new JsonNumber().setValue(String.valueOf(300 + i)));
        jsonlist[i] = newDoc2;
        newDoc2 = null;
    }
    this.collection.add(jsonlist).execute();
    /* add(DbDoc doc) */
    DbDoc newDoc = new DbDocImpl();
    newDoc.add("_id", new JsonString().setValue(String.valueOf(maxrec + 1000)));
    newDoc.add("F1", new JsonString().setValue("Field-1-Data-" + maxrec));
    newDoc.add("F2", new JsonString().setValue("Field-2-Data-" + maxrec));
    newDoc.add("F3", new JsonNumber().setValue(String.valueOf(300 + maxrec)));
    this.collection.add(newDoc).execute();
    /* add(String jsonString) */
    String json = "{'_id':'" + (maxrec + 1000 + 1) + "','F1':'Field-1-Data-" + (maxrec + 1) + "','F2':'Field-2-Data-" + (maxrec + 1) + "','F3':" + (300 + maxrec + 1) + "}";
    json = json.replaceAll("'", "\"");
    this.collection.add(json).execute();
    /* No _Id Field and chained add() */
    json = "{'F1': 'Field-1-Data-9999','F2': 'Field-2-Data-9999','F3': 'Field-3-Data-9999'}".replaceAll("'", "\"");
    this.collection.add(json).add(json.replaceAll("9", "8")).execute();
    assertEquals((maxrec + 4), this.collection.count());
    DocResult docs = this.collection.find("$._id = '1000'").fields("$._id as _id, $.F1 as f1, $.F2 as f2, $.F3 as f3").execute();
    DbDoc doc = null;
    doc = docs.next();
    assertEquals("1000", ((JsonString) doc.get("_id")).getString());
    System.out.println("ID :" + ((JsonString) doc.get("_id")).getString());
    System.out.println("F1 :" + ((JsonString) doc.get("f1")).getString());
    System.out.println("F2 :" + ((JsonString) doc.get("f2")).getString());
    System.out.println("F3 :" + ((JsonNumber) doc.get("f3")).getInteger());
}
Also used : DbDoc(com.mysql.cj.xdevapi.DbDoc) DbDocImpl(com.mysql.cj.xdevapi.DbDocImpl) 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)

Aggregations

DbDocImpl (com.mysql.cj.xdevapi.DbDocImpl)57 JsonString (com.mysql.cj.xdevapi.JsonString)57 DbDoc (com.mysql.cj.xdevapi.DbDoc)56 Test (org.junit.jupiter.api.Test)56 DocResult (com.mysql.cj.xdevapi.DocResult)52 JsonNumber (com.mysql.cj.xdevapi.JsonNumber)50 AddResult (com.mysql.cj.xdevapi.AddResult)21 Result (com.mysql.cj.xdevapi.Result)19 JsonArray (com.mysql.cj.xdevapi.JsonArray)15 RowResult (com.mysql.cj.xdevapi.RowResult)11 Row (com.mysql.cj.xdevapi.Row)9 SqlResult (com.mysql.cj.xdevapi.SqlResult)8 Table (com.mysql.cj.xdevapi.Table)8 BigDecimal (java.math.BigDecimal)7 ExecutionException (java.util.concurrent.ExecutionException)7 ArrayList (java.util.ArrayList)4 HashMap (java.util.HashMap)4 CompletableFuture (java.util.concurrent.CompletableFuture)4 Collection (com.mysql.cj.xdevapi.Collection)2 Session (com.mysql.cj.xdevapi.Session)2