Initial Development #1

Merged
danieljsummers merged 88 commits from v1-rc into main 2025-04-16 01:29:20 +00:00
6 changed files with 795 additions and 83 deletions
Showing only changes of commit 18866b3ff7 - Show all commits

View File

@ -30,14 +30,14 @@ final class CustomFunctions {
static void jsonArrayEmpty(ThrowawayDatabase db) {
assertEquals(0L, db.conn.countAll(TEST_TABLE), 'The test table should be empty')
assertEquals('[]', db.conn.customJsonArray(FindQuery.all(TEST_TABLE), List.of(), Results::jsonFromData),
assertEquals('[]', db.conn.customJsonArray(FindQuery.all(TEST_TABLE), List.of(), Results.&jsonFromData),
'An empty list was not represented correctly');
}
static void jsonArraySingle(ThrowawayDatabase db) {
db.conn.insert(TEST_TABLE, new ArrayDocument("one", List.of("2", "3")))
assertEquals(JsonFunctions.maybeJsonB('[{"id":"one","values":["2","3"]}]'),
db.conn.customJsonArray(FindQuery.all(TEST_TABLE), List.of(), Results::jsonFromData),
db.conn.customJsonArray(FindQuery.all(TEST_TABLE), List.of(), Results.&jsonFromData),
'A single document list was not represented correctly')
}
@ -46,10 +46,38 @@ final class CustomFunctions {
assertEquals(JsonFunctions.maybeJsonB('[{"id":"first","values":["a","b","c"]},'
+ '{"id":"second","values":["c","d","e"]},{"id":"third","values":["x","y","z"]}]'),
db.conn.customJsonArray(FindQuery.all(TEST_TABLE) + QueryUtils.orderBy(List.of(Field.named("id"))),
List.of(), Results::jsonFromData),
List.of(), Results.&jsonFromData),
'A multiple document list was not represented correctly')
}
static void writeJsonArrayEmpty(ThrowawayDatabase db) {
assertEquals(0L, db.conn.countAll(TEST_TABLE), 'The test table should be empty')
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeCustomJsonArray(FindQuery.all(TEST_TABLE), List.of(), writer, Results.&jsonFromData)
assertEquals("[]", output.toString(), 'An empty list was not represented correctly')
}
static void writeJsonArraySingle(ThrowawayDatabase db) {
db.conn.insert(TEST_TABLE, new ArrayDocument("one", List.of("2", "3")))
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeCustomJsonArray(FindQuery.all(TEST_TABLE), List.of(), writer, Results.&jsonFromData)
assertEquals(JsonFunctions.maybeJsonB('[{"id":"one","values":["2","3"]}]'), output.toString(),
'A single document list was not represented correctly')
}
static void writeJsonArrayMany(ThrowawayDatabase db) {
ArrayDocument.testDocuments.forEach { db.conn.insert(TEST_TABLE, it) }
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeCustomJsonArray(FindQuery.all(TEST_TABLE) + QueryUtils.orderBy(List.of(Field.named("id"))),
List.of(), writer, Results.&jsonFromData)
assertEquals(JsonFunctions.maybeJsonB('[{"id":"first","values":["a","b","c"]},'
+ '{"id":"second","values":["c","d","e"]},{"id":"third","values":["x","y","z"]}]'),
output.toString(), "A multiple document list was not represented correctly")
}
static void singleNone(ThrowawayDatabase db) {
assertFalse(db.conn.customSingle(FindQuery.all(TEST_TABLE), List.of(), JsonDocument, Results.&fromData)
.isPresent(),
@ -65,14 +93,14 @@ final class CustomFunctions {
}
static void jsonSingleNone(ThrowawayDatabase db) {
assertEquals('{}', db.conn.customJsonSingle(FindQuery.all(TEST_TABLE), List.of(), Results::jsonFromData),
assertEquals('{}', db.conn.customJsonSingle(FindQuery.all(TEST_TABLE), List.of(), Results.&jsonFromData),
'An empty document was not represented correctly')
}
static void jsonSingleOne(ThrowawayDatabase db) {
db.conn.insert(TEST_TABLE, new ArrayDocument("me", List.of("myself", "i")))
assertEquals(JsonFunctions.maybeJsonB('{"id":"me","values":["myself","i"]}'),
db.conn.customJsonSingle(FindQuery.all(TEST_TABLE), List.of(), Results::jsonFromData),
db.conn.customJsonSingle(FindQuery.all(TEST_TABLE), List.of(), Results.&jsonFromData),
'A single document was not represented correctly');
}

View File

@ -43,9 +43,7 @@ final class JsonFunctions {
return maybeJsonB("{\"id\":\"$id\"")
}
static void allDefault(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonAll(TEST_TABLE)
private static void checkAllDefault(String json) {
assertTrue(json.startsWith('['), "JSON should start with '[' ($json)")
switch (Configuration.dialect()) {
case Dialect.SQLITE:
@ -66,13 +64,35 @@ final class JsonFunctions {
assertTrue(json.endsWith(']'), "JSON should end with ']' ($json)")
}
static void allEmpty(ThrowawayDatabase db) {
assertEquals('[]', db.conn.jsonAll(TEST_TABLE), 'There should have been no documents returned')
static void allDefault(ThrowawayDatabase db) {
JsonDocument.load(db)
checkAllDefault(db.conn.jsonAll(TEST_TABLE))
}
static void byIdString(ThrowawayDatabase db) {
static void writeAllDefault(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonById(TEST_TABLE, 'two')
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonAll(TEST_TABLE, writer)
checkAllDefault(output.toString())
}
private static void checkAllEmpty(String json) {
assertEquals('[]', json, 'There should have been no documents returned')
}
static void allEmpty(ThrowawayDatabase db) {
checkAllEmpty(db.conn.jsonAll(TEST_TABLE))
}
static void writeAllEmpty(ThrowawayDatabase db) {
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonAll(TEST_TABLE, writer)
checkAllEmpty(output.toString())
}
private static void checkByIdString(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertEquals(JsonDocument.two, json, 'An incorrect document was returned')
@ -83,26 +103,64 @@ final class JsonFunctions {
}
}
static void byIdString(ThrowawayDatabase db) {
JsonDocument.load(db)
checkByIdString(db.conn.jsonById(TEST_TABLE, 'two'))
}
static void writeByIdString(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonById(TEST_TABLE, writer, 'two')
checkByIdString(output.toString())
}
private static void checkByIdNumber(String json) {
assertEquals(maybeJsonB('{"key":18,"text":"howdy"}'), json, 'The document should have been found by numeric ID')
}
static void byIdNumber(ThrowawayDatabase db) {
Configuration.idField = 'key'
try {
db.conn.insert(TEST_TABLE, new NumIdDocument(18, 'howdy'))
assertEquals(maybeJsonB('{"key":18,"text":"howdy"}'), db.conn.jsonById(TEST_TABLE, 18),
'The document should have been found by numeric ID')
checkByIdNumber(db.conn.jsonById(TEST_TABLE, 18))
} finally {
Configuration.idField = 'id'
}
}
static void byIdNotFound(ThrowawayDatabase db) {
JsonDocument.load(db)
assertEquals('{}', db.conn.jsonById(TEST_TABLE, 'x'), 'There should have been no document returned')
static void writeByIdNumber(ThrowawayDatabase db) {
Configuration.idField = 'key'
try {
db.conn.insert(TEST_TABLE, new NumIdDocument(18, 'howdy'))
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonById(TEST_TABLE, writer, 18)
checkByIdNumber(output.toString())
} finally {
Configuration.idField = 'id'
}
}
static void byFieldsMatch(ThrowawayDatabase db) {
private static void checkByIdNotFound(String json) {
assertEquals('{}', json, 'There should have been no document returned')
}
static void byIdNotFound(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonByFields(TEST_TABLE, List.of(Field.any('value', List.of('blue', 'purple')),
Field.exists('sub')), FieldMatch.ALL)
checkByIdNotFound(db.conn.jsonById(TEST_TABLE, 'x'))
}
static void writeByIdNotFound(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonById(TEST_TABLE, writer, 'x')
checkByIdNotFound(output.toString())
}
private static void checkByFieldsMatch(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertEquals("[${JsonDocument.four}]".toString(), json, 'The incorrect document was returned')
@ -115,10 +173,22 @@ final class JsonFunctions {
}
}
static void byFieldsMatchOrdered(ThrowawayDatabase db) {
static void byFieldsMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonByFields(TEST_TABLE, List.of(Field.equal('value', 'purple')), null,
List.of(Field.named('id')))
checkByFieldsMatch(db.conn.jsonByFields(TEST_TABLE, List.of(Field.any('value', List.of('blue', 'purple')),
Field.exists('sub')), FieldMatch.ALL))
}
static void writeByFieldsMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonByFields(TEST_TABLE, writer, List.of(Field.any('value', List.of('blue', 'purple')),
Field.exists('sub')), FieldMatch.ALL)
checkByFieldsMatch(output.toString())
}
private static checkByFieldsMatchOrdered(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertEquals("[${JsonDocument.five},${JsonDocument.four}]".toString(), json,
@ -136,9 +206,22 @@ final class JsonFunctions {
}
}
static void byFieldsMatchNumIn(ThrowawayDatabase db) {
static void byFieldsMatchOrdered(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonByFields(TEST_TABLE, List.of(Field.any('numValue', List.of(2, 4, 6, 8))))
checkByFieldsMatchOrdered(db.conn.jsonByFields(TEST_TABLE, List.of(Field.equal('value', 'purple')), null,
List.of(Field.named('id'))))
}
static void writeByFieldsMatchOrdered(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonByFields(TEST_TABLE, writer, List.of(Field.equal('value', 'purple')), null,
List.of(Field.named('id')))
checkByFieldsMatchOrdered(output.toString())
}
private static void checkByFieldsMatchNumIn(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertEquals("[${JsonDocument.three}]".toString(), json, 'The incorrect document was returned')
@ -151,30 +234,76 @@ final class JsonFunctions {
}
}
static void byFieldsNoMatch(ThrowawayDatabase db) {
static void byFieldsMatchNumIn(ThrowawayDatabase db) {
JsonDocument.load(db)
assertEquals('[]', db.conn.jsonByFields(TEST_TABLE, List.of(Field.greater('numValue', 100))),
'There should have been no documents returned')
checkByFieldsMatchNumIn(db.conn.jsonByFields(TEST_TABLE, List.of(Field.any('numValue', List.of(2, 4, 6, 8)))))
}
static void byFieldsMatchInArray(ThrowawayDatabase db) {
ArrayDocument.testDocuments.forEach { db.conn.insert(TEST_TABLE, it) }
String json = db.conn.jsonByFields(TEST_TABLE, List.of(Field.inArray('values', TEST_TABLE, List.of('c'))))
static void writeByFieldsMatchNumIn(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonByFields(TEST_TABLE, writer, List.of(Field.any('numValue', List.of(2, 4, 6, 8))))
checkByFieldsMatchNumIn(output.toString())
}
private static void checkByFieldsNoMatch(String json) {
assertEquals('[]', json, 'There should have been no documents returned')
}
static void byFieldsNoMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
checkByFieldsNoMatch(db.conn.jsonByFields(TEST_TABLE, List.of(Field.greater('numValue', 100))))
}
static void writeByFieldsNoMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonByFields(TEST_TABLE, writer, List.of(Field.greater('numValue', 100)))
checkByFieldsNoMatch(output.toString())
}
private static void checkByFieldsMatchInArray(String json) {
assertTrue(json.startsWith('['), "JSON should start with '[' ($json)")
assertTrue(json.contains(docId('first')), "The 'first' document was not found ($json)")
assertTrue(json.contains(docId('second')), "The 'second' document was not found ($json)")
assertTrue(json.endsWith(']'), "JSON should end with ']' ($json)")
}
static void byFieldsNoMatchInArray(ThrowawayDatabase db) {
static void byFieldsMatchInArray(ThrowawayDatabase db) {
ArrayDocument.testDocuments.forEach { db.conn.insert(TEST_TABLE, it) }
assertEquals('[]', db.conn.jsonByFields(TEST_TABLE, List.of(Field.inArray('values', TEST_TABLE, List.of('j')))),
'There should have been no documents returned')
checkByFieldsMatchInArray(db.conn.jsonByFields(TEST_TABLE,
List.of(Field.inArray('values', TEST_TABLE, List.of('c')))))
}
static void byContainsMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonByContains(TEST_TABLE, Map.of('value', 'purple'))
static void writeByFieldsMatchInArray(ThrowawayDatabase db) {
ArrayDocument.testDocuments.forEach { db.conn.insert(TEST_TABLE, it) }
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonByFields(TEST_TABLE, writer, List.of(Field.inArray('values', TEST_TABLE, List.of('c'))))
checkByFieldsMatchInArray(output.toString())
}
private static void checkByFieldsNoMatchInArray(String json) {
assertEquals('[]', json, 'There should have been no documents returned')
}
static void byFieldsNoMatchInArray(ThrowawayDatabase db) {
ArrayDocument.testDocuments.forEach { db.conn.insert(TEST_TABLE, it) }
checkByFieldsNoMatchInArray(db.conn.jsonByFields(TEST_TABLE,
List.of(Field.inArray('values', TEST_TABLE, List.of('j')))))
}
static void writeByFieldsNoMatchInArray(ThrowawayDatabase db) {
ArrayDocument.testDocuments.forEach { db.conn.insert(TEST_TABLE, it) }
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonByFields(TEST_TABLE, writer, List.of(Field.inArray('values', TEST_TABLE, List.of('j'))))
checkByFieldsNoMatchInArray(output.toString())
}
private static void checkByContainsMatch(String json) {
assertTrue(json.startsWith('['), "JSON should start with '[' ($json)")
switch (Configuration.dialect()) {
case Dialect.SQLITE:
@ -189,10 +318,20 @@ final class JsonFunctions {
assertTrue(json.endsWith(']'), "JSON should end with ']' ($json)")
}
static void byContainsMatchOrdered(ThrowawayDatabase db) {
static void byContainsMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonByContains(TEST_TABLE, Map.of('sub', Map.of('foo', 'green')),
List.of(Field.named('value')))
checkByContainsMatch(db.conn.jsonByContains(TEST_TABLE, Map.of('value', 'purple')))
}
static void writeByContainsMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonByContains(TEST_TABLE, writer, Map.of('value', 'purple'))
checkByContainsMatch(output.toString())
}
private static void checkByContainsMatchOrdered(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertEquals("[${JsonDocument.two},${JsonDocument.four}]", json,
@ -210,15 +349,39 @@ final class JsonFunctions {
}
}
static void byContainsNoMatch(ThrowawayDatabase db) {
static void byContainsMatchOrdered(ThrowawayDatabase db) {
JsonDocument.load(db)
assertEquals('[]', db.conn.jsonByContains(TEST_TABLE, Map.of('value', 'indigo')),
'There should have been no documents returned')
checkByContainsMatchOrdered(db.conn.jsonByContains(TEST_TABLE, Map.of('sub', Map.of('foo', 'green')),
List.of(Field.named('value'))))
}
static void byJsonPathMatch(ThrowawayDatabase db) {
static void writeByContainsMatchOrdered(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonByJsonPath(TEST_TABLE, '$.numValue ? (@ > 10)')
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonByContains(TEST_TABLE, writer, Map.of('sub', Map.of('foo', 'green')),
List.of(Field.named('value')))
checkByContainsMatchOrdered(output.toString())
}
private static void checkByContainsNoMatch(String json) {
assertEquals('[]', json, 'There should have been no documents returned')
}
static void byContainsNoMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
checkByContainsNoMatch(db.conn.jsonByContains(TEST_TABLE, Map.of('value', 'indigo')))
}
static void writeByContainsNoMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonByContains(TEST_TABLE, writer, Map.of('value', 'indigo'))
checkByContainsNoMatch(output.toString())
}
private static void checkByJsonPathMatch(String json) {
assertTrue(json.startsWith('['), "JSON should start with '[' ($json)")
switch (Configuration.dialect()) {
case Dialect.SQLITE:
@ -233,9 +396,20 @@ final class JsonFunctions {
assertTrue(json.endsWith(']'), "JSON should end with ']' ($json)")
}
static void byJsonPathMatchOrdered(ThrowawayDatabase db) {
static void byJsonPathMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonByJsonPath(TEST_TABLE, '$.numValue ? (@ > 10)', List.of(Field.named('id')))
checkByJsonPathMatch(db.conn.jsonByJsonPath(TEST_TABLE, '$.numValue ? (@ > 10)'))
}
static void writeByJsonPathMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonByJsonPath(TEST_TABLE, writer, '$.numValue ? (@ > 10)')
checkByJsonPathMatch(output.toString())
}
private static void checkByJsonPathMatchOrdered(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertEquals("[${JsonDocument.five},${JsonDocument.four}]", json,
@ -253,15 +427,38 @@ final class JsonFunctions {
}
}
static void byJsonPathNoMatch(ThrowawayDatabase db) {
static void byJsonPathMatchOrdered(ThrowawayDatabase db) {
JsonDocument.load(db)
assertEquals('[]', db.conn.jsonByJsonPath(TEST_TABLE, '$.numValue ? (@ > 100)'),
'There should have been no documents returned')
checkByJsonPathMatchOrdered(db.conn.jsonByJsonPath(TEST_TABLE, '$.numValue ? (@ > 10)',
List.of(Field.named('id'))))
}
static void firstByFieldsMatchOne(ThrowawayDatabase db) {
static void writeByJsonPathMatchOrdered(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonFirstByFields(TEST_TABLE, List.of(Field.equal('value', 'another')))
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonByJsonPath(TEST_TABLE, writer, '$.numValue ? (@ > 10)', List.of(Field.named('id')))
checkByJsonPathMatchOrdered(output.toString())
}
private static void checkByJsonPathNoMatch(String json) {
assertEquals('[]', json, 'There should have been no documents returned')
}
static void byJsonPathNoMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
checkByJsonPathNoMatch(db.conn.jsonByJsonPath(TEST_TABLE, '$.numValue ? (@ > 100)'))
}
static void writeByJsonPathNoMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonByJsonPath(TEST_TABLE, writer, '$.numValue ? (@ > 100)')
checkByJsonPathNoMatch(output.toString())
}
private static void checkFirstByFieldsMatchOne(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertEquals(JsonDocument.two, json, 'The incorrect document was returned')
@ -272,13 +469,24 @@ final class JsonFunctions {
}
}
static void firstByFieldsMatchMany(ThrowawayDatabase db) {
static void firstByFieldsMatchOne(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonFirstByFields(TEST_TABLE, List.of(Field.equal('sub.foo', 'green')))
checkFirstByFieldsMatchOne(db.conn.jsonFirstByFields(TEST_TABLE, List.of(Field.equal('value', 'another'))))
}
static void writeFirstByFieldsMatchOne(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonFirstByFields(TEST_TABLE, writer, List.of(Field.equal('value', 'another')))
checkFirstByFieldsMatchOne(output.toString())
}
private static void checkFirstByFieldsMatchMany(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertTrue(json.contains(JsonDocument.two) || json.contains(JsonDocument.four),
"Expected document 'two' or 'four' ($json)")
"Expected document 'two' or 'four' ($json)")
break
case Dialect.POSTGRESQL:
assertTrue(json.contains(docId('two')) || json.contains(docId('four')),
@ -287,10 +495,20 @@ final class JsonFunctions {
}
}
static void firstByFieldsMatchOrdered(ThrowawayDatabase db) {
static void firstByFieldsMatchMany(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonFirstByFields(TEST_TABLE, List.of(Field.equal('sub.foo', 'green')), null,
List.of(Field.named('n:numValue DESC')))
checkFirstByFieldsMatchMany(db.conn.jsonFirstByFields(TEST_TABLE, List.of(Field.equal('sub.foo', 'green'))))
}
static void writeFirstByFieldsMatchMany(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonFirstByFields(TEST_TABLE, writer, List.of(Field.equal('sub.foo', 'green')))
checkFirstByFieldsMatchMany(output.toString())
}
private static void checkFirstByFieldsMatchOrdered(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertEquals(JsonDocument.four, json, 'An incorrect document was returned')
@ -301,15 +519,39 @@ final class JsonFunctions {
}
}
static void firstByFieldsNoMatch(ThrowawayDatabase db) {
static void firstByFieldsMatchOrdered(ThrowawayDatabase db) {
JsonDocument.load(db)
assertEquals('{}', db.conn.jsonFirstByFields(TEST_TABLE, List.of(Field.equal('value', 'absent'))),
'There should have been no document returned')
checkFirstByFieldsMatchOrdered(db.conn.jsonFirstByFields(TEST_TABLE, List.of(Field.equal('sub.foo', 'green')),
null, List.of(Field.named('n:numValue DESC'))))
}
static void firstByContainsMatchOne(ThrowawayDatabase db) {
static void writeFirstByFieldsMatchOrdered(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonFirstByContains(TEST_TABLE, Map.of('value', 'FIRST!'))
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonFirstByFields(TEST_TABLE, writer, List.of(Field.equal('sub.foo', 'green')),
null, List.of(Field.named('n:numValue DESC')))
checkFirstByFieldsMatchOrdered(output.toString())
}
private static void checkFirstByFieldsNoMatch(String json) {
assertEquals('{}', json, 'There should have been no document returned')
}
static void firstByFieldsNoMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
checkFirstByFieldsNoMatch(db.conn.jsonFirstByFields(TEST_TABLE, List.of(Field.equal('value', 'absent'))))
}
static void writeFirstByFieldsNoMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonFirstByFields(TEST_TABLE, writer, List.of(Field.equal('value', 'absent')))
checkFirstByFieldsNoMatch(output.toString())
}
private static void checkFirstByContainsMatchOne(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertEquals(JsonDocument.one, json, 'An incorrect document was returned')
@ -320,25 +562,46 @@ final class JsonFunctions {
}
}
static void firstByContainsMatchMany(ThrowawayDatabase db) {
static void firstByContainsMatchOne(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonFirstByContains(TEST_TABLE, Map.of('value', 'purple'))
checkFirstByContainsMatchOne(db.conn.jsonFirstByContains(TEST_TABLE, Map.of('value', 'FIRST!')))
}
static void writeFirstByContainsMatchOne(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonFirstByContains(TEST_TABLE, writer, Map.of('value', 'FIRST!'))
checkFirstByContainsMatchOne(output.toString())
}
private static void checkFirstByContainsMatchMany(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertTrue(json.contains(JsonDocument.four) || json.contains(JsonDocument.five),
"Expected document 'four' or 'five' ($json)")
"Expected document 'four' or 'five' ($json)")
break
case Dialect.POSTGRESQL:
assertTrue( json.contains(docId('four')) || json.contains(docId('five')),
"Expected document 'four' or 'five' ($json)")
"Expected document 'four' or 'five' ($json)")
break
}
}
static void firstByContainsMatchOrdered(ThrowawayDatabase db) {
static void firstByContainsMatchMany(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonFirstByContains(TEST_TABLE, Map.of('value', 'purple'),
List.of(Field.named('sub.bar NULLS FIRST')))
checkFirstByContainsMatchMany(db.conn.jsonFirstByContains(TEST_TABLE, Map.of('value', 'purple')))
}
static void writeFirstByContainsMatchMany(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonFirstByContains(TEST_TABLE, writer, Map.of('value', 'purple'))
checkFirstByContainsMatchMany(output.toString())
}
private static void checkFirstByContainsMatchOrdered(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertEquals(JsonDocument.five, json, 'An incorrect document was returned')
@ -349,15 +612,39 @@ final class JsonFunctions {
}
}
static void firstByContainsNoMatch(ThrowawayDatabase db) {
static void firstByContainsMatchOrdered(ThrowawayDatabase db) {
JsonDocument.load(db)
assertEquals('{}', db.conn.jsonFirstByContains(TEST_TABLE, Map.of('value', 'indigo')),
'There should have been no document returned')
checkFirstByContainsMatchOrdered(db.conn.jsonFirstByContains(TEST_TABLE, Map.of('value', 'purple'),
List.of(Field.named('sub.bar NULLS FIRST'))))
}
static void firstByJsonPathMatchOne(ThrowawayDatabase db) {
static void writeFirstByContainsMatchOrdered(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonFirstByJsonPath(TEST_TABLE, '$.numValue ? (@ == 10)')
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonFirstByContains(TEST_TABLE, writer, Map.of('value', 'purple'),
List.of(Field.named('sub.bar NULLS FIRST')))
checkFirstByContainsMatchOrdered(output.toString())
}
private static void checkFirstByContainsNoMatch(String json) {
assertEquals('{}', json, 'There should have been no document returned')
}
static void firstByContainsNoMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
checkFirstByContainsNoMatch(db.conn.jsonFirstByContains(TEST_TABLE, Map.of('value', 'indigo')))
}
static void writeFirstByContainsNoMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonFirstByContains(TEST_TABLE, writer, Map.of('value', 'indigo'))
checkFirstByContainsNoMatch(output.toString())
}
private static void checkFirstByJsonPathMatchOne(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertEquals(JsonDocument.two, json, 'An incorrect document was returned')
@ -368,24 +655,46 @@ final class JsonFunctions {
}
}
static void firstByJsonPathMatchMany(ThrowawayDatabase db) {
static void firstByJsonPathMatchOne(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonFirstByJsonPath(TEST_TABLE, '$.numValue ? (@ > 10)')
checkFirstByJsonPathMatchOne(db.conn.jsonFirstByJsonPath(TEST_TABLE, '$.numValue ? (@ == 10)'))
}
static void writeFirstByJsonPathMatchOne(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonFirstByJsonPath(TEST_TABLE, writer, '$.numValue ? (@ == 10)')
checkFirstByJsonPathMatchOne(output.toString())
}
private static void checkFirstByJsonPathMatchMany(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertTrue(json.contains(JsonDocument.four) || json.contains(JsonDocument.five),
"Expected document 'four' or 'five' ($json)")
"Expected document 'four' or 'five' ($json)")
break
case Dialect.POSTGRESQL:
assertTrue(json.contains(docId('four')) || json.contains(docId('five')),
"Expected document 'four' or 'five' ($json)")
"Expected document 'four' or 'five' ($json)")
break
}
}
static void firstByJsonPathMatchOrdered(ThrowawayDatabase db) {
static void firstByJsonPathMatchMany(ThrowawayDatabase db) {
JsonDocument.load(db)
String json = db.conn.jsonFirstByJsonPath(TEST_TABLE, '$.numValue ? (@ > 10)', List.of(Field.named('id DESC')))
checkFirstByJsonPathMatchMany(db.conn.jsonFirstByJsonPath(TEST_TABLE, '$.numValue ? (@ > 10)'))
}
static void writeFirstByJsonPathMatchMany(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonFirstByJsonPath(TEST_TABLE, writer, '$.numValue ? (@ > 10)')
checkFirstByJsonPathMatchMany(output.toString())
}
private static void checkFirstByJsonPathMatchOrdered(String json) {
switch (Configuration.dialect()) {
case Dialect.SQLITE:
assertEquals(JsonDocument.four, json, 'An incorrect document was returned')
@ -396,9 +705,34 @@ final class JsonFunctions {
}
}
static void firstByJsonPathMatchOrdered(ThrowawayDatabase db) {
JsonDocument.load(db)
checkFirstByJsonPathMatchOrdered(db.conn.jsonFirstByJsonPath(TEST_TABLE, '$.numValue ? (@ > 10)',
List.of(Field.named('id DESC'))))
}
static void writeFirstByJsonPathMatchOrdered(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonFirstByJsonPath(TEST_TABLE, writer, '$.numValue ? (@ > 10)', List.of(Field.named('id DESC')))
checkFirstByJsonPathMatchOrdered(output.toString())
}
private static void checkFirstByJsonPathNoMatch(String json) {
assertEquals('{}', json, 'There should have been no document returned')
}
static void firstByJsonPathNoMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
assertEquals('{}', db.conn.jsonFirstByJsonPath(TEST_TABLE, '$.numValue ? (@ > 100)'),
'There should have been no document returned')
checkFirstByJsonPathNoMatch(db.conn.jsonFirstByJsonPath(TEST_TABLE, '$.numValue ? (@ > 100)'))
}
static void writeFirstByJsonPathNoMatch(ThrowawayDatabase db) {
JsonDocument.load(db)
def output = new StringWriter()
def writer = new PrintWriter(output)
db.conn.writeJsonFirstByJsonPath(TEST_TABLE, writer, '$.numValue ? (@ > 100)')
checkFirstByJsonPathNoMatch(output.toString())
}
}

View File

@ -39,6 +39,24 @@ final class PostgreSQLCustomIT {
new PgDB().withCloseable CustomFunctions.&jsonArrayMany
}
@Test
@DisplayName('writeJsonArray succeeds with empty array')
void writeJsonArrayEmpty() {
new PgDB().withCloseable CustomFunctions.&writeJsonArrayEmpty
}
@Test
@DisplayName('writeJsonArray succeeds with a single-item array')
void writeJsonArraySingle() {
new PgDB().withCloseable CustomFunctions.&writeJsonArraySingle
}
@Test
@DisplayName('writeJsonArray succeeds with a multi-item array')
void writeJsonArrayMany() {
new PgDB().withCloseable CustomFunctions.&writeJsonArrayMany
}
@Test
@DisplayName('single succeeds when document not found')
void singleNone() {

View File

@ -182,4 +182,178 @@ final class PostgreSQLJsonIT {
void firstByJsonPathNoMatch() {
new PgDB().withCloseable JsonFunctions.&firstByJsonPathNoMatch
}
@Test
@DisplayName('writeAll retrieves all documents')
void writeAllDefault() {
new PgDB().withCloseable JsonFunctions.&writeAllDefault
}
@Test
@DisplayName('writeAll succeeds with an empty table')
void writeAllEmpty() {
new PgDB().withCloseable JsonFunctions.&writeAllEmpty
}
@Test
@DisplayName('writeById retrieves a document via a string ID')
void writeByIdString() {
new PgDB().withCloseable JsonFunctions.&writeByIdString
}
@Test
@DisplayName('writeById retrieves a document via a numeric ID')
void writeByIdNumber() {
new PgDB().withCloseable JsonFunctions.&writeByIdNumber
}
@Test
@DisplayName('writeById returns null when a matching ID is not found')
void writeByIdNotFound() {
new PgDB().withCloseable JsonFunctions.&writeByIdNotFound
}
@Test
@DisplayName('writeByFields retrieves matching documents')
void writeByFieldsMatch() {
new PgDB().withCloseable JsonFunctions.&writeByFieldsMatch
}
@Test
@DisplayName('writeByFields retrieves ordered matching documents')
void writeByFieldsMatchOrdered() {
new PgDB().withCloseable JsonFunctions.&writeByFieldsMatchOrdered
}
@Test
@DisplayName('writeByFields retrieves matching documents with a numeric IN clause')
void writeByFieldsMatchNumIn() {
new PgDB().withCloseable JsonFunctions.&writeByFieldsMatchNumIn
}
@Test
@DisplayName('writeByFields succeeds when no documents match')
void writeByFieldsNoMatch() {
new PgDB().withCloseable JsonFunctions.&writeByFieldsNoMatch
}
@Test
@DisplayName('writeByFields retrieves matching documents with an IN_ARRAY comparison')
void writeByFieldsMatchInArray() {
new PgDB().withCloseable JsonFunctions.&writeByFieldsMatchInArray
}
@Test
@DisplayName('writeByFields succeeds when no documents match an IN_ARRAY comparison')
void writeByFieldsNoMatchInArray() {
new PgDB().withCloseable JsonFunctions.&writeByFieldsNoMatchInArray
}
@Test
@DisplayName('writeByContains retrieves matching documents')
void writeByContainsMatch() {
new PgDB().withCloseable JsonFunctions.&writeByContainsMatch
}
@Test
@DisplayName('writeByContains retrieves ordered matching documents')
void writeByContainsMatchOrdered() {
new PgDB().withCloseable JsonFunctions.&writeByContainsMatchOrdered
}
@Test
@DisplayName('writeByContains succeeds when no documents match')
void writeByContainsNoMatch() {
new PgDB().withCloseable JsonFunctions.&writeByContainsNoMatch
}
@Test
@DisplayName('writeByJsonPath retrieves matching documents')
void writeByJsonPathMatch() {
new PgDB().withCloseable JsonFunctions.&writeByJsonPathMatch
}
@Test
@DisplayName('writeByJsonPath retrieves ordered matching documents')
void writeByJsonPathMatchOrdered() {
new PgDB().withCloseable JsonFunctions.&writeByJsonPathMatchOrdered
}
@Test
@DisplayName('writeByJsonPath succeeds when no documents match')
void writeByJsonPathNoMatch() {
new PgDB().withCloseable JsonFunctions.&writeByJsonPathNoMatch
}
@Test
@DisplayName('writeFirstByFields retrieves a matching document')
void writeFirstByFieldsMatchOne() {
new PgDB().withCloseable JsonFunctions.&writeFirstByFieldsMatchOne
}
@Test
@DisplayName('writeFirstByFields retrieves a matching document among many')
void writeFirstByFieldsMatchMany() {
new PgDB().withCloseable JsonFunctions.&writeFirstByFieldsMatchMany
}
@Test
@DisplayName('writeFirstByFields retrieves a matching document among many (ordered)')
void writeFirstByFieldsMatchOrdered() {
new PgDB().withCloseable JsonFunctions.&writeFirstByFieldsMatchOrdered
}
@Test
@DisplayName('writeFirstByFields returns null when no document matches')
void writeFirstByFieldsNoMatch() {
new PgDB().withCloseable JsonFunctions.&writeFirstByFieldsNoMatch
}
@Test
@DisplayName('writeFirstByContains retrieves a matching document')
void writeFirstByContainsMatchOne() {
new PgDB().withCloseable JsonFunctions.&writeFirstByContainsMatchOne
}
@Test
@DisplayName('writeFirstByContains retrieves a matching document among many')
void writeFirstByContainsMatchMany() {
new PgDB().withCloseable JsonFunctions.&writeFirstByContainsMatchMany
}
@Test
@DisplayName('writeFirstByContains retrieves a matching document among many (ordered)')
void writeFirstByContainsMatchOrdered() {
new PgDB().withCloseable JsonFunctions.&writeFirstByContainsMatchOrdered
}
@Test
@DisplayName('writeFirstByContains returns null when no document matches')
void writeFirstByContainsNoMatch() {
new PgDB().withCloseable JsonFunctions.&writeFirstByContainsNoMatch
}
@Test
@DisplayName('writeFirstByJsonPath retrieves a matching document')
void writeFirstByJsonPathMatchOne() {
new PgDB().withCloseable JsonFunctions.&writeFirstByJsonPathMatchOne
}
@Test
@DisplayName('writeFirstByJsonPath retrieves a matching document among many')
void writeFirstByJsonPathMatchMany() {
new PgDB().withCloseable JsonFunctions.&writeFirstByJsonPathMatchMany
}
@Test
@DisplayName('writeFirstByJsonPath retrieves a matching document among many (ordered)')
void writeFirstByJsonPathMatchOrdered() {
new PgDB().withCloseable JsonFunctions.&writeFirstByJsonPathMatchOrdered
}
@Test
@DisplayName('writeFirstByJsonPath returns null when no document matches')
void writeFirstByJsonPathNoMatch() {
new PgDB().withCloseable JsonFunctions.&writeFirstByJsonPathNoMatch
}
}

View File

@ -21,6 +21,42 @@ final class SQLiteCustomIT {
new SQLiteDB().withCloseable CustomFunctions.&listAll
}
@Test
@DisplayName('jsonArray succeeds with empty array')
void jsonArrayEmpty() {
new SQLiteDB().withCloseable CustomFunctions.&jsonArrayEmpty
}
@Test
@DisplayName('jsonArray succeeds with a single-item array')
void jsonArraySingle() {
new SQLiteDB().withCloseable CustomFunctions.&jsonArraySingle
}
@Test
@DisplayName('jsonArray succeeds with a multi-item array')
void jsonArrayMany() {
new SQLiteDB().withCloseable CustomFunctions.&jsonArrayMany
}
@Test
@DisplayName('writeJsonArray succeeds with empty array')
void writeJsonArrayEmpty() {
new SQLiteDB().withCloseable CustomFunctions.&writeJsonArrayEmpty
}
@Test
@DisplayName('writeJsonArray succeeds with a single-item array')
void writeJsonArraySingle() {
new SQLiteDB().withCloseable CustomFunctions.&writeJsonArraySingle
}
@Test
@DisplayName('writeJsonArray succeeds with a multi-item array')
void writeJsonArrayMany() {
new SQLiteDB().withCloseable CustomFunctions.&writeJsonArrayMany
}
@Test
@DisplayName('single succeeds when document not found')
void singleNone() {

View File

@ -133,4 +133,126 @@ final class SQLiteJsonIT {
assertThrows(DocumentException) { JsonFunctions.firstByJsonPathMatchOne db }
}
}
@Test
@DisplayName('writeAll retrieves all documents')
void writeAllDefault() {
new SQLiteDB().withCloseable JsonFunctions.&writeAllDefault
}
@Test
@DisplayName('writeAll succeeds with an empty table')
void writeAllEmpty() {
new SQLiteDB().withCloseable JsonFunctions.&writeAllEmpty
}
@Test
@DisplayName('writeById retrieves a document via a string ID')
void writeByIdString() {
new SQLiteDB().withCloseable JsonFunctions.&writeByIdString
}
@Test
@DisplayName('writeById retrieves a document via a numeric ID')
void writeByIdNumber() {
new SQLiteDB().withCloseable JsonFunctions.&writeByIdNumber
}
@Test
@DisplayName('writeById returns null when a matching ID is not found')
void writeByIdNotFound() {
new SQLiteDB().withCloseable JsonFunctions.&writeByIdNotFound
}
@Test
@DisplayName('writeByFields retrieves matching documents')
void writeByFieldsMatch() {
new SQLiteDB().withCloseable JsonFunctions.&writeByFieldsMatch
}
@Test
@DisplayName('writeByFields retrieves ordered matching documents')
void writeByFieldsMatchOrdered() {
new SQLiteDB().withCloseable JsonFunctions.&writeByFieldsMatchOrdered
}
@Test
@DisplayName('writeByFields retrieves matching documents with a numeric IN clause')
void writeByFieldsMatchNumIn() {
new SQLiteDB().withCloseable JsonFunctions.&writeByFieldsMatchNumIn
}
@Test
@DisplayName('writeByFields succeeds when no documents match')
void writeByFieldsNoMatch() {
new SQLiteDB().withCloseable JsonFunctions.&writeByFieldsNoMatch
}
@Test
@DisplayName('writeByFields retrieves matching documents with an IN_ARRAY comparison')
void writeByFieldsMatchInArray() {
new SQLiteDB().withCloseable JsonFunctions.&writeByFieldsMatchInArray
}
@Test
@DisplayName('writeByFields succeeds when no documents match an IN_ARRAY comparison')
void writeByFieldsNoMatchInArray() {
new SQLiteDB().withCloseable JsonFunctions.&writeByFieldsNoMatchInArray
}
@Test
@DisplayName('writeByContains fails')
void writeByContainsFails() {
new SQLiteDB().withCloseable { db ->
assertThrows(DocumentException) { JsonFunctions.writeByContainsMatch db }
}
}
@Test
@DisplayName('writeByJsonPath fails')
void writeByJsonPathFails() {
new SQLiteDB().withCloseable { db ->
assertThrows(DocumentException) { JsonFunctions.writeByJsonPathMatch db }
}
}
@Test
@DisplayName('writeFirstByFields retrieves a matching document')
void writeFirstByFieldsMatchOne() {
new SQLiteDB().withCloseable JsonFunctions.&writeFirstByFieldsMatchOne
}
@Test
@DisplayName('writeFirstByFields retrieves a matching document among many')
void writeFirstByFieldsMatchMany() {
new SQLiteDB().withCloseable JsonFunctions.&writeFirstByFieldsMatchMany
}
@Test
@DisplayName('writeFirstByFields retrieves a matching document among many (ordered)')
void writeFirstByFieldsMatchOrdered() {
new SQLiteDB().withCloseable JsonFunctions.&writeFirstByFieldsMatchOrdered
}
@Test
@DisplayName('writeFirstByFields returns null when no document matches')
void writeFirstByFieldsNoMatch() {
new SQLiteDB().withCloseable JsonFunctions.&writeFirstByFieldsNoMatch
}
@Test
@DisplayName('writeFirstByContains fails')
void writeFirstByContainsFails() {
new SQLiteDB().withCloseable { db ->
assertThrows(DocumentException) { JsonFunctions.writeFirstByContainsMatchOne db }
}
}
@Test
@DisplayName('writeFirstByJsonPath fails')
void writeFirstByJsonPathFails() {
new SQLiteDB().withCloseable { db ->
assertThrows(DocumentException) { JsonFunctions.writeFirstByJsonPathMatchOne db }
}
}
}