--- tags: Labs-F20, 2020 title: Lab 07 --- # Lab 7: Datatypes. Types of Data. We've already seen a bunch of datatypes that have been built into Pyret, such as `String`, `Number`, `Table`, and `List`. We've even used our own custom datatypes, like `Coord`! By creating custom datatypes, we can describe a piece of data with many components. Today, we'll do another design problem that draws on datatypes, tables, and lists. ## Learning Objectives In this lab, the goal is to: * Think about ways of representing information * Define datatypes * Use `cases` to dectronstruct datatypes If you don’t feel more comfortable with datatypes after working on this lab, come to [TA hours](https://cs.brown.edu/courses/csci0111/fall2020/calendar.html)! ## Part 1: Shopping Spree All of this dessert talk has inspired you to fulfill your lifelong dream of opening up a bakery. You're going to need to purchase some supplies -- from equipment to decor. You head to your [favorite retail site](https://media2.giphy.com/media/w9ikCcFzWY0yA/giphy.gif), which provides its catalog as an [unsophisticated spreadsheet](https://docs.google.com/spreadsheets/d/1pNe1SQXe1IGOgI3XyAU4ugk9Ko5T3gzebJZZK-LZ7MM/edit?usp=sharing). You place your order and you are informed that it will take 273-275 business days to process due to "infrastructure shortcomings." You call customer service and offer to fix this atrocity for them (which they graciously accept!). The first thing you notice is that the catalog spreadsheet gets loaded into a table, but the dimensions are stored as `Strings` rather than in a format that makes it easy to determine item shapes and volumes for shipping purposes. You set out to fix this problem. 1. Import the catalog google sheet into your program as a table by copying the following lines of code into the Pyret definitions window: ``` include shared-gdrive("cs111-2020.arr", "1imMXJxpNWFCUaawtzIJzPhbDuaLHtuDX") include gdrive-sheets import lists as L import math as M ssid = "1pNe1SQXe1IGOgI3XyAU4ugk9Ko5T3gzebJZZK-LZ7MM" data-sheet = load-spreadsheet(ssid) item-table = load-table: item-id, item-description, price, weight, dimensions source: data-sheet.sheet-by-name("Sheet1", true) end ``` 4. Create a `Dimension` datatype, and transform each `String` in the "dimensions" column of the loaded catalog table into a `Dimension` (use `transform-column`). Also as a hint, make sure to thoroughly look at pyret documentation such as string-split-all :::warning **NOTE:** the original "dimensions" column is formatted as: `"WIDTHxDEPTHxHEIGHT"`, i.e. `"12x10x5"`. ::: :::info You'll want to use the function `string-to-number` to convert the original dimensions from `Strings` to `Numbers`. Since someone might try to convert a `String` that contains characters other than digits (ex: `string-to-number("!@#")`), `string-to-number` returns a special type (called an `Option`) that signals whether the conversion worked. Here's how to use `string-to-number` to extract the `Number` for a `String` of only digits (note the `.value` on the end): ``` >>> string-to-number("!@#") none >>> string-to-number("42") some(42) >>> string-to-number("42").value 42 ``` ::: ___ ### *CHECKPOINT:* Call over a TA once you reach this point. ___ ## Part 2: Online Ordering Next, you get a peek at how the shoppe is storing its orders. Each day, one table is created. That table contains a "name" column, specifying the person who placed the order, and a "description" column, listing the item that the corresponding person bought. Orders are bundled together and shipped on horseback each evening, so one shipment goes to each person whose name appears in the table (for instance, in the table below, John won't receive two separate orders). Here is an example: | name | description | price | count | weight | dimensions | | ---- | ----------- | ------ | ----- | ------ |--------------| | Anne | Cork Board | 8.29 | 1 | 1.2 | 17x0.8x23 | | John | Fuzzy Socks | 2.50 | 5 | 0.1 | 9x7x0.5 | | Ken | Fedora | 16.99 | 2 | 0.1 | 9x9x4 | | Anne | Printer | 129.99 | 1 | 9.5 | 15.4x11.8x5.7| | Anne | Fuzzy Socks | 2.50 | 3 | 0.1 | 9x7x0.5 | | Ken | Printer | 129.99 | 1 | 9.5 | 15.4x11.8x5.7| | John | Lamp | 79.99 | 1 | 2.57 | 10.5x7x20.5 | | Ken | Fuzzy Socks | 2.50 | 1 | 0.1 | 9x7x0.5 | | Anne | Gift Card | 40.00 | 1 | 0 | 0 | | Ken | Gift Card | 20.00 | 2 | 0 | 0 | Gift cards don't appear in the catalog because they are by word-of-mouth, but people can still include them in their orders. However, being a methodical and careful soon-to-be business owner, you are quite unsettled by this method of tracking orders. They know that the store needs to be able to perform several tasks with its data: - Compute the total cost of each person's order. - Compute the total volume (with respect to spatial dimensions) of each person's order. - Compute the maximum single dimension of each person's order (determines box size for shipping). - Compute their total sales per day. - Compute how many of each item gets sold for purposes of inventory. Look at the two tables (catalog and orders), and keep these tasks in mind as you work on the following problems: 1. Discuss with your partner the strengths and weaknesses of the current data organization. Write down your main concerns as a collection of brief bullet points. 3. Spend 5-10 minutes coming up with an alternative proposal for the datatypes, tables, and lists that you might use. Indicate the types of all of your columns, components, and list contents. How does your proposal address each of your concerns from the previous question? 3. Now, take a look at two of our concrete proposals, listed in [this document](https://cs.brown.edu/courses/csci0111/spring2020/labs/lab7-help.html). Which do you prefer and why? ___ ### *CHECKPOINT:* Call over a TA once you reach this point. ___ ## Part 3: The Tables Have Turned ["Well, well, well, how the turntables..."](https://www.youtube.com/watch?v=6FwmGLzyRDk) To get more practice working with datatypes, we will now work with the second of our proposals. 1. Define the datatypes for each of `Order`, `UserOrder`, and `ItemData` as described in that proposal. --- ### *CHECKPOINT:* (mini checkpoint) Call over a TA once you reach this point to see your datatypes. --- 2. How specifically does this collection of datatypes address the issues that we identified with the original shoppe design? 3. Recreate the information in the above orders table with your new datatypes. :::warning **NOTE:** you should use all three of the datatypes you defined, in addition to the `Dimension` datatype. ::: :::danger **NOTE:** you do **not** need to create a new table using these datatypes. We want you to rewrite the data *represented* in the table with your datatypes. For example, to represent John's orders, we can write something like ``` john = user-order("John", [list: order(...), order(...)]) ``` ::: 4. Write a function `any-oversized` that takes a `List<Order>` and returns a `Boolean` indicating whether any single item in the order has a total linear dimension (length + width + height) of more than 40 inches (the same units as the original table). 5. Write a function `more-socks` that takes a `List<Order>` (that does not contain any gift cards) and returns a `List<Order>` that has the items from the original orders, except each item matching the description "Fuzzy Socks" has its count increased by 1. 6. Write a function `order-cost` that takes a `List<UserOrder>` and a customer name and returns the total price of the items in that person's orders. Gift cards cost their amount plus a 50-cent processing fee. Physical items cost the price associated with the item (ignore tax, shipping costs, etc). Assume that the list contains the customer. ___ ### *CHECKPOINT:* Call over a TA once you reach this point. ___ ## Bakery Grand Opening! After helping the retail site fix its inefficient infrastructure and systems, you were able to receive your order in just 1-3 business days... Phew! With the speedy turnaround, you were able to quickly launch and the grand opening of your new bakery was spectacular! ![](https://i.imgur.com/9KUheMN.gif)