Mercurial > coderloop
view src/scientist2.clj @ 0:307a81e46071 tip
initial committ
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Tue, 18 Oct 2011 01:17:49 -0700 |
parents | |
children |
line wrap: on
line source
1 (ns coderloop.scientist22 (:refer-clojure :only [])3 (:require rlm.ns-rlm rlm.light-base))4 (rlm.ns-rlm/ns-clone rlm.light-base)7 (use 'clojure.contrib.sql)8 (import 'org.gjt.mm.mysql.Driver)9 (use 'clojure.contrib.sql)10 (undef distinct case compile drop take sort)11 (use 'clojureql.core)12 (import 'java.io.File)13 (use '[clojure.java.io :only [copy]])14 (use '[clojure.contrib.shell-out :only [sh]])15 (use '[clojure.string :only [split]])16 (use '[coderloop [utils :only [md5]]])17 (import 'java.sql.Date)21 (def *port* 3306)23 (def *host* "localhost")25 (def *db-host* "localhost")27 (def *db-name* "clojure_rlm")29 (def *db* {:classname "com.mysql.jdbc.Driver"30 :subprotocol "mysql"31 :subname (str "//" *db-host* ":" *port* "/" *db-name*)32 :user "root"33 :password "sql1005025"})35 (def databases [:essay_scientists :scientists :ideas :scientist_whereabouts])40 (declare essays essay century contemps data eric scientists date->str date)42 (defn scientists []43 @(table *db* :essay_scientists))46 (defn contemps [s birth death]47 (sort-by (fn [s] [(:surname s) (:name s)])48 (map #(select-keys % [:name :surname])49 @(select50 (table *db* :scientists)51 (where52 (and53 (< :birth_date death)54 (< birth :death_date)55 (not (= :name (:name s))))))) ))57 (defn data [s]58 (let [locations59 (sort-by60 :immigration_date61 (map #(select-keys % [:immigration_date :emigration_date :country])62 @(select63 (table *db* :scientist_whereabouts)64 (where65 (and66 (= :scientist_whereabouts.surname (:surname s))67 (= :scientist_whereabouts.name (:name s)))))))68 ideas69 (sort-by70 #(.toLowerCase %)71 (map :idea72 @(select73 (table *db* :ideas)74 (where75 (and76 (= :ideas.surname (:surname s))77 (= :ideas.name (:name s)))))))78 data79 (first80 @(select81 (table *db* :scientists)82 (where83 (and84 (= :scientists.surname (:surname s))85 (= :scientists.name (:name s))))))86 birth (:birth_date data)87 death (:death_date data)88 contemp (contemps s birth death)]89 (merge data {:locations locations :contemps contemp :ideas ideas})))91 (defn date->str [#^java.sql.Date d]92 (format "%02d/%02d/%04d" (.getDate d) (inc (.getMonth d)) (+ 1900 (.getYear d))))94 (def strcat (partial apply str))96 (defn century [#^java.sql.Date d]97 (* 100 (clojure.core/unchecked-divide (+ 1900 (.getYear d)) 100)))99 (defn essay-map [s]100 (let [base (data s)101 locations102 (strcat103 (interpose104 ", "105 (map (fn [{:keys [emigration_date immigration_date country ]}]106 (str country " from " (date->str immigration_date) " to "107 (date->str emigration_date))) (:locations base))))108 contemps109 (strcat110 (interpose111 ", "112 (map (fn [{:keys [name surname]}]113 (str name " " surname))114 (:contemps base))))115 birth-date (date->str (:birth_date base))116 death-date (date->str (:death_date base))117 century (century (:birth_date base))118 lifespan119 (str "["120 (:birth_place base) " " birth-date ", "121 (:death_place base) " " death-date122 "]")123 ideas (strcat (interpose ", " (:ideas base)))124 ]125 {:lifespan lifespan :name (:name base) :surname (:surname base)126 :contemps contemps :locations locations :century century :ideas ideas}))128 (defn essay [s]129 (let [{:keys [lifespan name surname contemps locations century ideas]} (essay-map s)]130 (str name " " surname " " lifespan " is one of the most famous scientists of "131 century ". "132 "Between all " name "'s ideas we mention: " ideas ". "133 name " lived in: " locations ". "134 name " was a contemporary of " contemps ".\n\n")))136 (defn essays []137 (map essay (scientists)))139 (defn print-essays []140 (dorun (map print (essays))))142 (defn essays->str []143 (strcat (essays)))145 (defn main [[username password db-name]]146 (let [db-host *host*147 db-port *port*148 db {:classname "com.mysql.jdbc.Driver"149 :subprotocol "mysql"150 :subname (str "//" db-host ":" db-port "/" db-name)151 :user username152 :password password}]153 (binding [*db* db]154 (print-essays))))156 (if (command-line?)157 (main *command-line-args*))163 (def eric {:name "Erik 3802" :surname "Green 3802"})164 (def date (java.sql.Date. 4564654645))168 (defvar error-person169 {:name "Albert 3850" :surname "Newton 3850"}170 "this is the person in in which John 5750 is supposedly171 wrongly included my code says they're contempoaries,172 but the expected output disaggrees ")174 (defvar wrong-include175 {:name "John 5750" :surname "Newton 5750"}176 "this one is inculded and supposedly should not be.")178 ;;coderloop.scientist2> (select-keys (data error-person) [:birth_date :death_date])179 ;;{:death_date #<Date 0226-10-18>, :birth_date #<Date 0166-10-16>}180 ;;coderloop.scientist2> (select-keys (data wrong-include) [:birth_date :death_date])181 ;;{:death_date #<Date 0226-01-01>, :birth_date #<Date 0166-12-30>}183 ;; these exibit the same problem. They appear to be contemps,184 ;; but the expected output says that they're not!185 (defvar error-person2186 {:name "Erik 3851" :surname "Smith 3851"})188 (defvar wrong-include2189 {:name "Gil 5751" :surname "Smith 5751"})191 ;;coderloop.scientist2> (select-keys (data error-person2) [:birth_date :death_date])192 ;;{:death_date #<Date 0227-10-19>, :birth_date #<Date 0167-10-17>}193 ;;coderloop.scientist2> (select-keys (data wrong-include2) [:birth_date :death_date])194 ;;{:death_date #<Date 0227-01-02>, :birth_date #<Date 0167-12-31>}