|
35 | 35 | import oracle.r2dbc.OracleR2dbcTypes;
|
36 | 36 | import oracle.r2dbc.OracleR2dbcWarning;
|
37 | 37 | import oracle.r2dbc.test.DatabaseConfig;
|
| 38 | +import oracle.r2dbc.test.TestUtils; |
| 39 | +import oracle.sql.json.OracleJsonFactory; |
| 40 | +import oracle.sql.json.OracleJsonObject; |
38 | 41 | import org.junit.jupiter.api.Test;
|
39 | 42 | import org.reactivestreams.Publisher;
|
40 | 43 | import reactor.core.publisher.Flux;
|
|
66 | 69 | import static java.util.Arrays.asList;
|
67 | 70 | import static oracle.r2dbc.test.DatabaseConfig.connectTimeout;
|
68 | 71 | import static oracle.r2dbc.test.DatabaseConfig.connectionFactoryOptions;
|
| 72 | +import static oracle.r2dbc.test.DatabaseConfig.databaseVersion; |
69 | 73 | import static oracle.r2dbc.test.DatabaseConfig.newConnection;
|
70 | 74 | import static oracle.r2dbc.test.DatabaseConfig.sharedConnection;
|
71 | 75 | import static oracle.r2dbc.test.TestUtils.constructObject;
|
|
86 | 90 | import static org.junit.jupiter.api.Assertions.assertThrows;
|
87 | 91 | import static org.junit.jupiter.api.Assertions.assertTrue;
|
88 | 92 | import static org.junit.jupiter.api.Assertions.fail;
|
| 93 | +import static org.junit.jupiter.api.Assumptions.assumeTrue; |
89 | 94 |
|
90 | 95 | /**
|
91 | 96 | * Verifies that
|
@@ -2977,6 +2982,78 @@ public void testInOutObjectCall() {
|
2977 | 2982 | }
|
2978 | 2983 | }
|
2979 | 2984 |
|
| 2985 | + /** |
| 2986 | + * Verifies inserts and queries with a JSON Duality View. |
| 2987 | + */ |
| 2988 | + @Test |
| 2989 | + public void testJsonDualityView() { |
| 2990 | + // JSON Duality Views were introduced in Oracle Database version 23c, so |
| 2991 | + // this test is skipped if the version is older than 23c. |
| 2992 | + assumeTrue(databaseVersion() >= 23, |
| 2993 | + "JSON Duality Views are not supported by database versions older than" + |
| 2994 | + " 23"); |
| 2995 | + |
| 2996 | + Connection connection = awaitOne(sharedConnection()); |
| 2997 | + try { |
| 2998 | + awaitExecution(connection.createStatement( |
| 2999 | + "CREATE TABLE testJsonDualityViewTable (" + |
| 3000 | + "id NUMBER PRIMARY KEY, value VARCHAR(1000))")); |
| 3001 | + awaitExecution(connection.createStatement( |
| 3002 | + "CREATE JSON DUALITY VIEW testJsonDualityView AS" + |
| 3003 | + " SELECT JSON {'id' : t.id, 'value' : t.value}" + |
| 3004 | + " FROM testJsonDualityViewTable t" + |
| 3005 | + " WITH INSERT UPDATE DELETE")); |
| 3006 | + |
| 3007 | + // Verify an insert |
| 3008 | + OracleJsonObject insertObject = new OracleJsonFactory().createObject(); |
| 3009 | + insertObject.put("id", 1); |
| 3010 | + insertObject.put("value", "a"); |
| 3011 | + Statement insert = connection.createStatement( |
| 3012 | + "INSERT INTO testJsonDualityView VALUES (?)") |
| 3013 | + .bind(0, insertObject); |
| 3014 | + awaitUpdate(1, insert); |
| 3015 | + |
| 3016 | + // Verify a query |
| 3017 | + Statement query = connection.createStatement( |
| 3018 | + "SELECT data FROM testJsonDualityView"); |
| 3019 | + Result queryResult = awaitOne(query.execute()); |
| 3020 | + OracleJsonObject queryObject = |
| 3021 | + awaitOne(queryResult.map(row -> row.get(0, OracleJsonObject.class))); |
| 3022 | + queryObject = |
| 3023 | + new OracleJsonFactory().createObject(queryObject); |
| 3024 | + queryObject.remove("_metadata"); // Remove this field for assertEquals |
| 3025 | + assertEquals(insertObject, queryObject); |
| 3026 | + |
| 3027 | + // Verify an update that returns generated keys |
| 3028 | + OracleJsonObject updateObject = new OracleJsonFactory().createObject(); |
| 3029 | + updateObject.put("id", 1); |
| 3030 | + updateObject.put("value", "b"); |
| 3031 | + Statement update = connection.createStatement( |
| 3032 | + "UPDATE testJsonDualityView v" + |
| 3033 | + " SET data = ?" + |
| 3034 | + " WHERE v.data.id = ?"); |
| 3035 | + update.bind(0, updateObject); |
| 3036 | + update.bind(1, 1); |
| 3037 | + update.returnGeneratedValues("data"); |
| 3038 | + Result updateResult = awaitOne(update.execute()); |
| 3039 | + OracleJsonObject generatedUpdateObject = |
| 3040 | + awaitOne(updateResult.map(row -> row.get(0, OracleJsonObject.class))); |
| 3041 | + generatedUpdateObject = |
| 3042 | + new OracleJsonFactory().createObject(generatedUpdateObject); |
| 3043 | + generatedUpdateObject.remove("_metadata"); // Remove this field for assertEquals |
| 3044 | + assertEquals(updateObject, generatedUpdateObject); |
| 3045 | + |
| 3046 | + } |
| 3047 | + finally { |
| 3048 | + tryAwaitExecution(connection.createStatement( |
| 3049 | + "DROP VIEW testJsonDualityView")); |
| 3050 | + tryAwaitExecution(connection.createStatement( |
| 3051 | + "DROP TABLE testJsonDualityViewTable")); |
| 3052 | + tryAwaitNone(connection.close()); |
| 3053 | + } |
| 3054 | + |
| 3055 | + } |
| 3056 | + |
2980 | 3057 | /**
|
2981 | 3058 | * Connect to the database configured by {@link DatabaseConfig}, with a
|
2982 | 3059 | * the connection configured to use a given {@code executor} for async
|
|
0 commit comments