Last active
August 29, 2015 14:20
-
-
Save prassee/a8ce333ee6ab1f5750db to your computer and use it in GitHub Desktop.
CSV Driver
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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