Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add source and build for custom dialect #133

Merged
merged 13 commits into from
Feb 6, 2025
56 changes: 56 additions & 0 deletions .github/workflows/odps.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Publish CustomDialect JAR

on:
workflow_dispatch: # Allows manual triggering of the workflow
push:
tags:
- "caraml-store-spark/odps/v[0-9]+.[0-9]+.[0-9]+*"
paths:
- ".github/workflows/odps.yaml"
- "caraml-store-spark/src/main/scala/dev/caraml/spark/odps/**"

jobs:
build-and-publish:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v2

- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: "17"
distribution: "temurin"

- name: Build customDialectJar
uses: gradle/gradle-build-action@v2
with:
arguments: customDialectJar

- name: Publish customDialectJar
uses: actions/upload-artifact@v4
with:
name: custom-dialect
path: caraml-store-spark/build/libs/custom-dialect.jar

- name: Create Draft Prerelease
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref_name }}
release_name: Release ${{ github.ref_name }}
draft: true
prerelease: true

- name: Upload customDialectJar to Release
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: caraml-store-spark/build/libs/custom-dialect.jar
asset_name: custom-dialect.jar
asset_content_type: application/java-archive
40 changes: 39 additions & 1 deletion caraml-store-spark/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ plugins {
id 'caraml.scala'
id 'application'
id "com.github.johnrengelman.shadow" version "7.1.2"
id 'com.palantir.docker' version "0.34.0"
id 'com.palantir.docker' version "0.36.0"
id 'com.github.maiflai.scalatest' version "0.32"
id 'com.google.protobuf'
id 'idea'
id 'maven-publish'
}

ext {
Expand Down Expand Up @@ -148,3 +149,40 @@ sourceSets {
}
}
}


// Define a new task to package CustomDialect as an individual JAR
task customDialectJar(type: Jar) {
archiveBaseName.set('custom-dialect')
archiveVersion.set('')
archiveFileName.set('custom-dialect.jar')
from sourceSets.main.output
include 'dev/caraml/spark/odps/CustomDialect.class'
destinationDirectory.set(file("$buildDir/libs"))
doLast {
println "Path: ${destinationDirectory.get().asFile}/custom-dialect.jar"
}
}
customDialectJar.dependsOn classes


publishing {
publications {
customDialect(MavenPublication) {
artifactId = 'custom-dialect'
artifact("$buildDir/libs/custom-dialect.jar") {
builtBy customDialectJar
}
}
}
repositories {
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/caraml-dev/caraml-store")
credentials {
username = System.getenv("GITHUB_ACTOR")
password = System.getenv("GITHUB_TOKEN")
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package dev.caraml.spark.odps
import org.apache.spark.sql.jdbc.JdbcDialect
import org.apache.spark.sql.jdbc.JdbcType
import org.apache.spark.sql.types.DataType
import org.apache.spark.sql.types._
import org.apache.hbase.thirdparty.org.eclipse.jetty.util.ajax.JSON

class CustomDialect extends JdbcDialect {
override def canHandle(url: String): Boolean = {
url.startsWith("jdbc:odps")
}

override def quoteIdentifier(colName: String): String = {
s"$colName"
}

override def getJDBCType(dt: DataType): Option[JdbcType] = {
dt match {
case IntegerType => Option(JdbcType("INTEGER", java.sql.Types.INTEGER))
case LongType => Option(JdbcType("BIGINT", java.sql.Types.BIGINT))
case DoubleType =>
Option(JdbcType("DOUBLE", java.sql.Types.DOUBLE))
case FloatType => Option(JdbcType("FLOAT", java.sql.Types.FLOAT))
case ShortType => Option(JdbcType("SMALLINT", java.sql.Types.SMALLINT))
case ByteType => Option(JdbcType("TINYINT", java.sql.Types.TINYINT))
case BooleanType => Option(JdbcType("BOOLEAN", java.sql.Types.BOOLEAN))
case StringType => Option(JdbcType("STRING", java.sql.Types.CLOB))
case BinaryType => Option(JdbcType("BINARY", java.sql.Types.BINARY))
case TimestampType =>
Option(JdbcType("TIMESTAMP", java.sql.Types.TIMESTAMP))
case DateType => Option(JdbcType("DATE", java.sql.Types.DATE))
case t: DecimalType =>
Option(
JdbcType(
s"DECIMAL(${t.precision},${t.scale})",
java.sql.Types.DECIMAL
)
)
case VarcharType(length) => Option(JdbcType(s"VARCHAR($length)", java.sql.Types.VARCHAR))
// NOTE: Update when necessary
case _ => None
}
}
}
Loading