Extract a simple equality filter on a known PK column.
(filter: &Filter)
| 38 | |
| 39 | /// Extract a simple equality filter on a known PK column. |
| 40 | fn extract_pk_equality(filter: &Filter) -> Option<(String, SqlValue)> { |
| 41 | match &filter.expr { |
| 42 | FilterExpr::Comparison { |
| 43 | field, |
| 44 | op: CompareOp::Eq, |
| 45 | value, |
| 46 | } => { |
| 47 | // Only optimize for known PK columns. |
| 48 | let f = field.to_lowercase(); |
| 49 | if f == "id" || f == "document_id" || f == "key" { |
| 50 | Some((f, value.clone())) |
| 51 | } else { |
| 52 | None |
| 53 | } |
| 54 | } |
| 55 | FilterExpr::Expr(SqlExpr::BinaryOp { |
| 56 | left, |
| 57 | op: BinaryOp::Eq, |
| 58 | right, |
| 59 | }) => { |
| 60 | let col = match left.as_ref() { |
| 61 | SqlExpr::Column { name, .. } => name.to_lowercase(), |
| 62 | _ => return None, |
| 63 | }; |
| 64 | if col != "id" && col != "document_id" && col != "key" { |
| 65 | return None; |
| 66 | } |
| 67 | let val = match right.as_ref() { |
| 68 | SqlExpr::Literal(v) => v.clone(), |
| 69 | _ => return None, |
| 70 | }; |
| 71 | Some((col, val)) |
| 72 | } |
| 73 | _ => None, |
| 74 | } |
| 75 | } |