Created
June 5, 2012 16:47
-
-
Save jeppenejsum/2876178 to your computer and use it in GitHub Desktop.
Slow Anorm parser
This file contains 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
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 | |
*/ |
This file contains 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
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