Skip to content

Instantly share code, notes, and snippets.

@jeppenejsum
Created June 5, 2012 16:47
Show Gist options
  • Save jeppenejsum/2876178 to your computer and use it in GitHub Desktop.
Save jeppenejsum/2876178 to your computer and use it in GitHub Desktop.
Slow Anorm parser
private def parser: RowParser[VehicleListItem] = {
long("org_unit_id")~str("vin")~(str("license_plate") ?)~(str("driver") ?)~(str("leasing_company") ?)~(date("contract_start")?)~(int("contract_duration")?) map {
case ou~vin~licensePlate~driver~lc~contractStart~duration =>
VehicleListItem(java.util.UUID.randomUUID, VIN(vin), OrgUnitId(ou), licensePlate.getOrElse(""), driver.getOrElse(""), lc.getOrElse(""),contractStart.map(LocalDate.fromDateFields(_)), duration.getOrElse(0))
}
}
private def specParser: RowParser[VehicleListSpec] = {
str("vehicle_type")~str("brand")~str("model")~str("variant")~(str("body_type")?) map {
case vt~b~m~variant~bt => VehicleListSpec(vt,b,m,variant,bt.getOrElse(""))
}
}
val rs = TimeHelpers.logTime("Create result set") {
SQL("""
SELECT * FROM assets_vehicles JOIN
models m ON model_id = m.id JOIN
brands b on brand_id = b.id
WHERE account_id={tid} AND org_unit_id={ou}
""").
on("tid" -> tenantId, "ou" -> rootOrgUnitId).resultSet()
}
TimeHelpers.logTime("Parse result set") {
Sql.as((parser~specParser).map {
case v~t => v -> t
} *, rs)
}
/*
Result
18:43:05.186 INFO net.liftweb.util.TimeHelpers account=21, user=27 - Create result set took 653 Milliseconds
18:43:16.837 INFO net.liftweb.util.TimeHelpers account=21, user=27 - Parse result set took 11650 Milliseconds
18:43:16.838 TRACE f.a.VehicleMenus$$anonfun$listOp$1$$anon$1 account=21, user=27 - Fetched all 20068 records
*/
val rs = TimeHelpers.logTime("Create result set") {
SQL("""
SELECT * FROM assets_vehicles JOIN
models m ON model_id = m.id JOIN
brands b on brand_id = b.id
WHERE account_id={tid} AND org_unit_id={ou}
""").
on("tid" -> tenantId, "ou" -> rootOrgUnitId).resultSet()
}
TimeHelpers.logTime("Parse result set") {
val s = new collection.mutable.ListBuffer[(VehicleListItem, VehicleListSpec)]()
def str(c: String) = rs.getString(c)
def optStr(c: String) = {
val s = rs.getString(c)
if (rs.wasNull) None else Some(s)
}
def long(c: String) = rs.getLong(c)
def optInt(c: String) = {
val i = rs.getInt(c)
if (rs.wasNull) None else Some(i)
}
def optDate(c: String) = {
val d = rs.getDate(c)
if (rs.wasNull) None else Some(d)
}
while(rs.next) {
val vli = VehicleListItem(java.util.UUID.randomUUID, VIN(str("vin")), OrgUnitId(long("org_unit_id")),
optStr("license_plate").getOrElse(""), optStr("driver").getOrElse(""), optStr("leasing_company").getOrElse(""), optDate("contract_start").map(LocalDate.fromDateFields(_)), optInt("contract_duration").getOrElse(0))
val vls = VehicleListSpec(str("vehicle_type"), str("brand"), str("model"), str("variant"), optStr("body_type").getOrElse(""))
s += (vli -> vls)
}
s.toSeq
}
}
/*
Result
18:46:08.065 INFO net.liftweb.util.TimeHelpers account=21, user=27 - Create result set took 654 Milliseconds
18:46:08.952 INFO net.liftweb.util.TimeHelpers account=21, user=27 - Parse result set took 886 Milliseconds
18:46:08.954 TRACE f.a.VehicleMenus$$anonfun$listOp$1$$anon$1 account=21, user=27 - Fetched all 20068 records
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment