Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion examples/kotlin/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,7 @@ compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}

buildScan { termsOfServiceUrl = "https://gradle.com/terms-of-service"; termsOfServiceAgree = "yes" }
buildScan {
termsOfServiceUrl = "https://gradle.com/terms-of-service"
termsOfServiceAgree = "yes"
}
2 changes: 1 addition & 1 deletion examples/kotlin/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#Sat Jan 25 10:45:34 EST 2020
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
Expand Down
5 changes: 4 additions & 1 deletion examples/kotlin/settings.gradle
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
rootProject.name = 'dbtest'
plugins {
id("com.gradle.enterprise").version("3.1.1")
}

rootProject.name = 'dbtest'
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@ import java.time.OffsetDateTime

enum class BookType(val value: String) {
FICTION("FICTION"),
NONFICTION("NONFICTION")
NONFICTION("NONFICTION");

companion object {
private val map = BookType.values().associateBy(BookType::value)
fun lookup(value: String) = map[value]
}
}

data class Author (
Expand All @@ -22,6 +27,6 @@ data class Book (
val title: String,
val year: Int,
val available: OffsetDateTime,
val tags: Array<String>
val tags: List<String>
)

Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package com.example.booktest.postgresql

import java.sql.Connection
import java.sql.SQLException
import java.sql.Types
import java.time.OffsetDateTime

const val booksByTags = """-- name: booksByTags :many
Expand All @@ -23,7 +24,7 @@ data class BooksByTagsRow (
val title: String,
val name: String,
val isbn: String,
val tags: Array<String>
val tags: List<String>
)

const val booksByTitleYear = """-- name: booksByTitleYear :many
Expand Down Expand Up @@ -69,7 +70,7 @@ data class CreateBookParams (
val title: String,
val year: Int,
val available: OffsetDateTime,
val tags: Array<String>
val tags: List<String>
)

const val deleteBook = """-- name: deleteBook :exec
Expand All @@ -95,7 +96,7 @@ WHERE book_id = ?

data class UpdateBookParams (
val title: String,
val tags: Array<String>,
val tags: List<String>,
val bookId: Int
)

Expand All @@ -107,17 +108,17 @@ WHERE book_id = ?

data class UpdateBookISBNParams (
val title: String,
val tags: Array<String>,
val tags: List<String>,
val bookId: Int,
val isbn: String
)

class QueriesImpl(private val conn: Connection) {

@Throws(SQLException::class)
fun booksByTags(dollar_1: Array<String>): List<BooksByTagsRow> {
fun booksByTags(dollar_1: List<String>): List<BooksByTagsRow> {
val stmt = conn.prepareStatement(booksByTags)
stmt.setArray(1, conn.createArrayOf("pg_catalog.varchar", dollar_1))
stmt.setArray(1, conn.createArrayOf("pg_catalog.varchar", dollar_1.toTypedArray()))

return stmt.executeQuery().use { results ->
val ret = mutableListOf<BooksByTagsRow>()
Expand All @@ -127,7 +128,7 @@ class QueriesImpl(private val conn: Connection) {
results.getString(2),
results.getString(3),
results.getString(4),
results.getArray(5).array as Array<String>
(results.getArray(5).array as Array<String>).toList()
))
}
ret
Expand All @@ -147,11 +148,11 @@ class QueriesImpl(private val conn: Connection) {
results.getInt(1),
results.getInt(2),
results.getString(3),
BookType.valueOf(results.getString(4)),
BookType.lookup(results.getString(4))!!,
results.getString(5),
results.getInt(6),
results.getObject(7, OffsetDateTime::class.java),
results.getArray(8).array as Array<String>
(results.getArray(8).array as Array<String>).toList()
))
}
ret
Expand Down Expand Up @@ -183,11 +184,11 @@ class QueriesImpl(private val conn: Connection) {
val stmt = conn.prepareStatement(createBook)
stmt.setInt(1, arg.authorId)
stmt.setString(2, arg.isbn)
stmt.setString(3, arg.booktype.value)
stmt.setObject(3, arg.booktype.value, Types.OTHER)
stmt.setString(4, arg.title)
stmt.setInt(5, arg.year)
stmt.setObject(6, arg.available)
stmt.setArray(7, conn.createArrayOf("pg_catalog.varchar", arg.tags))
stmt.setArray(7, conn.createArrayOf("pg_catalog.varchar", arg.tags.toTypedArray()))

return stmt.executeQuery().use { results ->
if (!results.next()) {
Expand All @@ -197,11 +198,11 @@ class QueriesImpl(private val conn: Connection) {
results.getInt(1),
results.getInt(2),
results.getString(3),
BookType.valueOf(results.getString(4)),
BookType.lookup(results.getString(4))!!,
results.getString(5),
results.getInt(6),
results.getObject(7, OffsetDateTime::class.java),
results.getArray(8).array as Array<String>
(results.getArray(8).array as Array<String>).toList()
)
if (results.next()) {
throw SQLException("expected one row in result set, but got many")
Expand Down Expand Up @@ -252,11 +253,11 @@ class QueriesImpl(private val conn: Connection) {
results.getInt(1),
results.getInt(2),
results.getString(3),
BookType.valueOf(results.getString(4)),
BookType.lookup(results.getString(4))!!,
results.getString(5),
results.getInt(6),
results.getObject(7, OffsetDateTime::class.java),
results.getArray(8).array as Array<String>
(results.getArray(8).array as Array<String>).toList()
)
if (results.next()) {
throw SQLException("expected one row in result set, but got many")
Expand All @@ -269,7 +270,7 @@ class QueriesImpl(private val conn: Connection) {
fun updateBook(arg: UpdateBookParams) {
val stmt = conn.prepareStatement(updateBook)
stmt.setString(1, arg.title)
stmt.setArray(2, conn.createArrayOf("pg_catalog.varchar", arg.tags))
stmt.setArray(2, conn.createArrayOf("pg_catalog.varchar", arg.tags.toTypedArray()))
stmt.setInt(3, arg.bookId)

stmt.execute()
Expand All @@ -280,7 +281,7 @@ class QueriesImpl(private val conn: Connection) {
fun updateBookISBN(arg: UpdateBookISBNParams) {
val stmt = conn.prepareStatement(updateBookISBN)
stmt.setString(1, arg.title)
stmt.setArray(2, conn.createArrayOf("pg_catalog.varchar", arg.tags))
stmt.setArray(2, conn.createArrayOf("pg_catalog.varchar", arg.tags.toTypedArray()))
stmt.setInt(3, arg.bookId)
stmt.setString(4, arg.isbn)

Expand Down
11 changes: 8 additions & 3 deletions examples/kotlin/src/main/kotlin/com/example/ondeck/Models.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@ import java.time.LocalDateTime
// Venues can be either open or closed
enum class Status(val value: String) {
OPEN("op!en"),
CLOSED("clo@sed")
CLOSED("clo@sed");

companion object {
private val map = Status.values().associateBy(Status::value)
fun lookup(value: String) = map[value]
}
}

data class City (
Expand All @@ -19,14 +24,14 @@ data class City (
data class Venue (
val id: Int,
val status: Status,
val statuses: Array<Status>,
val statuses: List<Status>,
// This value appears in public URLs
val slug: String,
val name: String,
val city: String,
val spotifyPlaylist: String,
val songkickId: String?,
val tags: Array<String>,
val tags: List<String>,
val createdAt: LocalDateTime
)

Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package com.example.ondeck

import java.sql.Connection
import java.sql.SQLException
import java.sql.Types
import java.time.LocalDateTime

interface Queries {
Expand Down
21 changes: 11 additions & 10 deletions examples/kotlin/src/main/kotlin/com/example/ondeck/QueriesImpl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package com.example.ondeck

import java.sql.Connection
import java.sql.SQLException
import java.sql.Types
import java.time.LocalDateTime

const val createCity = """-- name: createCity :one
Expand Down Expand Up @@ -49,8 +50,8 @@ data class CreateVenueParams (
val city: String,
val spotifyPlaylist: String,
val status: Status,
val statuses: Array<Status>,
val tags: Array<String>
val statuses: List<Status>,
val tags: List<String>
)

const val deleteVenue = """-- name: deleteVenue :exec
Expand Down Expand Up @@ -159,9 +160,9 @@ class QueriesImpl(private val conn: Connection) : Queries {
stmt.setString(2, arg.name)
stmt.setString(3, arg.city)
stmt.setString(4, arg.spotifyPlaylist)
stmt.setString(5, arg.status.value)
stmt.setObject(5, arg.status.value, Types.OTHER)
stmt.setArray(6, conn.createArrayOf("status", arg.statuses.map { v -> v.value }.toTypedArray()))
stmt.setArray(7, conn.createArrayOf("text", arg.tags))
stmt.setArray(7, conn.createArrayOf("text", arg.tags.toTypedArray()))

return stmt.executeQuery().use { results ->
if (!results.next()) {
Expand Down Expand Up @@ -216,14 +217,14 @@ class QueriesImpl(private val conn: Connection) : Queries {
}
val ret = Venue(
results.getInt(1),
Status.valueOf(results.getString(2)),
(results.getArray(3).array as Array<String>).map { v -> Status.valueOf(v) }.toTypedArray(),
Status.lookup(results.getString(2))!!,
(results.getArray(3).array as Array<String>).map { v -> Status.lookup(v)!! }.toList(),
results.getString(4),
results.getString(5),
results.getString(6),
results.getString(7),
results.getString(8),
results.getArray(9).array as Array<String>,
(results.getArray(9).array as Array<String>).toList(),
results.getObject(10, LocalDateTime::class.java)
)
if (results.next()) {
Expand Down Expand Up @@ -259,14 +260,14 @@ class QueriesImpl(private val conn: Connection) : Queries {
while (results.next()) {
ret.add(Venue(
results.getInt(1),
Status.valueOf(results.getString(2)),
(results.getArray(3).array as Array<String>).map { v -> Status.valueOf(v) }.toTypedArray(),
Status.lookup(results.getString(2))!!,
(results.getArray(3).array as Array<String>).map { v -> Status.lookup(v)!! }.toList(),
results.getString(4),
results.getString(5),
results.getString(6),
results.getString(7),
results.getString(8),
results.getArray(9).array as Array<String>,
(results.getArray(9).array as Array<String>).toList(),
results.getObject(10, LocalDateTime::class.java)
))
}
Expand Down
60 changes: 60 additions & 0 deletions examples/kotlin/src/main/resources/booktest/postgresql/query.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
-- name: GetAuthor :one
SELECT * FROM authors
WHERE author_id = $1;

-- name: GetBook :one
SELECT * FROM books
WHERE book_id = $1;

-- name: DeleteBook :exec
DELETE FROM books
WHERE book_id = $1;

-- name: BooksByTitleYear :many
SELECT * FROM books
WHERE title = $1 AND year = $2;

-- name: BooksByTags :many
SELECT
book_id,
title,
name,
isbn,
tags
FROM books
LEFT JOIN authors ON books.author_id = authors.author_id
WHERE tags && $1::varchar[];

-- name: CreateAuthor :one
INSERT INTO authors (name) VALUES ($1)
RETURNING *;

-- name: CreateBook :one
INSERT INTO books (
author_id,
isbn,
booktype,
title,
year,
available,
tags
) VALUES (
$1,
$2,
$3,
$4,
$5,
$6,
$7
)
RETURNING *;

-- name: UpdateBook :exec
UPDATE books
SET title = $1, tags = $2
WHERE book_id = $3;

-- name: UpdateBookISBN :exec
UPDATE books
SET title = $1, tags = $2, isbn = $4
WHERE book_id = $3;
37 changes: 37 additions & 0 deletions examples/kotlin/src/main/resources/booktest/postgresql/schema.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
DROP TABLE IF EXISTS books CASCADE;
DROP TYPE IF EXISTS book_type CASCADE;
DROP TABLE IF EXISTS authors CASCADE;
DROP FUNCTION IF EXISTS say_hello(text) CASCADE;

CREATE TABLE authors (
author_id SERIAL PRIMARY KEY,
name text NOT NULL DEFAULT ''
);

CREATE INDEX authors_name_idx ON authors(name);

CREATE TYPE book_type AS ENUM (
'FICTION',
'NONFICTION'
);

CREATE TABLE books (
book_id SERIAL PRIMARY KEY,
author_id integer NOT NULL REFERENCES authors(author_id),
isbn text NOT NULL DEFAULT '' UNIQUE,
booktype book_type NOT NULL DEFAULT 'FICTION',
title text NOT NULL DEFAULT '',
year integer NOT NULL DEFAULT 2000,
available timestamp with time zone NOT NULL DEFAULT 'NOW()',
tags varchar[] NOT NULL DEFAULT '{}'
);

CREATE INDEX books_title_idx ON books(title, year);

CREATE FUNCTION say_hello(text) RETURNS text AS $$
BEGIN
RETURN CONCAT('hello ', $1);
END;
$$ LANGUAGE plpgsql;

CREATE INDEX books_title_lower_idx ON books(title);
Loading