Skip to content

Commit 77dc646

Browse files
committed
Upgrade Gradle to 9.0.0, Kotlin to 2.2.20, and Kotlinx DataFrame to 1.0.0-Beta3. Refactor examples to use generateInterfaces for schema handling, deprecate commented configurations, and streamline SQL queries for improved readability and functionality. Disable incremental compilation.
1 parent a736c59 commit 77dc646

6 files changed

Lines changed: 79 additions & 85 deletions

build.gradle.kts

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import java.util.*
22

33
plugins {
44
kotlin("jvm") version "2.2.20"
5-
id("com.google.devtools.ksp") version "2.2.20-2.0.2"
5+
kotlin("plugin.dataframe") version "2.2.20"
66
id("org.jetbrains.kotlinx.dataframe") version "1.0.0-Beta3"
77
}
88

@@ -23,38 +23,6 @@ dependencies {
2323
testImplementation(kotlin("test"))
2424
}
2525

26-
val props = Properties()
27-
file("local.properties").inputStream().use { props.load(it) }
28-
29-
/*dataframes {
30-
schema {
31-
data = System.getenv("DB_URL") ?: props.getProperty("db.url")
32-
name = "org.jetbrains.kotlinx.dataframe.examples.jdbc.Actors"
33-
jdbcOptions {
34-
user = props.getProperty("db.user")
35-
password = props.getProperty("db.password")
36-
tableName = "actors"
37-
}
38-
}
39-
schema {
40-
data = System.getenv("DB_URL") ?: props.getProperty("db.url")
41-
name = "org.jetbrains.kotlinx.dataframe.examples.jdbc.TarantinoFilms"
42-
jdbcOptions {
43-
user = System.getenv("DB_USER") ?: props.getProperty("db.user")
44-
password = System.getenv("DB_PASSWORD") ?: props.getProperty("db.password")
45-
sqlQuery = """
46-
SELECT name, year, rank,
47-
GROUP_CONCAT (genre) as "genres"
48-
FROM movies JOIN movies_directors ON movie_id = movies.id
49-
JOIN directors ON directors.id=director_id LEFT JOIN movies_genres ON movies.id = movies_genres.movie_id
50-
WHERE directors.first_name = "Quentin" AND directors.last_name = "Tarantino"
51-
GROUP BY name, year, rank
52-
ORDER BY year
53-
"""
54-
}
55-
}
56-
}*/
57-
5826
tasks.test {
5927
useJUnitPlatform()
6028
}

gradle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
kotlin.code.style=official
22
ksp.useKSP2=false
33
kotlin.dataframe.add.ksp=false
4+
kotlin.incremental=false

gradle/wrapper/gradle-wrapper.properties

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
distributionBase=GRADLE_USER_HOME
32
distributionPath=wrapper/dists
43
distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip

src/main/kotlin/Example_1_Define_schema_manually.kt

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ package org.jetbrains.kotlinx.dataframe.examples.jdbc
22

