Mercurial > urweb
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), |