Date post: | 18-Dec-2015 |
Category: |
Documents |
View: | 213 times |
Download: | 0 times |
CryCupboard 2.0The New Face to Grocery Shopping
Cheralyn Cofer
CS491
5.29.06
cry cupboard?
• Definition• Origin• Why use it as a website name?
Recap
• What is CryCupboard.com’s service?
– The 3 C’s:• Centralization• Cross-referencing• Coordination
• Why do we need it?
The Larger Aspiration
• Combat the fastfood phenomena
• Internet niche that’s still untapped
• Tool to help career parents
The Personal Aspiration
What we’ll discuss
• Rethinking the orthography
• The grocery list as a “smart list”
• Some SQL insights
• The traditional one-to-many organization of a recipe box
• Problem: Is Chicken Caesar Salad a chicken dish or a salad dish?
• It can be both!
Rethinking the orthography
Recipe Meal Type
• The virtual recipe box allows many-to-many organization
• There is no “shelf”– Chicken Caesar Salad is both a chicken dish and a salad
• Restructuring
Rethinking the orthography
Recipe Meal TypeRecipeTypeLine
• Step 1: The big picture
The grocery list as a “smart list”
SELECT [recipe ingredients]…
UNION
SELECT [ad-hoc items]…
• Step 2: User considerations
– Grocery list could be 20+ items– Tedious to un-check the same items
Solution Find a way to “remember” what user has in-stock
The grocery list as a “smart list”
• Step 3: Record finalized list items
Procedure
• Record checked items
• Record un-checked items in not in database
The grocery list as a “smart list”
• Step 3 (cont): Record finalized list items
Implementation
• The 3 scenarios
• Actions: Insert / Update / Do nothing
• Data value: New timestamp / Keep existing timestamp
• Data structure: use Set vs. Map
Example
The grocery list as a “smart list”
• Step 4: Now put the smart in “smart list”
Automate some of the user’s un-checking
How:• Compare the recorded ingredient history to the average
shelf-life of each ingredient to evaluate ingredient status
Purpose
The grocery list as a “smart list”
• Step 4 (cont): Now put the smart in “smart list”
Implementation:
• Create a view that does the calculation on the fly
• Left-join the data set with this view results
• Mark each ingredient as either ok, overdue, or n/a
The grocery list as a “smart list”
• Step 4 (cont): Now put the smart in “smart list”
CREATE VIEW view_smart_items AS
SELECT f.u_id, f.item_id, f.date_finalized, g.shelf_life_days, datediff(now(), f.date_finalized) AS diff,
CASE 1
WHEN (g.shelf_life_days IS NULL)
THEN 'na'
WHEN (datediff(now(), f.date_finalized) > g.shelf_life_days) THEN'overdue'
ELSE 'ok' END AS status
FROM finalized_grocery_items f, groceryitemscategorymember g
WHERE f.item_id=g.item_id
The grocery list as a “smart list”
• Step 5: Putting it all together query = (SELECT tmp.a_id, tmp.aisle, tmp.ic_id, tmp.aislecategory, tmp.unit, tmp.quantity, tmp.g_id, tmp.g_name, tmp.item_id, tmp.itemname, tmp.r_id,
tmp.r_name, tmp.item_brand, tmp.details, tmp.sequence, CAST(tmp.ingrec_id AS CHAR), v.status, v.date_finalized FROM ( SELECT a.a_id, a.a_name AS aisle, ic.ic_id, ic.ic_name aislecategory, ir.unit, ir.quantity, gs.g_id, gs.g_name, g.item_id, g.item_name
itemname, r.r_id, r.r_name, ir.item_brand, ir.details, gsla.location_seq AS sequence, ir.ingrec_id FROM recipes r, ingredientsinrecipe ir, itemcategories ic, grocerystoreaislecategory gsac, aisle a, grocerystores gs, grocerystorelocatedaisles
gsla, groceryitemscategorymember g WHERE r.r_id=ir.r_id AND ir.item_id=g.item_id AND g.ic_id=ic.ic_id AND gsac.g_id=gs.g_id AND gsac.a_id=a.a_id AND gsac.ic_id=ic.ic_id AND gsla.g_id=gs.g_id AND gsla.a_id=a.a_id AND r.r_id in (SELECT r_id FROM recipescomposingmealplans where mp_id= ? ) AND gs.g_id = ? ) tmp LEFT JOIN view_smart_items v on (tmp.item_id=v.item_id AND v.u_id= ?) ) UNION (SELECT tmp.a_id, tmp.a_name, tmp.ic_id, tmp.ic_name,'','',tmp.g_id,tmp.g_name,tmp.item_id, tmp.item_name,'','','','',tmp.location_seq,'',
v.status, v.date_finalized FROM (SELECT a.a_id, a.a_name, ic.ic_id, ic.ic_name,gs.g_id,gs.g_name,g.item_id, g.item_name,gsla.location_seq
FROM groceryitemscategorymember g, itemcategories ic, grocerystoreaislecategory gsac, aisle a, grocerystores gs, grocerystorelocatedaisles gsla WHERE g.ic_id=ic.ic_id
AND gsac.g_id=gs.g_id AND gsac.a_id=a.a_id AND gsac.ic_id=ic.ic_id AND gsla.g_id=gs.g_id AND gsla.a_id=a.a_id AND gs.g_id = ? AND g.item_id IN ( " + itemsQueryIn + " ) ) tmp LEFT JOIN view_smart_items v on (tmp.item_id=v.item_id AND v.u_id= ?) ) ORDER BY sequence, aisle, aislecategory, itemname ;
The grocery list as a “smart list”
• Cast operation– Similar to Oracle’s To_char and To_Date functions
– When to use
– Why I used
SELECT CAST(tmp.ingrec_id AS CHAR)…
Some SQL insights
• Using hexidecimal
– When to use
– Why I used
SELECT r.r_id, r.r_name, r.r_source, replace(r.r_directions,0xD,'<br>'), r.r_serving_size, r.r_scope, r.added
FROM …
– #0xD represents a carriage return
Some SQL insights
• An SQL question
– Is there a function that takes an array and outputs a list such as:
WHERE (r.r_type like ‘%Appetizer%’ OR r.r_type like ‘%Dessert%’ OR r.r_type like ‘%Side dish%’)
– How do you use the Prepared Statement ? with a comma-separated list such as:
WHERE r.r_id IN (23,45,88)
Some SQL…questions
• What we discussed
– Rethinking the orthography
– The grocery list as a “smart list”
– Some SQL insights
In Conclusion
• Some fun things we can do next
– Automate a user’s “favorite recipes” list
– Suggest recommended meals with consideration to “in stock” items
– Functionality to download grocery list to PDA
In Conclusion