33
import org.jetbrains.kotlinx.dataframe.DataFrame
44
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
5+
import org.jetbrains.kotlinx.dataframe.api.add
56
import org.jetbrains.kotlinx.dataframe.api.describe
67
import org.jetbrains.kotlinx.dataframe.api.select
78
import org.jetbrains.kotlinx.dataframe.api.cast
9+
import org.jetbrains.kotlinx.dataframe.api.filter
810
import org.jetbrains.kotlinx.dataframe.api.sortByDesc
911
import org.jetbrains.kotlinx.dataframe.api.print
1012
import org.jetbrains.kotlinx.dataframe.api.take
@@ -25,21 +27,35 @@ fun main() {
2527
val dbConfig = DbConnectionConfig(URL, USER_NAME, PASSWORD)
2628

2729
// read the table
28-
val movies = DataFrame.readSqlTable(dbConfig, TABLE_NAME_MOVIES, 10000)
29-
.cast<Movies>(verify=true)
30+
val df = DataFrame.readSqlTable(dbConfig, TABLE_NAME_MOVIES, 10000)
31+
32+
// generate Kotlin data classes or interfaces for the table schema
33+
// added as [Movies] interface above main() function
34+
df.generateInterfaces("Movies").print()
35+
36+
val movies = df.cast<Movies>(verify = true)
3037

3138
// print the dataframe
3239
movies.print()
3340

3441
// print the dataframe metadata and statistics
3542
movies.describe().print()
3643

37-
print(movies.generateInterfaces("Movies"))
38-
3944
// print names of top-10 rated films
4045
movies
41-
//.sortByDesc { rank }
46+
.sortByDesc { rank }
4247
.take(10)
4348
.select { name }
4449
.print()
50+
51+
val result = movies
52+
.sortByDesc { rank }
53+
.select { name and year }
54+
.add("oldFilm") { year < 1973 }
55+
.add("containsReward") { name.contains("Reward") }
56+
57+
result
58+
.filter { oldFilm and containsReward }
59+
.take(10)
60+
.print()
4561
}
Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,67 @@
1-
/*@file:ImportDataSchema(
2-
"Directors",
3-
URL,
4-
jdbcOptions = JdbcOptions(USER_NAME, PASSWORD, tableName = TABLE_NAME_DIRECTORS)
5-
)
6-
7-
@file:ImportDataSchema(
8-
"NewActors",
9-
URL,
10-
jdbcOptions = JdbcOptions(USER_NAME, PASSWORD, sqlQuery = ACTORS_IN_LATEST_MOVIES)
11-
)
12-
131
package org.jetbrains.kotlinx.dataframe.examples.jdbc
142

153
import org.jetbrains.kotlinx.dataframe.DataFrame
16-
import org.jetbrains.kotlinx.dataframe.annotations.ImportDataSchema
17-
import org.jetbrains.kotlinx.dataframe.annotations.JdbcOptions
4+
import org.jetbrains.kotlinx.dataframe.annotations.ColumnName
5+
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
186
import org.jetbrains.kotlinx.dataframe.api.cast
197
import org.jetbrains.kotlinx.dataframe.api.filter
208
import org.jetbrains.kotlinx.dataframe.api.print
219
import org.jetbrains.kotlinx.dataframe.api.groupBy
2210
import org.jetbrains.kotlinx.dataframe.api.count
11+
import org.jetbrains.kotlinx.dataframe.api.generateInterfaces
2312
import org.jetbrains.kotlinx.dataframe.io.readSqlQuery
2413
import org.jetbrains.kotlinx.dataframe.io.readSqlTable
2514
import org.jetbrains.kotlinx.dataframe.api.take
2615
import org.jetbrains.kotlinx.dataframe.io.DbConnectionConfig
2716

17+
@DataSchema
18+
interface Directors {
19+
@ColumnName("first_name")
20+
val firstName: String
21+
val id: Int
22+
@ColumnName("last_name")
23+
val lastName: String
24+
}
25+
26+
@DataSchema
27+
interface Actors {
28+
@ColumnName("first_name")
29+
val firstName: String
30+
@ColumnName("last_name")
31+
val lastName: String
32+
val name: String
33+
val role: String
34+
val year: Int
35+
}
36+
2837
fun main() {
2938
// Part 1: Reading the table `directors`
3039

3140
// define the database configuration
3241
val dbConfig = DbConnectionConfig(URL, USER_NAME, PASSWORD)
3342

3443
// read the table
35-
val directors = DataFrame.readSqlTable(dbConfig, TABLE_NAME_DIRECTORS, 1000).cast<Directors>()
44+
val df1 = DataFrame.readSqlTable(dbConfig, TABLE_NAME_DIRECTORS, 1000)
45+
df1.generateInterfaces("Directors").print()
46+
47+
val directors = df1.cast<Directors>()
3648

3749
// manipulate and print
38-
directors.filter { firstName != null && firstName!!.contains("A") }
50+
directors.filter { firstName.contains("A") }
3951
.take(10)
4052
.print()
4153

4254
// Part 2: Handle the table results of an SQL query
4355

4456
// read the data
45-
val newActors = DataFrame.readSqlQuery(dbConfig, ACTORS_IN_LATEST_MOVIES).cast<NewActors>()
46-
newActors.print()
57+
val df2 = DataFrame.readSqlQuery(dbConfig, ACTORS_IN_LATEST_MOVIES)
58+
df2.generateInterfaces("Actors").print()
59+
60+
val actors = df2.cast<Actors>()
61+
actors.print()
4762

4863
// build a report of different roles' popularity
49-
newActors.groupBy { role }
64+
actors.groupBy { role }
5065
.count()
5166
.print()
52-
}*/
67+
}
Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
/*package org.jetbrains.kotlinx.dataframe.examples.jdbc
1+
package org.jetbrains.kotlinx.dataframe.examples.jdbc
22

33
import java.sql.DriverManager
44
import java.util.Properties
55
import org.jetbrains.kotlinx.dataframe.DataFrame
6+
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
67
import org.jetbrains.kotlinx.dataframe.api.cast
78
import org.jetbrains.kotlinx.dataframe.api.describe
89
import org.jetbrains.kotlinx.dataframe.api.filter
10+
import org.jetbrains.kotlinx.dataframe.api.generateInterfaces
911
import org.jetbrains.kotlinx.dataframe.api.print
1012
import org.jetbrains.kotlinx.dataframe.io.db.MySql
1113
import org.jetbrains.kotlinx.dataframe.io.getSchemaForResultSet
@@ -16,22 +18,14 @@ import org.jetbrains.kotlinx.dataframe.io.readResultSet
1618
import org.jetbrains.kotlinx.dataframe.io.readSqlQuery
1719
import org.jetbrains.kotlinx.dataframe.io.readSqlTable
1820

19-
/**
20-
* For this example, the schema importing was configured in Gradle in the
21-
* ```kotlin
22-
* dataframes {
23-
* schema {
24-
* ...
25-
* }
26-
* }
27-
* ```
28-
* section.
29-
*
30-
* Open the `build.gradle.kts` to see or edit.
31-
*
32-
* NOTE: The idea of this example is to cover more available functionality
33-
* and demonstrate different ways to establish connection to the database.
34-
*/
21+
@DataSchema
22+
interface TarantinoFilms {
23+
val genres: String?
24+
val name: String
25+
val rank: Float?
26+
val year: Int
27+
}
28+
3529
fun main() {
3630
val props = Properties()
3731
props.setProperty("user", USER_NAME)
@@ -42,12 +36,10 @@ fun main() {
4236
DriverManager.getConnection(URL, props).use { connection ->
4337
// read the data from the SQL table
4438
val actors = DataFrame.readSqlTable(connection, TABLE_NAME_ACTORS, 100).cast<Actors>()
45-
46-
// TODO: .cast<Actors>(verify=true)
4739
actors.print()
4840

4941
// filter and print the data
50-
actors.filter { firstName!=null && firstName!!.contains("J") }.print()
42+
actors.filter { firstName.contains("J") }.print()
5143

5244
// extract the schema of the SQL table
5345
val actorSchema = DataFrame.getSchemaForSqlTable(connection, TABLE_NAME_ACTORS)
@@ -58,12 +50,15 @@ fun main() {
5850
println("---------------------------- Part 2: SQL Query ------------------------------------")
5951
DriverManager.getConnection(URL, props).use { connection ->
6052
// read the data from as a result of an executed SQL query
61-
val tarantinoFilms = DataFrame.readSqlQuery(connection, TARANTINO_FILMS_SQL_QUERY, 100).cast<TarantinoFilms>()
62-
//TODO: .cast<TarantinoFilms>(verify=true)
53+
val tarantinoFilmsUntyped = DataFrame.readSqlQuery(connection, TARANTINO_FILMS_SQL_QUERY, 100)
54+
tarantinoFilmsUntyped.generateInterfaces("TarantinoFilms").print()
55+
56+
val tarantinoFilms = tarantinoFilmsUntyped.cast<TarantinoFilms>()
57+
6358
tarantinoFilms.print()
6459

6560
// transform and print the data
66-
tarantinoFilms.filter { year != null && year!! > 2000 }.print()
61+
tarantinoFilms.filter { year > 2000 }.print()
6762

6863
// extract the schema of the SQL table
6964
val tarantinoFilmsSchema = DataFrame.getSchemaForSqlQuery(connection, TARANTINO_FILMS_SQL_QUERY)
@@ -77,10 +72,10 @@ fun main() {
7772
st.executeQuery(TARANTINO_FILMS_SQL_QUERY).use { rs ->
7873
// read the data from as a result of an executed SQL query
7974
val tarantinoFilms = DataFrame.readResultSet(rs, dbType = MySql, 100).cast<TarantinoFilms>()
80-
// TODO: .cast<TarantinoFilms>(verify=true)
75+
8176
tarantinoFilms.print()
8277
// transform and print the data
83-
tarantinoFilms.filter { year!= null && year!! > 2000 }.print()
78+
tarantinoFilms.filter { year > 2000 }.print()
8479

8580
// extract the schema of the SQL table
8681
val tarantinoFilmsSchema = DataFrame.getSchemaForResultSet(rs, dbType = MySql)
@@ -99,4 +94,4 @@ fun main() {
9994
it.describe()
10095
}
10196
}
102-
}*/
97+
}

0 commit comments

Comments
 (0)