Skip to content

Instantly share code, notes, and snippets.

@prassee
Last active August 29, 2015 14:20
Show Gist options
  • Save prassee/a8ce333ee6ab1f5750db to your computer and use it in GitHub Desktop.
Save prassee/a8ce333ee6ab1f5750db to your computer and use it in GitHub Desktop.
CSV Driver
package demo
import java.sql.DriverManager
import java.util.Properties
import java.sql.ResultSet
object RuleQueryProcessor extends App {
val nestedSelect = """select cpu from ruleData where cpu > (select cpu from ruleData limit 1) and mem < (select mem from ruleData limit 1)"""
val nestedSelect_in = """select cpu from ruleData where cpu in (select cpu from ruleData)"""
val nestedSelect_with_2_col = """select cpu from ruleData where cpu = mem"""
val nestedSelect_with_sum = """select sum(cpu) from ruleData limit 1"""
val nonNested = """select * from ruleData"""
val csv = CSVDocConfig("cpu,mem,disk,io", "Int,Int,Int,Int")
val driver = CSVQueryDriver(csv)
println("--")
println(driver.executeQuery(nestedSelect).foreach { x => println(x.getString(1)) })
println("--")
println(driver.executeQuery(nestedSelect_in).foreach { x => println(x.getString(1)) })
println("--")
println(driver.executeQuery(nestedSelect_with_2_col).foreach { x => println(x.getString(1)) })
println("--")
println(driver.executeQuery(nestedSelect_with_sum).foreach { x => println(x.getString(1)) })
}
class CSVQueryDriver(props: Properties) {
private val c = DriverManager.getConnection("jdbc:relique:csv:/data", props)
val nestedRegexLimit = """.*(\(select.*\slimit\s\d+\)).*""".r
val nestedRegex = """.*(\(select.*\)).*""".r
def executeQuery(select: String) = {
doExecuteQuery(evalForNestedQuery(select))
}
def evalForNestedQuery(nestedSelect: String): String = {
nestedSelect match {
case nestedRegexLimit(nested) =>
println("matched -> " + nested)
val rs = doExecuteQuery(nested.tail.take(nested.length() - 2))
val x = rs.head.getString(1)
evalForNestedQuery(nestedSelect.replace(nested, x))
case nestedRegex(nested) =>
println("matched plain select")
val rs = doExecuteQuery(nested.tail.take(nested.length() - 2))
val x = rs.map { x => x.getString(1) }.mkString(",")
evalForNestedQuery(nestedSelect.replace(nested, "(" + x + ")"))
case _ =>
nestedSelect
}
}
private def doExecuteQuery[T](query: String) = {
val s = c.createStatement()
val rs = s.executeQuery(query)
val iter = new Iterator[ResultSet] {
def hasNext = rs.next()
def next() = rs
}
val x = iter.toSeq
x
}
def close = c.close()
}
case class CSVDocConfig(headers: String, headerTypes: String)
object CSVQueryDriver {
Class.forName("org.relique.jdbc.csv.CsvDriver")
def apply(csvConfig: CSVDocConfig) = {
val props = new Properties()
props.put("headerline", csvConfig.headers)
props.put("columnTypes", csvConfig.headerTypes)
new CSVQueryDriver(props)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment