{"database": "shop", "private": false, "path": "/shop", "size": 2375680, "tables": [{"name": "categories", "columns": ["id", "name", "type", "master_category", "status", "language", "sort_order", "title", "description", "seo_content", "breadcrumb_trail", "canonical", "heading", "menu_name", "date_limit", "next_day_only", "preorder", "product_count", "scraped_at"], "primary_keys": ["id"], "count": 107, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [{"other_table": "product_categories", "column": "id", "other_column": "category_id"}], "outgoing": []}, "private": false}, {"name": "import_history", "columns": ["id", "import_type", "source_file", "records_processed", "records_created", "records_updated", "errors", "started_at", "completed_at"], "primary_keys": ["id"], "count": 5, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": []}, "private": false}, {"name": "potential_pairs", "columns": ["id", "similarity", "no_id", "no_name", "no_translated", "no_description", "no_price", "en_id", "en_name", "en_description", "en_price", "command"], "primary_keys": ["id"], "count": 29, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": []}, "private": false}, {"name": "product_backend_data", "columns": ["product_id", "instock", "inventory", "useinventory", "autostock", "sku", "title", "url_slug", "saleprice", "special", "saleexpire", "alcohol", "floral", "addon", "restricted", "vase", "raw_data", "scraped_at"], "primary_keys": ["product_id"], "count": 535, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "products", "column": "product_id", "other_column": "id"}]}, "private": false}, {"name": "product_categories", "columns": ["product_id", "category_id"], "primary_keys": ["product_id", "category_id"], "count": 2009, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "categories", "column": "category_id", "other_column": "id"}, {"other_table": "products", "column": "product_id", "other_column": "id"}]}, "private": false}, {"name": "product_images", "columns": ["id", "product_id", "size", "remote_url", "local_path", "downloaded_at", "file_size", "http_status", "width", "height", "md5_hash", "remote_last_modified"], "primary_keys": ["id"], "count": 535, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "products", "column": "product_id", "other_column": "id"}]}, "private": false}, {"name": "product_translations", "columns": ["id", "no_product_id", "en_product_id", "verified", "notes", "created_at"], "primary_keys": ["id"], "count": 113, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "products", "column": "en_product_id", "other_column": "id"}, {"other_table": "products", "column": "no_product_id", "other_column": "id"}]}, "private": false}, {"name": "product_variants", "columns": ["id", "product_id", "price", "description", "sort_order"], "primary_keys": ["id"], "count": 1249, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "products", "column": "product_id", "other_column": "id"}]}, "private": false}, {"name": "products", "columns": ["id", "name", "colour", "description", "page_title", "url_slug", "categories_raw", "language", "created_at", "updated_at", "deleted_at"], "primary_keys": ["id"], "count": 535, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [{"other_table": "product_variants", "column": "id", "other_column": "product_id"}, {"other_table": "product_categories", "column": "id", "other_column": "product_id"}, {"other_table": "product_translations", "column": "id", "other_column": "en_product_id"}, {"other_table": "product_translations", "column": "id", "other_column": "no_product_id"}, {"other_table": "product_images", "column": "id", "other_column": "product_id"}, {"other_table": "product_backend_data", "column": "id", "other_column": "product_id"}], "outgoing": []}, "private": false}, {"name": "schema_migrations", "columns": ["name", "applied_at"], "primary_keys": ["name"], "count": 4, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": []}, "private": false}, {"name": "sqlite_sequence", "columns": ["name", "seq"], "primary_keys": [], "count": 6, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": []}, "private": false}], "hidden_count": 0, "views": [{"name": "products_full", "private": false}], "queries": [{"title": "Product Gallery (with images)", "sql": "SELECT p.id, p.name,\n       '{\"href\": \"/images/' || p.id || '.jpg\", \"img_src\": \"/images/' || p.id || '.jpg\"}' as image,\n       p.language, p.categories_raw,\n       CASE WHEN b.instock = 1 THEN 'In Stock'\n            WHEN b.instock = 0 THEN 'Out of Stock'\n            ELSE 'Unknown' END as stock_status\nFROM products p\nLEFT JOIN product_backend_data b ON p.id = b.product_id\nORDER BY p.name\nLIMIT 50\n", "name": "products_gallery", "private": false}, {"title": "Product List (links only)", "sql": "SELECT p.id, p.name,\n       '{\"href\": \"/images/' || p.id || '.jpg\", \"label\": \"View Image\"}' as image_link,\n       p.language, p.categories_raw,\n       CASE WHEN b.instock = 1 THEN 'In Stock'\n            WHEN b.instock = 0 THEN 'Out of Stock'\n            ELSE 'Unknown' END as stock_status\nFROM products p\nLEFT JOIN product_backend_data b ON p.id = b.product_id\nORDER BY p.name\n", "name": "products_list", "private": false}, {"title": "Products In Stock", "sql": "SELECT p.id, p.name,\n       '{\"href\": \"/images/' || p.id || '.jpg\", \"img_src\": \"/images/' || p.id || '.jpg\"}' as image,\n       p.language, p.categories_raw,\n       b.inventory\nFROM products p\nJOIN product_backend_data b ON p.id = b.product_id\nWHERE b.instock = 1\nORDER BY p.name\n", "name": "products_in_stock", "private": false}, {"title": "Products Out of Stock", "sql": "SELECT p.id, p.name,\n       '{\"href\": \"/images/' || p.id || '.jpg\", \"img_src\": \"/images/' || p.id || '.jpg\"}' as image,\n       p.language, p.categories_raw,\n       b.inventory\nFROM products p\nJOIN product_backend_data b ON p.id = b.product_id\nWHERE b.instock = 0\nORDER BY p.name\n", "name": "products_out_of_stock", "private": false}, {"title": "Norwegian Products", "sql": "SELECT id, name,\n       '{\"href\": \"/images/' || id || '.jpg\", \"img_src\": \"/images/' || id || '.jpg\"}' as image,\n       description, categories_raw\nFROM products\nWHERE language = 'no'\nORDER BY name\n", "name": "norwegian_products", "private": false}, {"title": "English Products", "sql": "SELECT id, name,\n       '{\"href\": \"/images/' || id || '.jpg\", \"img_src\": \"/images/' || id || '.jpg\"}' as image,\n       description, categories_raw\nFROM products\nWHERE language = 'en'\nORDER BY name\n", "name": "english_products", "private": false}, {"title": "NO/EN Translation Pairs", "sql": "SELECT\n  pt.no_product_id,\n  '{\"href\": \"/images/' || pt.no_product_id || '.jpg\", \"img_src\": \"/images/' || pt.no_product_id || '.jpg\"}' as no_image,\n  pn.name as norwegian_name,\n  GROUP_CONCAT(DISTINCT pvn.price) as no_prices,\n  CASE WHEN bn.instock = 1 THEN 'In Stock' WHEN bn.instock = 0 THEN 'Out' ELSE '?' END as no_stock,\n  pt.en_product_id,\n  '{\"href\": \"/images/' || pt.en_product_id || '.jpg\", \"img_src\": \"/images/' || pt.en_product_id || '.jpg\"}' as en_image,\n  pe.name as english_name,\n  GROUP_CONCAT(DISTINCT pve.price) as en_prices,\n  CASE WHEN be.instock = 1 THEN 'In Stock' WHEN be.instock = 0 THEN 'Out' ELSE '?' END as en_stock,\n  CASE WHEN GROUP_CONCAT(DISTINCT pvn.price) != GROUP_CONCAT(DISTINCT pve.price)\n       THEN 'DIFFERENT' ELSE 'same' END as price_match,\n  CASE WHEN bn.instock != be.instock THEN 'MISMATCH' ELSE 'same' END as stock_match,\n  CASE WHEN pin.md5_hash = pie.md5_hash THEN 'same'\n       WHEN pin.md5_hash IS NULL OR pie.md5_hash IS NULL THEN '?'\n       ELSE 'DIFFERENT' END as image_match,\n  pt.verified\nFROM product_translations pt\nJOIN products pn ON pt.no_product_id = pn.id\nJOIN products pe ON pt.en_product_id = pe.id\nLEFT JOIN product_variants pvn ON pn.id = pvn.product_id\nLEFT JOIN product_variants pve ON pe.id = pve.product_id\nLEFT JOIN product_backend_data bn ON pn.id = bn.product_id\nLEFT JOIN product_backend_data be ON pe.id = be.product_id\nLEFT JOIN product_images pin ON pn.id = pin.product_id\nLEFT JOIN product_images pie ON pe.id = pie.product_id\nGROUP BY pt.no_product_id, pt.en_product_id\nORDER BY pn.name\n", "name": "translation_pairs", "private": false}, {"title": "NO/EN Pairs with Differences", "sql": "SELECT\n  pt.no_product_id,\n  '{\"href\": \"/images/' || pt.no_product_id || '.jpg\", \"img_src\": \"/images/' || pt.no_product_id || '.jpg\"}' as no_image,\n  pn.name as norwegian_name,\n  GROUP_CONCAT(DISTINCT pvn.price) as no_prices,\n  CASE WHEN bn.instock = 1 THEN 'In Stock' WHEN bn.instock = 0 THEN 'Out' ELSE '?' END as no_stock,\n  pt.en_product_id,\n  '{\"href\": \"/images/' || pt.en_product_id || '.jpg\", \"img_src\": \"/images/' || pt.en_product_id || '.jpg\"}' as en_image,\n  pe.name as english_name,\n  GROUP_CONCAT(DISTINCT pve.price) as en_prices,\n  CASE WHEN be.instock = 1 THEN 'In Stock' WHEN be.instock = 0 THEN 'Out' ELSE '?' END as en_stock,\n  CASE WHEN GROUP_CONCAT(DISTINCT pvn.price) != GROUP_CONCAT(DISTINCT pve.price)\n       THEN 'DIFFERENT' ELSE 'same' END as price_match,\n  CASE WHEN bn.instock != be.instock THEN 'MISMATCH' ELSE 'same' END as stock_match,\n  CASE WHEN pin.md5_hash = pie.md5_hash THEN 'same'\n       WHEN pin.md5_hash IS NULL OR pie.md5_hash IS NULL THEN '?'\n       ELSE 'DIFFERENT' END as image_match\nFROM product_translations pt\nJOIN products pn ON pt.no_product_id = pn.id\nJOIN products pe ON pt.en_product_id = pe.id\nLEFT JOIN product_variants pvn ON pn.id = pvn.product_id\nLEFT JOIN product_variants pve ON pe.id = pve.product_id\nLEFT JOIN product_backend_data bn ON pn.id = bn.product_id\nLEFT JOIN product_backend_data be ON pe.id = be.product_id\nLEFT JOIN product_images pin ON pn.id = pin.product_id\nLEFT JOIN product_images pie ON pe.id = pie.product_id\nGROUP BY pt.no_product_id, pt.en_product_id\nHAVING\n  GROUP_CONCAT(DISTINCT pvn.price) != GROUP_CONCAT(DISTINCT pve.price)\n  OR bn.instock != be.instock\n  OR (pin.md5_hash != pie.md5_hash AND pin.md5_hash IS NOT NULL AND pie.md5_hash IS NOT NULL)\nORDER BY pn.name\n", "name": "translation_mismatches", "private": false}, {"title": "NO/EN Pairs with Language Conflicts", "sql": "SELECT\n  pt.no_product_id,\n  '{\"href\": \"/images/' || pt.no_product_id || '.jpg\", \"img_src\": \"/images/' || pt.no_product_id || '.jpg\"}' as no_image,\n  pn.name as no_name,\n  pn.language as no_detected_lang,\n  CASE WHEN pn.language = 'en' THEN 'WRONG - English!'\n       WHEN pn.language IS NULL THEN 'Unknown'\n       ELSE 'OK' END as no_lang_status,\n  pt.en_product_id,\n  '{\"href\": \"/images/' || pt.en_product_id || '.jpg\", \"img_src\": \"/images/' || pt.en_product_id || '.jpg\"}' as en_image,\n  pe.name as en_name,\n  pe.language as en_detected_lang,\n  CASE WHEN pe.language = 'no' THEN 'WRONG - Norwegian!'\n       WHEN pe.language IS NULL THEN 'Unknown'\n       ELSE 'OK' END as en_lang_status\nFROM product_translations pt\nJOIN products pn ON pt.no_product_id = pn.id\nJOIN products pe ON pt.en_product_id = pe.id\nWHERE pn.language = 'en'\n   OR pe.language = 'no'\n   OR (pn.language IS NULL AND pe.language IS NULL)\nORDER BY pn.name\n", "name": "translation_conflicts", "private": false}, {"title": "Products with Language but No Translation Pair", "sql": "SELECT\n  p.id,\n  '{\"href\": \"/images/' || p.id || '.jpg\", \"img_src\": \"/images/' || p.id || '.jpg\"}' as image,\n  p.name,\n  p.language,\n  p.categories_raw,\n  CASE WHEN b.instock = 1 THEN 'In Stock' WHEN b.instock = 0 THEN 'Out' ELSE '?' END as stock_status\nFROM products p\nLEFT JOIN product_translations pt_no ON p.id = pt_no.no_product_id\nLEFT JOIN product_translations pt_en ON p.id = pt_en.en_product_id\nLEFT JOIN product_backend_data b ON p.id = b.product_id\nWHERE p.language IS NOT NULL\n  AND pt_no.no_product_id IS NULL\n  AND pt_en.en_product_id IS NULL\nORDER BY p.language, p.name\n", "name": "products_without_translation", "private": false}, {"title": "Potential Pairs - Same Image", "sql": "SELECT\n  p1.id as no_id,\n  '{\"href\": \"/images/' || p1.id || '.jpg\", \"img_src\": \"/images/' || p1.id || '.jpg\"}' as no_image,\n  p1.name as no_name,\n  p2.id as en_id,\n  '{\"href\": \"/images/' || p2.id || '.jpg\", \"img_src\": \"/images/' || p2.id || '.jpg\"}' as en_image,\n  p2.name as en_name,\n  'python cli.py add-pair ' || p1.id || ' ' || p2.id as command\nFROM products p1\nJOIN product_images pi1 ON p1.id = pi1.product_id\nJOIN product_images pi2 ON pi1.md5_hash = pi2.md5_hash AND pi1.product_id != pi2.product_id\nJOIN products p2 ON p2.id = pi2.product_id\nLEFT JOIN product_translations pt1 ON p1.id = pt1.no_product_id OR p1.id = pt1.en_product_id\nLEFT JOIN product_translations pt2 ON p2.id = pt2.no_product_id OR p2.id = pt2.en_product_id\nWHERE pt1.no_product_id IS NULL\n  AND pt2.no_product_id IS NULL\n  AND p1.id < p2.id\n  AND ((p1.language = 'no' AND p2.language = 'en') OR (p1.language IS NULL OR p2.language IS NULL))\n  AND pi1.md5_hash != 'ecd12966ed20c8ca8afd0c2bd48cd769'\nORDER BY p1.name\n", "name": "potential_pairs_by_image", "private": false}, {"title": "Potential Pairs - Same Prices, No Pair", "sql": "SELECT\n  p1.id as no_id,\n  '{\"href\": \"/images/' || p1.id || '.jpg\", \"img_src\": \"/images/' || p1.id || '.jpg\"}' as no_image,\n  p1.name as no_name,\n  pv1.price,\n  p2.id as en_id,\n  '{\"href\": \"/images/' || p2.id || '.jpg\", \"img_src\": \"/images/' || p2.id || '.jpg\"}' as en_image,\n  p2.name as en_name,\n  'python cli.py add-pair ' || p1.id || ' ' || p2.id as command\nFROM products p1\nJOIN product_variants pv1 ON p1.id = pv1.product_id\nJOIN product_variants pv2 ON pv1.price = pv2.price AND pv1.product_id != pv2.product_id\nJOIN products p2 ON p2.id = pv2.product_id\nLEFT JOIN product_translations pt1 ON p1.id = pt1.no_product_id OR p1.id = pt1.en_product_id\nLEFT JOIN product_translations pt2 ON p2.id = pt2.no_product_id OR p2.id = pt2.en_product_id\nLEFT JOIN product_images pi1 ON p1.id = pi1.product_id\nLEFT JOIN product_images pi2 ON p2.id = pi2.product_id\nWHERE pt1.no_product_id IS NULL\n  AND pt2.no_product_id IS NULL\n  AND p1.language = 'no' AND p2.language = 'en'\n  AND p1.id < p2.id\n  AND (pi1.md5_hash IS NULL OR pi1.md5_hash != 'ecd12966ed20c8ca8afd0c2bd48cd769')\n  AND (pi2.md5_hash IS NULL OR pi2.md5_hash != 'ecd12966ed20c8ca8afd0c2bd48cd769')\nGROUP BY p1.id, p2.id\nORDER BY p1.name\n", "name": "potential_pairs_by_price", "private": false}, {"title": "Review Potential Pairs (by name similarity)", "sql": "SELECT\n  pp.similarity,\n  '{\"href\": \"/images/' || pp.no_id || '.jpg\", \"img_src\": \"/images/' || pp.no_id || '.jpg\"}' as no_image,\n  pp.no_name,\n  pp.no_translated,\n  pp.no_description,\n  pp.no_price,\n  '{\"href\": \"/images/' || pp.en_id || '.jpg\", \"img_src\": \"/images/' || pp.en_id || '.jpg\"}' as en_image,\n  pp.en_name,\n  pp.en_description,\n  pp.en_price,\n  pp.command\nFROM potential_pairs pp\nORDER BY pp.similarity DESC\n", "name": "potential_pairs_review", "private": false}, {"title": "Products with Price Variants", "sql": "SELECT p.id, p.name,\n       '{\"href\": \"/images/' || p.id || '.jpg\", \"img_src\": \"/images/' || p.id || '.jpg\"}' as image,\n       GROUP_CONCAT(pv.price || ' (' || pv.description || ')', ', ') as variants\nFROM products p\nJOIN product_variants pv ON p.id = pv.product_id\nGROUP BY p.id\nORDER BY p.name\n", "name": "products_with_variants", "private": false}, {"title": "Category Product Counts", "sql": "SELECT c.name as category, COUNT(pc.product_id) as product_count\nFROM categories c\nLEFT JOIN product_categories pc ON c.id = pc.category_id\nGROUP BY c.id\nORDER BY product_count DESC\n", "name": "category_product_counts", "private": false}, {"title": "Categories by Master Category", "sql": "SELECT\n  master_category,\n  name,\n  type,\n  status,\n  product_count,\n  description\nFROM categories\nWHERE master_category IS NOT NULL AND master_category != ''\nORDER BY master_category, sort_order, name\n", "name": "categories_hierarchy", "private": false}, {"title": "Master Category Summary", "sql": "SELECT\n  master_category,\n  type,\n  COUNT(*) as category_count,\n  SUM(product_count) as total_products\nFROM categories\nWHERE master_category IS NOT NULL AND master_category != ''\nGROUP BY master_category, type\nORDER BY total_products DESC\n", "name": "master_category_summary", "private": false}, {"title": "Products with Norwegian Characters (\u00e6\u00f8\u00e5)", "sql": "SELECT id, name,\n       '{\"href\": \"/images/' || id || '.jpg\", \"img_src\": \"/images/' || id || '.jpg\"}' as image,\n       language\nFROM products\nWHERE name LIKE '%\u00e6%' OR name LIKE '%\u00f8%' OR name LIKE '%\u00e5%'\n   OR name LIKE '%\u00c6%' OR name LIKE '%\u00d8%' OR name LIKE '%\u00c5%'\nORDER BY name\n", "name": "products_norwegian_chars", "private": false}, {"title": "Non-Square Product Images", "sql": "SELECT p.id, p.name,\n       '{\"href\": \"/images/' || p.id || '.jpg\", \"img_src\": \"/images/' || p.id || '.jpg\"}' as image,\n       pi.width, pi.height,\n       ROUND(CAST(pi.width AS FLOAT) / pi.height, 3) as ratio,\n       CASE WHEN b.instock = 1 THEN 'In Stock'\n            WHEN b.instock = 0 THEN 'Out of Stock'\n            ELSE 'Unknown' END as stock_status\nFROM products p\nJOIN product_images pi ON p.id = pi.product_id\nLEFT JOIN product_backend_data b ON p.id = b.product_id\nWHERE ABS(CAST(pi.width AS FLOAT) / pi.height - 1.0) >= 0.005\nORDER BY ABS(CAST(pi.width AS FLOAT) / pi.height - 1.0) DESC\n", "name": "non_square_images", "private": false}, {"title": "Product Details (with backend data)", "sql": "SELECT p.id, p.name,\n       '{\"href\": \"/images/' || p.id || '.jpg\", \"img_src\": \"/images/' || p.id || '.jpg\"}' as image,\n       p.language, p.description,\n       p.categories_raw,\n       CASE WHEN b.instock = 1 THEN 'In Stock'\n            WHEN b.instock = 0 THEN 'Out of Stock'\n            ELSE 'Unknown' END as stock_status,\n       b.inventory,\n       b.useinventory,\n       b.autostock,\n       pi.width || 'x' || pi.height as image_size,\n       ROUND(CAST(pi.width AS FLOAT) / pi.height, 3) as image_ratio\nFROM products p\nLEFT JOIN product_backend_data b ON p.id = b.product_id\nLEFT JOIN product_images pi ON p.id = pi.product_id\nORDER BY p.name\n", "name": "product_details", "private": false}], "allow_execute_sql": true, "query_ms": 11.05432800250128}