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.scientist2
2 (: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 @(select
50 (table *db* :scientists)
51 (where
52 (and
53 (< :birth_date death)
54 (< birth :death_date)
55 (not (= :name (:name s))))))) ))
57 (defn data [s]
58 (let [locations
59 (sort-by
60 :immigration_date
61 (map #(select-keys % [:immigration_date :emigration_date :country])
62 @(select
63 (table *db* :scientist_whereabouts)
64 (where
65 (and
66 (= :scientist_whereabouts.surname (:surname s))
67 (= :scientist_whereabouts.name (:name s)))))))
68 ideas
69 (sort-by
70 #(.toLowerCase %)
71 (map :idea
72 @(select
73 (table *db* :ideas)
74 (where
75 (and
76 (= :ideas.surname (:surname s))
77 (= :ideas.name (:name s)))))))
78 data
79 (first
80 @(select
81 (table *db* :scientists)
82 (where
83 (and
84 (= :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 locations
102 (strcat
103 (interpose
104 ", "
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 contemps
109 (strcat
110 (interpose
111 ", "
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 lifespan
119 (str "["
120 (:birth_place base) " " birth-date ", "
121 (:death_place base) " " death-date
122 "]")
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 username
152 :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-person
169 {:name "Albert 3850" :surname "Newton 3850"}
170 "this is the person in in which John 5750 is supposedly
171 wrongly included my code says they're contempoaries,
172 but the expected output disaggrees ")
174 (defvar wrong-include
175 {: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-person2
186 {:name "Erik 3851" :surname "Smith 3851"})
188 (defvar wrong-include2
189 {: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>}