Skip to content

Commit

Permalink
start converting example
Browse files Browse the repository at this point in the history
  • Loading branch information
yanatan16 committed Oct 28, 2015
1 parent aade50c commit 8cf80cb
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 67 deletions.
92 changes: 49 additions & 43 deletions example/real_estate/base_relvars.clj
Original file line number Diff line number Diff line change
@@ -1,56 +1,62 @@
(ns real-estate.base-relvars
(:require [fyra.core :refer (defrelvar DateTime)]
(:require [fyra.sweet :refer (defrelvar)]
[real-estate.types :refer :all]))

(defrelvar "Basic property information"
Property {:address Address
:price Price
:photo Filename
:agent Agent
:date-registered DateTime}
(defrelvar Property
"Basic property information"
{:address Address
:price Price
:photo Filename
:agent Agent
:date-registered DateTime}
:candidate [:address])

(defrelvar "Offers by bidders on Properties"
Offer {:address Address
:bidder-name Name
:bidder-address Address
:offer-date DateTime
:offer-price Price}
(defrelvar Offer
"Offers by bidders on Properties"
{:address Address
:bidder-name Name
:bidder-address Address
:offer-date DateTime
:offer-price Price}
:candidate [:address :bidder-name :bidder-address :offer-date]
:foreign {Property {:address :address}})
:foreign {'Property {:address :address}})

(defrelvar "Decisions by sellers on Offers"
Decision {:address Address
:bidder-name Name
:bidder-address Address
:offer-date DateTime
:decision-date DateTime
:accepted Boolean}
(defrelvar Decision
"Decisions by sellers on Offers"
{:address Address
:bidder-name Name
:bidder-address Address
:offer-date DateTime
:decision-date DateTime
:accepted Boolean}
:candidate [:address :bidder-name :bidder-address :offer-date]
:foreign {Offer {:address :address
:bidder-name :bidder-name
:bidder-address :bidder-address
:offer-date :offer-date}})
:foreign {'Offer {:address :address
:bidder-name :bidder-name
:bidder-address :bidder-address
:offer-date :offer-date}})

(defrelvar "Room inside of Properties and Floors"
Room {:address Address
:room-name String
:width Double
:breadth Double
:type RoomType}
(defrelvar Room
"Room inside of Properties and Floors"
{:address Address
:room-name String
:width Double
:breadth Double
:type RoomType}
:candidate [:address :room-name]
:foreign {Property {:address :address}})
:foreign {'Property {:address :address}})

(defrelvar "Floor inside of Properties containing Rooms"
Floor {:address Address
:room-name string
:floor int}
(defrelvar Floor
"Floor inside of Properties containing Rooms"
{:address Address
:room-name string
:floor int}
:candidate [:address :room-name]
:foreign {Property {:address :address}})
:foreign {'Property {:address :address}})

(defrelvar "Commission definitions"
Commission {:price-band PriceBand
:area-code AreaCode
:sale-speed SpeedBand
:commission double}
:candidate [:price-band :area-code :sale-speed])
(defrelvar Commission
"Commission definitions"
{:price-band PriceBand
:area-code AreaCode
:sale-speed SpeedBand
:commission double}
:candidate [:price-band :area-code :sale-speed])
48 changes: 24 additions & 24 deletions example/real_estate/internal_views.clj
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
(ns real-estate.internal-views
(:require [fyra.core :refer (defview)]
(:require [fyra.sweet :refer (defview) :as f]
[fyra.relational :as r]
[real-estate.types :refer :all]
[real-estate.user-defined-functions :refer :all]
Expand All @@ -10,14 +10,14 @@
; :type RoomType :room-size Double}
(defview RoomInfo
"Room with :room-size calculated"
(r/extend Room :room-size (* width breadth)))
(f/extend Room :room-size [Integer (* width breadth)]))

; Acceptance => {:address Address :offer-date DateTime
; :bidder-name Name :bidder-address Address
; :decision-date DateTime}
(defview Acceptance
"Accepted Decisions"
(r/project-away (r/restrict Decision #(= (:accepted %) true))
(f/project-away (f/restrict Decision (= accepted true))
:accepted))


Expand All @@ -26,7 +26,7 @@
; :decision-date DateTime}
(defview Rejection
"Rejected Decisions"
(r/project-away (r/restrict Decision #(= (:accepted %) false))
(f/project-away (f/restrict Decision (= accepted false))
:accepted))


Expand All @@ -37,58 +37,58 @@
; :sq-ft Double}
(defview PropertyInfo
"Property with calculated information"
(r/extend Property
:price-band #(price->price-band (:price %))
:area-code #(address->area-code (:address %))
:num-rooms (fn [p] (r/count (r/restrict RoomInfo
#(= (:address p) (:address %)))))
:sq-ft (fn [p] (r/sum room-size
(r/restrict RoomInfo
#(= (:address p) (:address %)))))))
(f/summarize
(f/extend (f/join Property RoomInfo)
:price-band [Keyword (price->price-band price)]
:area-code [String (address->area-code address)])
[:address :price :photo :agent :date-registered :price-band :area-code]
{:num-rooms [Integer count]
:sq-ft [Integer #(reduce + (map :room-size %))]}))

; CurrentOffer :: {:address Address :offer-price Price
; :offer-date DateTime :bidder-name Name
; :bidder-address Address}
(defview CurrentOffer
"Latest offers from individual bidders"
(r/summarize Offer
(f/summarize Offer
[:address :bidder-name :bidder-address]
#(r/maximum-key :offer-date %)))
#(f/maximum-key :offer-date %)))

; RawSales :: {:address Address :offer-price Price
; :decision-date DateTime :agent Agent
; :date-registered DateTime}
(defview RawSales
"Sold properties with offer and decision information"
(r/project-away (r/join Acceptance
(r/join CurrentOffer
(r/project Property :address :agent :date-registered)))
(f/project-away
(f/join Acceptance
(f/join CurrentOffer
(f/project Property :address :agent :date-registered)))
:offer-date :bidder-name :bidder-address))

; SoldProperty :: {:address Address}
(defview SoldProperty
"Sold properties' addresses"
(r/project RawSales :address))
(f/project RawSales :address))

; UnsoldProperty :: {:address Address}
(defview UnsoldProperty
"Unsold properties' addresses"
(r/minus (r/project Property :address)
(f/minus (f/project Property :address)
SoldProperty))

; SalesInfo :: {:address Address :agent agent :area-code AreaCode
; :sale-speed SpeedBand :price-band PriceBand}
(defview SalesInfo
"Sales information for agents"
(r/project (r/extend RawSales
:area-code #(address->area-code (:address %))
:sale-speed #(dates->speed-band (:date-registered %) (:decision-date %))
:price-band #(price->price-band (:offer-price %)))
(f/project (f/extend RawSales
:area-code (address->area-code address)
:sale-speed (dates->speed-band date-registered decision-date)
:price-band (price->price-band offer-price))
:address :agent :area-code :sale-speed :price-band))

; SalesCommissions :: {:address Address :agent Agent
; :commission Double}
(defview SalesCommissions
"Sales commissions"
(r/project (r/join SalesInfo Commission)
(f/project (f/join SalesInfo Commission)
:address :agent :commission))

0 comments on commit 8cf80cb

Please sign in to comment.