Skip to content

Commit d21d2bf

Browse files
authored
Update extended_age_query.md
1 parent 492b218 commit d21d2bf

File tree

1 file changed

+244
-0
lines changed

1 file changed

+244
-0
lines changed

sphinx/software_desc/extended_age_query.md

Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,247 @@ The meta age range for each collection object should appear in the age column of
4949

5050
The "Any" age query bug is being push to a later issue. For now, do a Age Range query from "13800" to "0" to get all COs with age data (query all of time, the age of the universe 😀
5151

52+
## Example Queries Generated by Extended Age QB
53+
54+
Here is a compiled SQLAlchemy query that get generated for a simple CollectionObject Age query:
55+
56+
```sql
57+
SELECT
58+
collectionobject.`CollectionObjectID`,
59+
concat_ws(' - ',
60+
ifnull(regexp_replace(CAST(agg_subq.max_start_period AS CHAR), '\\.(0+)$', ''), ''),
61+
ifnull(regexp_replace(CAST(agg_subq.min_end_period AS CHAR), '\\.(0+)$', ''), '')) AS age
62+
FROM
63+
collectionobject
64+
INNER JOIN (
65+
SELECT
66+
unioned.coid AS coid,
67+
min(unioned.endperiod) AS min_end_period,
68+
max(unioned.startperiod) AS max_start_period
69+
FROM
70+
(
71+
SELECT
72+
absoluteage.`CollectionObjectID` AS coid,
73+
CAST(absoluteage.`AbsoluteAge` AS DECIMAL(10, 6)) - coalesce(absoluteage.`AgeUncertainty`, 0) AS startperiod,
74+
CAST(absoluteage.`AbsoluteAge` AS DECIMAL(10, 6)) + coalesce(absoluteage.`AgeUncertainty`, 0) AS endperiod
75+
FROM
76+
absoluteage
77+
WHERE
78+
CAST(absoluteage.`AbsoluteAge` AS DECIMAL(10, 6)) - coalesce(absoluteage.`AgeUncertainty`, 0) <= 2000.0
79+
AND CAST(absoluteage.`AbsoluteAge` AS DECIMAL(10, 6)) + coalesce(absoluteage.`AgeUncertainty`, 0) >= 2.0
80+
UNION ALL
81+
SELECT
82+
r.`CollectionObjectID` AS coid,
83+
CASE
84+
WHEN (r.`AgeNameEndID` IS NOT NULL) THEN greatest(CAST(a.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(a.`StartUncertainty`, 0) + coalesce(r.`AgeUncertainty`, 0), CAST(aend.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(aend.`StartUncertainty`, 0) + coalesce(r.`AgeUncertainty`, 0))
85+
ELSE CAST(a.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(a.`StartUncertainty`, 0) + coalesce(r.`AgeUncertainty`, 0)
86+
END AS startperiod,
87+
CASE
88+
WHEN (r.`AgeNameEndID` IS NOT NULL) THEN least((CAST(a.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(a.`EndUncertainty`, 0)) - coalesce(r.`AgeUncertainty`, 0), (CAST(aend.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(aend.`EndUncertainty`, 0)) - coalesce(r.`AgeUncertainty`, 0))
89+
ELSE (CAST(a.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(a.`EndUncertainty`, 0)) - coalesce(r.`AgeUncertainty`, 0)
90+
END AS endperiod
91+
FROM
92+
relativeage AS r
93+
INNER JOIN geologictimeperiod AS a ON
94+
r.`AgeNameID` = a.`GeologicTimePeriodID`
95+
LEFT OUTER JOIN geologictimeperiod AS aend ON
96+
r.`AgeNameEndID` = aend.`GeologicTimePeriodID`
97+
WHERE
98+
a.`StartPeriod` IS NOT NULL
99+
AND a.`EndPeriod` IS NOT NULL
100+
AND a.`StartPeriod` >= a.`EndPeriod`
101+
AND (r.`AgeNameEndID` IS NULL
102+
OR aend.`StartPeriod` IS NOT NULL
103+
AND aend.`EndPeriod` IS NOT NULL
104+
AND aend.`StartPeriod` >= aend.`EndPeriod`)
105+
AND CASE
106+
WHEN (r.`AgeNameEndID` IS NOT NULL) THEN greatest(CAST(a.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(a.`StartUncertainty`, 0) + coalesce(r.`AgeUncertainty`, 0), CAST(aend.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(aend.`StartUncertainty`, 0) + coalesce(r.`AgeUncertainty`, 0))
107+
ELSE CAST(a.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(a.`StartUncertainty`, 0) + coalesce(r.`AgeUncertainty`, 0)
108+
END <= 2000.0
109+
AND CASE
110+
WHEN (r.`AgeNameEndID` IS NOT NULL) THEN least((CAST(a.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(a.`EndUncertainty`, 0)) - coalesce(r.`AgeUncertainty`, 0), (CAST(aend.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(aend.`EndUncertainty`, 0)) - coalesce(r.`AgeUncertainty`, 0))
111+
ELSE (CAST(a.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(a.`EndUncertainty`, 0)) - coalesce(r.`AgeUncertainty`, 0)
112+
END >= 2.0
113+
UNION ALL
114+
SELECT
115+
DISTINCT c.`CollectionObjectID` AS coid,
116+
CASE
117+
WHEN (p.`ChronosStratEndID` IS NOT NULL) THEN least(CAST(cs.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(cs.`StartUncertainty`, 0), CAST(csend.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(csend.`StartUncertainty`, 0))
118+
ELSE CAST(cs.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(cs.`StartUncertainty`, 0)
119+
END AS startperiod,
120+
CASE
121+
WHEN (p.`ChronosStratEndID` IS NOT NULL) THEN greatest(CAST(cs.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(cs.`EndUncertainty`, 0), CAST(csend.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(csend.`EndUncertainty`, 0))
122+
ELSE CAST(cs.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(cs.`EndUncertainty`, 0)
123+
END AS endperiod
124+
FROM
125+
collectionobject AS c
126+
LEFT OUTER JOIN collectingevent AS ce ON
127+
c.`CollectingEventID` = ce.`CollectingEventID`
128+
LEFT OUTER JOIN locality AS l ON
129+
ce.`LocalityID` = l.`LocalityID`
130+
LEFT OUTER JOIN paleocontext AS p ON
131+
c.`PaleoContextID` = p.`PaleoContextID`
132+
OR ce.`PaleoContextID` = p.`PaleoContextID`
133+
OR l.`PaleoContextID` = p.`PaleoContextID`
134+
LEFT OUTER JOIN geologictimeperiod AS cs ON
135+
p.`ChronosStratID` = cs.`GeologicTimePeriodID`
136+
LEFT OUTER JOIN geologictimeperiod AS csend ON
137+
p.`ChronosStratEndID` = csend.`GeologicTimePeriodID`
138+
WHERE
139+
p.`PaleoContextID` IS NOT NULL
140+
AND cs.`StartPeriod` IS NOT NULL
141+
AND cs.`EndPeriod` IS NOT NULL
142+
AND cs.`StartPeriod` >= cs.`EndPeriod`
143+
AND (p.`ChronosStratEndID` IS NULL
144+
OR csend.`StartPeriod` IS NOT NULL
145+
AND csend.`EndPeriod` IS NOT NULL
146+
AND csend.`StartPeriod` >= csend.`EndPeriod`)
147+
AND CASE
148+
WHEN (p.`ChronosStratEndID` IS NOT NULL) THEN least(CAST(cs.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(cs.`StartUncertainty`, 0), CAST(csend.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(csend.`StartUncertainty`, 0))
149+
ELSE CAST(cs.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(cs.`StartUncertainty`, 0)
150+
END <= 2000.0
151+
AND CASE
152+
WHEN (p.`ChronosStratEndID` IS NOT NULL) THEN greatest(CAST(cs.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(cs.`EndUncertainty`, 0), CAST(csend.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(csend.`EndUncertainty`, 0))
153+
ELSE CAST(cs.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(cs.`EndUncertainty`, 0)
154+
END >= 2.0) AS unioned
155+
GROUP BY
156+
unioned.coid) AS agg_subq ON
157+
collectionobject.`CollectionObjectID` = agg_subq.coid
158+
WHERE
159+
collectionobject.`CollectionID` = 98304;
160+
```
161+
162+
Here is another example of a compiled SQLAlchemy query that gets generated:
163+
164+
```sql
165+
SELECT
166+
collectionobject.`CollectionObjectID`,
167+
concat_ws(' - ', ifnull(regexp_replace(CAST(agg_subq.max_start_period AS CHAR), '\\.(0+)$', ''), ''), ifnull(regexp_replace(CAST(agg_subq.min_end_period AS CHAR), '\\.(0+)$', ''), '')) AS age,
168+
absoluteage_1.`AbsoluteAge`,
169+
geologictimeperiod_1.`Name`,
170+
geologictimeperiod_2.`Name`,
171+
geologictimeperiod_3.`Name`,
172+
geologictimeperiod_4.`Name`,
173+
geologictimeperiod_5.`Name`,
174+
geologictimeperiod_6.`Name`
175+
FROM
176+
collectionobject
177+
INNER JOIN (
178+
SELECT
179+
unioned.coid AS coid,
180+
min(unioned.endperiod) AS min_end_period,
181+
max(unioned.startperiod) AS max_start_period
182+
FROM
183+
(
184+
SELECT
185+
absoluteage.`CollectionObjectID` AS coid,
186+
CAST(absoluteage.`AbsoluteAge` AS DECIMAL(10, 6)) - coalesce(absoluteage.`AgeUncertainty`, 0) AS startperiod,
187+
CAST(absoluteage.`AbsoluteAge` AS DECIMAL(10, 6)) + coalesce(absoluteage.`AgeUncertainty`, 0) AS endperiod
188+
FROM
189+
absoluteage
190+
WHERE
191+
CAST(absoluteage.`AbsoluteAge` AS DECIMAL(10, 6)) - coalesce(absoluteage.`AgeUncertainty`, 0) <= 2000.0
192+
AND CAST(absoluteage.`AbsoluteAge` AS DECIMAL(10, 6)) + coalesce(absoluteage.`AgeUncertainty`, 0) >= 2.0
193+
UNION ALL
194+
SELECT
195+
r.`CollectionObjectID` AS coid,
196+
CASE
197+
WHEN (r.`AgeNameEndID` IS NOT NULL) THEN greatest(CAST(a.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(a.`StartUncertainty`, 0) + coalesce(r.`AgeUncertainty`, 0), CAST(aend.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(aend.`StartUncertainty`, 0) + coalesce(r.`AgeUncertainty`, 0))
198+
ELSE CAST(a.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(a.`StartUncertainty`, 0) + coalesce(r.`AgeUncertainty`, 0)
199+
END AS startperiod,
200+
CASE
201+
WHEN (r.`AgeNameEndID` IS NOT NULL) THEN least((CAST(a.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(a.`EndUncertainty`, 0)) - coalesce(r.`AgeUncertainty`, 0), (CAST(aend.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(aend.`EndUncertainty`, 0)) - coalesce(r.`AgeUncertainty`, 0))
202+
ELSE (CAST(a.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(a.`EndUncertainty`, 0)) - coalesce(r.`AgeUncertainty`, 0)
203+
END AS endperiod
204+
FROM
205+
relativeage AS r
206+
INNER JOIN geologictimeperiod AS a ON
207+
r.`AgeNameID` = a.`GeologicTimePeriodID`
208+
LEFT OUTER JOIN geologictimeperiod AS aend ON
209+
r.`AgeNameEndID` = aend.`GeologicTimePeriodID`
210+
WHERE
211+
a.`StartPeriod` IS NOT NULL
212+
AND a.`EndPeriod` IS NOT NULL
213+
AND a.`StartPeriod` >= a.`EndPeriod`
214+
AND (r.`AgeNameEndID` IS NULL
215+
OR aend.`StartPeriod` IS NOT NULL
216+
AND aend.`EndPeriod` IS NOT NULL
217+
AND aend.`StartPeriod` >= aend.`EndPeriod`)
218+
AND CASE
219+
WHEN (r.`AgeNameEndID` IS NOT NULL) THEN greatest(CAST(a.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(a.`StartUncertainty`, 0) + coalesce(r.`AgeUncertainty`, 0), CAST(aend.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(aend.`StartUncertainty`, 0) + coalesce(r.`AgeUncertainty`, 0))
220+
ELSE CAST(a.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(a.`StartUncertainty`, 0) + coalesce(r.`AgeUncertainty`, 0)
221+
END <= 2000.0
222+
AND CASE
223+
WHEN (r.`AgeNameEndID` IS NOT NULL) THEN least((CAST(a.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(a.`EndUncertainty`, 0)) - coalesce(r.`AgeUncertainty`, 0), (CAST(aend.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(aend.`EndUncertainty`, 0)) - coalesce(r.`AgeUncertainty`, 0))
224+
ELSE (CAST(a.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(a.`EndUncertainty`, 0)) - coalesce(r.`AgeUncertainty`, 0)
225+
END >= 2.0
226+
UNION ALL
227+
SELECT
228+
DISTINCT c.`CollectionObjectID` AS coid,
229+
CASE
230+
WHEN (p.`ChronosStratEndID` IS NOT NULL) THEN least(CAST(cs.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(cs.`StartUncertainty`, 0), CAST(csend.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(csend.`StartUncertainty`, 0))
231+
ELSE CAST(cs.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(cs.`StartUncertainty`, 0)
232+
END AS startperiod,
233+
CASE
234+
WHEN (p.`ChronosStratEndID` IS NOT NULL) THEN greatest(CAST(cs.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(cs.`EndUncertainty`, 0), CAST(csend.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(csend.`EndUncertainty`, 0))
235+
ELSE CAST(cs.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(cs.`EndUncertainty`, 0)
236+
END AS endperiod
237+
FROM
238+
collectionobject AS c
239+
LEFT OUTER JOIN collectingevent AS ce ON
240+
c.`CollectingEventID` = ce.`CollectingEventID`
241+
LEFT OUTER JOIN locality AS l ON
242+
ce.`LocalityID` = l.`LocalityID`
243+
LEFT OUTER JOIN paleocontext AS p ON
244+
c.`PaleoContextID` = p.`PaleoContextID`
245+
OR ce.`PaleoContextID` = p.`PaleoContextID`
246+
OR l.`PaleoContextID` = p.`PaleoContextID`
247+
LEFT OUTER JOIN geologictimeperiod AS cs ON
248+
p.`ChronosStratID` = cs.`GeologicTimePeriodID`
249+
LEFT OUTER JOIN geologictimeperiod AS csend ON
250+
p.`ChronosStratEndID` = csend.`GeologicTimePeriodID`
251+
WHERE
252+
p.`PaleoContextID` IS NOT NULL
253+
AND cs.`StartPeriod` IS NOT NULL
254+
AND cs.`EndPeriod` IS NOT NULL
255+
AND cs.`StartPeriod` >= cs.`EndPeriod`
256+
AND (p.`ChronosStratEndID` IS NULL
257+
OR csend.`StartPeriod` IS NOT NULL
258+
AND csend.`EndPeriod` IS NOT NULL
259+
AND csend.`StartPeriod` >= csend.`EndPeriod`)
260+
AND CASE
261+
WHEN (p.`ChronosStratEndID` IS NOT NULL) THEN least(CAST(cs.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(cs.`StartUncertainty`, 0), CAST(csend.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(csend.`StartUncertainty`, 0))
262+
ELSE CAST(cs.`StartPeriod` AS DECIMAL(10, 6)) + coalesce(cs.`StartUncertainty`, 0)
263+
END <= 2000.0
264+
AND CASE
265+
WHEN (p.`ChronosStratEndID` IS NOT NULL) THEN greatest(CAST(cs.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(cs.`EndUncertainty`, 0), CAST(csend.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(csend.`EndUncertainty`, 0))
266+
ELSE CAST(cs.`EndPeriod` AS DECIMAL(10, 6)) - coalesce(cs.`EndUncertainty`, 0)
267+
END >= 2.0) AS unioned
268+
GROUP BY
269+
unioned.coid) AS agg_subq ON
270+
collectionobject.`CollectionObjectID` = agg_subq.coid
271+
LEFT OUTER JOIN absoluteage AS absoluteage_1 ON
272+
collectionobject.`CollectionObjectID` = absoluteage_1.`CollectionObjectID`
273+
LEFT OUTER JOIN relativeage AS relativeage_1 ON
274+
collectionobject.`CollectionObjectID` = relativeage_1.`CollectionObjectID`
275+
LEFT OUTER JOIN geologictimeperiod AS geologictimeperiod_1 ON
276+
geologictimeperiod_1.`GeologicTimePeriodID` = relativeage_1.`AgeNameID`
277+
LEFT OUTER JOIN geologictimeperiod AS geologictimeperiod_2 ON
278+
geologictimeperiod_2.`GeologicTimePeriodID` = relativeage_1.`AgeNameEndID`
279+
LEFT OUTER JOIN paleocontext AS paleocontext_1 ON
280+
paleocontext_1.`PaleoContextID` = collectionobject.`PaleoContextID`
281+
LEFT OUTER JOIN geologictimeperiod AS geologictimeperiod_3 ON
282+
geologictimeperiod_3.`GeologicTimePeriodID` = paleocontext_1.`ChronosStratID`
283+
LEFT OUTER JOIN geologictimeperiod AS geologictimeperiod_4 ON
284+
geologictimeperiod_4.`GeologicTimePeriodID` = paleocontext_1.`ChronosStratEndID`
285+
LEFT OUTER JOIN collectingevent AS collectingevent_1 ON
286+
paleocontext_1.`PaleoContextID` = collectingevent_1.`PaleoContextID`
287+
LEFT OUTER JOIN paleocontext AS paleocontext_2 ON
288+
paleocontext_2.`PaleoContextID` = collectingevent_1.`PaleoContextID`
289+
LEFT OUTER JOIN geologictimeperiod AS geologictimeperiod_5 ON
290+
geologictimeperiod_5.`GeologicTimePeriodID` = paleocontext_2.`ChronosStratID`
291+
LEFT OUTER JOIN geologictimeperiod AS geologictimeperiod_6 ON
292+
geologictimeperiod_6.`GeologicTimePeriodID` = paleocontext_2.`ChronosStratEndID`
293+
WHERE
294+
collectionobject.`CollectionID` = 98304;
295+
```

0 commit comments

Comments
 (0)