Skip to content

Commit 0ff3de3

Browse files
authored
Merge pull request zaleslaw#5 from zaleslaw/Beta-3
Upgrade to the Beta-3
2 parents dc94936 + 7471b8d commit 0ff3de3

9 files changed

Lines changed: 274 additions & 272 deletions

build.gradle.kts

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import java.util.*
22

33
plugins {
4-
kotlin("jvm") version "2.0.0"
5-
id("org.jetbrains.kotlinx.dataframe") version "1.0.0-Beta2"
4+
kotlin("jvm") version "2.2.20"
5+
kotlin("plugin.dataframe") version "2.2.20"
6+
id("org.jetbrains.kotlinx.dataframe") version "1.0.0-Beta3"
67
}
78

89
group = "org.jetbrains.kotlinx.dataframe.examples"
@@ -13,7 +14,7 @@ repositories {
1314
}
1415

1516
dependencies {
16-
implementation ("org.jetbrains.kotlinx:dataframe:1.0.0-Beta2")
17+
implementation ("org.jetbrains.kotlinx:dataframe:1.0.0-Beta3")
1718
implementation ("org.jetbrains.kotlinx:kandy-lets-plot:0.8.1-dev-67")
1819
implementation ("org.jetbrains.kotlinx:kandy-api:0.8.1-dev-67")
1920
implementation ("org.mariadb.jdbc:mariadb-java-client:3.5.4")
@@ -22,41 +23,9 @@ dependencies {
2223
testImplementation(kotlin("test"))
2324
}
2425

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

gradle.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
11
kotlin.code.style=official
2+
ksp.useKSP2=false
3+
kotlin.dataframe.add.ksp=false
4+
kotlin.incremental=false
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
21
distributionBase=GRADLE_USER_HOME
32
distributionPath=wrapper/dists
4-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip
54
zipStoreBase=GRADLE_USER_HOME
65
zipStorePath=wrapper/dists

local.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
db.user=root
2-
db.password=pass
2+
db.password=pass
3+
db.url=jdbc:mariadb://localhost:3307/imdb

notebooks/imdb.ipynb

Lines changed: 186 additions & 186 deletions
Large diffs are not rendered by default.

src/main/kotlin/Example_1_Define_schema_manually.kt renamed to src/main/kotlin/Example_1_Add_Column.kt

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,38 @@ 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
13+
import org.jetbrains.kotlinx.dataframe.api.generateInterfaces
1114
import org.jetbrains.kotlinx.dataframe.io.readSqlTable
1215
import org.jetbrains.kotlinx.dataframe.io.DbConnectionConfig
1316

1417
@DataSchema
1518
interface Movies {
1619
val id: Int
1720
val name: String
18-
val year: Int
1921
val rank: Float?
22+
val year: Int
2023
}
2124

2225
fun main() {
2326
// define the database configuration
2427
val dbConfig = DbConnectionConfig(URL, USER_NAME, PASSWORD)
2528

2629
// read the table
27-
val movies = DataFrame.readSqlTable(dbConfig, TABLE_NAME_MOVIES, 10000).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)
2837

2938
// print the dataframe
3039
movies.print()
@@ -33,8 +42,19 @@ fun main() {
3342
movies.describe().print()
3443

3544
// print names of top-10 rated films
36-
movies.sortByDesc { rank }
45+
movies
46+
.sortByDesc { rank }
3747
.take(10)
3848
.select { name }
3949
.print()
50+
51+
// add columns to the dataframe on-the-fly
52+
movies
53+
.sortByDesc { rank }
54+
.select { name and year }
55+
.add("oldFilm") { year < 1973 }
56+
.add("containsReward") { name.contains("Reward") }
57+
.filter { oldFilm and containsReward }
58+
.take(10)
59+
.print()
4060
}
Lines changed: 34 additions & 19 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()
5267
}

src/main/kotlin/Example_3_Import_schema_via_Gradle.kt renamed to src/main/kotlin/Example_3_API_Demonstration.kt

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ package org.jetbrains.kotlinx.dataframe.examples.jdbc
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)

src/main/kotlin/customdb/Example_1_Define_schema_manually.kt renamed to src/main/kotlin/customdb/Example_1_Simple_Example.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ fun main() {
2525
.renameToCamelCase()
2626
.cast<Orders>(verify = true)
2727

28-
df.filter { it.price > 800 }.print()
28+
// df.filter { it.price > 800 }.print()
2929

3030
removeTable(con)
3131
}

0 commit comments

Comments
 (0)