comparison src/sql.sml @ 2213:365727ff68f4

Complete overhaul: cache queries based on immediate query result, not eventual HTML output.
author Ziv Scully <ziv@mit.edu>
date Tue, 14 Oct 2014 18:05:09 -0400
parents ef766ef6e242
children 639e62ca2530
comparison
equal deleted inserted replaced
2212:388ba4dc7c96 2213:365727ff68f4
268 (EPrim (Prim.String (Prim.Normal, "FALSE")), _))], _), _) :: chs => 268 (EPrim (Prim.String (Prim.Normal, "FALSE")), _))], _), _) :: chs =>
269 SOME (e, chs) 269 SOME (e, chs)
270 270
271 | _ => NONE 271 | _ => NONE
272 272
273 fun sqlifySqlcache chs =
274 case chs of
275 (* Match entire FFI application, not just its argument. *)
276 Exp (e' as EFfiApp ("Basis", f, [(_, _)]), _) :: chs =>
277 if String.isPrefix "sqlify" f then
278 SOME ((e', ErrorMsg.dummySpan), chs)
279 else
280 NONE
281 | Exp (ECase (e, [((PCon (_, PConFfi {mod = "Basis", con = "True", ...}, NONE), _),
282 (EPrim (Prim.String (Prim.Normal, "TRUE")), _)),
283 ((PCon (_, PConFfi {mod = "Basis", con = "False", ...}, NONE), _),
284 (EPrim (Prim.String (Prim.Normal, "FALSE")), _))], _), _) :: chs =>
285 SOME (e, chs)
286
287 | _ => NONE
288
273 fun constK s = wrap (const s) (fn () => s) 289 fun constK s = wrap (const s) (fn () => s)
274 290
275 val funcName = altL [constK "COUNT", 291 val funcName = altL [constK "COUNT",
276 constK "MIN", 292 constK "MIN",
277 constK "MAX", 293 constK "MAX",
278 constK "SUM", 294 constK "SUM",
279 constK "AVG"] 295 constK "AVG"]
280 296
281 val unmodeled = altL [const "COUNT(*)", 297 val unmodeled = altL [const "COUNT(*)",
282 const "CURRENT_TIMESTAMP"] 298 const "CURRENT_TIMESTAMP"]
299
300 val sqlcacheMode = ref false;
283 301
284 fun sqexp chs = 302 fun sqexp chs =
285 log "sqexp" 303 log "sqexp"
286 (altL [wrap prim SqConst, 304 (altL [wrap prim SqConst,
287 wrap (const "TRUE") (fn () => SqTrue), 305 wrap (const "TRUE") (fn () => SqTrue),
290 wrap field Field, 308 wrap field Field,
291 wrap uw_ident Computed, 309 wrap uw_ident Computed,
292 wrap known SqKnown, 310 wrap known SqKnown,
293 wrap func SqFunc, 311 wrap func SqFunc,
294 wrap unmodeled (fn () => Unmodeled), 312 wrap unmodeled (fn () => Unmodeled),
295 wrap sqlify Inj, 313 wrap (if !sqlcacheMode then sqlifySqlcache else sqlify) Inj,
296 wrap (follow (const "COALESCE(") (follow sqexp (follow (const ",") 314 wrap (follow (const "COALESCE(") (follow sqexp (follow (const ",")
297 (follow (keep (fn ch => ch <> #")")) (const ")"))))) 315 (follow (keep (fn ch => ch <> #")")) (const ")")))))
298 (fn ((), (e, _)) => e), 316 (fn ((), (e, _)) => e),
299 wrap (follow (const "(NOT ") (follow sqexp (const ")"))) 317 wrap (follow (const "(NOT ") (follow sqexp (const ")")))
300 (fn ((), (e, _)) => SqNot e), 318 (fn ((), (e, _)) => SqNot e),