1- CREATE OR REPLACE FUNCTION ap .explorersearch(_taxonids integer [] DEFAULT NULL ::integer [], _elemtypeids integer [] DEFAULT NULL ::integer [], _taphtypeids integer [] DEFAULT NULL ::integer [], _depenvids integer [] DEFAULT NULL ::integer [], _abundpct integer DEFAULT NULL ::integer , _datasettypeid integer DEFAULT NULL ::integer , _keywordid integer DEFAULT NULL ::integer , _coords character varying DEFAULT NULL ::character varying, _gpid integer DEFAULT NULL ::integer , _altmin integer DEFAULT NULL ::integer , _altmax integer DEFAULT NULL ::integer , _coltypeid integer DEFAULT NULL ::integer , _dbid integer DEFAULT NULL ::integer , _sitename character varying DEFAULT NULL ::character varying, _contactid integer DEFAULT NULL ::integer , _ageold integer DEFAULT NULL ::integer , _ageyoung integer DEFAULT NULL ::integer , _agedocontain boolean DEFAULT true, _agedirectdate boolean DEFAULT false, _subdate date DEFAULT NULL ::date , _debug boolean DEFAULT false)
1+ CREATE OR REPLACE FUNCTION ap .explorersearch(_taxonids integer [] DEFAULT NULL ::integer [],
2+ _elemtypeids integer [] DEFAULT NULL ::integer [],
3+ _taphtypeids integer [] DEFAULT NULL ::integer [],
4+ _depenvids integer [] DEFAULT NULL ::integer [],
5+ _abundpct integer DEFAULT NULL ::integer ,
6+ _datasettypeid integer DEFAULT NULL ::integer ,
7+ _keywordid integer DEFAULT NULL ::integer ,
8+ _coords character varying DEFAULT NULL ::character varying,
9+ _gpid integer DEFAULT NULL ::integer ,
10+ _altmin integer DEFAULT NULL ::integer ,
11+ _altmax integer DEFAULT NULL ::integer ,
12+ _coltypeid integer DEFAULT NULL ::integer ,
13+ _dbid integer DEFAULT NULL ::integer ,
14+ _sitename character varying DEFAULT NULL ::character varying,
15+ _contactid integer DEFAULT NULL ::integer ,
16+ _ageold integer DEFAULT NULL ::integer ,
17+ _ageyoung integer DEFAULT NULL ::integer ,
18+ _agedocontain boolean DEFAULT true,
19+ _agedirectdate boolean DEFAULT false,
20+ _subdate date DEFAULT NULL ::date ,
21+ _debug boolean DEFAULT false)
222 RETURNS TABLE(datasetid integer , datasettype character varying, databasename character varying, minage integer , maxage integer , ageyoungest integer , ageoldest integer , siteid integer , sitename character varying, sitedescription text , notes text , collunithandle character varying, collunitname character varying, latitudenorth double precision , latitudesouth double precision , longitudeeast double precision , longitudewest double precision )
323 LANGUAGE plpgsql
424AS $function$
@@ -31,18 +51,18 @@ BEGIN
3151 doDepEnv := true;
3252 END IF;
3353
34-
54+
3555 debugLenTaxonids := array_length(_taxonids,1 );
36-
56+
3757 RAISE NOTICE ' _taxonids length is %' , debugLenTaxonids;
3858
39- IF array_length(_taxonids,1 ) < 1 OR _taxonids is null THEN
59+ IF array_length(_taxonids,1 ) < 1 OR _taxonids is null THEN
4060 noTaxa := true;
4161 RAISE NOTICE ' noTaxa is %' , noTaxa;
42-
62+
4363 END IF;
4464
45-
65+
4666 IF ( (array_length(_elemtypeids,1 ) > 0 OR _elemtypeids IS NOT NULL ) AND noTaxa = false ) THEN
4767 doElem := true;
4868 RAISE NOTICE ' doElem is %' , doElem;
@@ -58,10 +78,10 @@ BEGIN
5878 BEGIN
5979 -- get SumGroupID of the first (or only) taxon id
6080 sumGroupId := (
61- SELECT sg .sumgroupid
81+ SELECT sg .sumgroupid
6282 FROM ndb .ecolgroups eg
6383 JOIN ap .pollensumgroups sg ON eg .ecolgroupid = sg .ecolgroupid
64- WHERE
84+ WHERE
6585 eg .taxonid IN (array_to_string( _taxonids[0 ],' ,' ))
6686 );
6787 IF sumGroupId > 0 THEN
@@ -83,15 +103,15 @@ BEGIN
83103 JOIN ndb.variables v ON d.variableid = v.variableid ' ;
84104 cteBaseWhere := '
85105 WHERE' ;
86-
106+
87107 IF doAbund = true THEN
88108 BEGIN
89109 cteBaseSelect := cteBaseSelect || ' ,
90110 v.taxonid,
91- CAST(d.value / SUM(d.value) OVER(PARTITION BY s.sampleid) * 100 AS DECIMAL(5,2)) AS abundance' ;
92- cteBaseFrom := cteBaseFrom || '
93- JOIN ndb.taxa t ON v.taxonid = t.taxonid
94- JOIN ndb.ecolgroups e ON t.taxonid = e.taxonid
111+ CAST(d.value / SUM(d.value) OVER(PARTITION BY s.sampleid) * 100 AS DECIMAL(5,2)) AS abundance' ;
112+ cteBaseFrom := cteBaseFrom || '
113+ JOIN ndb.taxa t ON v.taxonid = t.taxonid
114+ JOIN ndb.ecolgroups e ON t.taxonid = e.taxonid
95115 JOIN ap.pollensumgroups sg ON e.ecolgroupid = sg.ecolgroupid' ;
96116 cteBaseWhere := cteBaseWhere || '
97117 sg.sumgroupid = ' || sumGroupId;
@@ -128,11 +148,11 @@ BEGIN
128148 AND k.KeywordID = _keywordId' ;
129149 END;
130150 END IF;
131-
132- cteBase := cteBase || cteBaseSelect || cteBaseFrom || cteBaseWhere || '
151+
152+ cteBase := cteBase || cteBaseSelect || cteBaseFrom || cteBaseWhere || '
133153 )' ;
134- END;
135- END IF;
154+ END;
155+ END IF;
136156 -- END building base CTE
137157
138158 -- START building standard ages CTE
@@ -159,7 +179,7 @@ BEGIN
159179 AND base.abundance > ' || _abundPct ||
160180 ' AND base.taxonid IN (' || array_to_string( _taxonids ,' ,' ) || ' ))' ;
161181 END IF;
162-
182+
163183 IF NOT (_ageold IS NULL AND _ageyoung IS NULL AND noTaxa = false) THEN
164184 BEGIN
165185 cteAgesFrom := cteAgesFrom || '
@@ -174,7 +194,7 @@ BEGIN
174194 END IF;
175195
176196 IF _ageDoContain = true THEN
177- cteAgesWhere := cteAgesWhere || '
197+ cteAgesWhere := cteAgesWhere || '
178198 AND (
179199 (' || _ageyoung || ' <= sa.age AND sa.age <= ' || _ageold || ' ) OR
180200 (' || _ageyoung || ' <= sa.ageyounger AND sa.ageolder <= ' || _ageold || ' )
@@ -246,15 +266,15 @@ BEGIN
246266 -- END alternative ages CTE for directly dated specimens
247267
248268 -- START building ds (dataset) CTE
249-
269+
250270
251271 IF noTaxa = true THEN
252272 BEGIN
253273 cteBase := ' ' ;
254274 cteAges := ' ' ;
255275 cteDs := ' WITH ' ;
256276 END;
257- ELSE
277+ ELSE
258278 cteDs := ' ,
259279 ' ;
260280 END IF;
@@ -293,7 +313,7 @@ BEGIN
293313 BEGIN
294314 cteBase := ' ' ;
295315 cteAges := ' ' ;
296-
316+
297317 cteDsFrom := '
298318 FROM
299319 ndb.datasets ds' || cteDsFrom ;
@@ -319,70 +339,70 @@ BEGIN
319339 WHERE
320340 1=1 ' ;
321341
322- IF _sitename IS NOT NULL THEN
323- cteDsWhere := cteDsWhere || '
324- AND s.sitename LIKE ' ' %' || _sitename || ' %' ' ' ;
342+ IF _sitename IS NOT NULL THEN
343+ cteDsWhere := cteDsWhere || '
344+ AND s.sitename ILIKE ' ' %' || _sitename || ' %' ' ' ;
325345 END IF;
326346
327347 IF _subdate IS NOT NULL THEN
328- cteDsWhere := cteDsWhere || '
348+ cteDsWhere := cteDsWhere || '
329349 AND ds.recdatecreated >= ' || _subdate;
330350 END IF;
331351
332352 IF _gpid IS NOT NULL THEN
333- cteDsWhere := cteDsWhere || '
353+ cteDsWhere := cteDsWhere || '
334354 AND EXISTS (SELECT *
335355 FROM ndb.sitegeopolitical gp
336356 WHERE gp.siteid = s.siteid
337357 AND gp.geopoliticalid = ' || _gpid || ' )' ;
338358 END IF;
339359
340360 IF doDepEnv = true THEN
341- cteDsWhere := cteDsWhere || '
361+ cteDsWhere := cteDsWhere || '
342362 AND cu.depenvtid IN (array_to_string(' || depEnvIds || ' ,' ' ,' ' ))' ;
343363 END IF;
344364
345365 IF _coltypeid IS NOT NULL THEN
346- cteDsWhere := cteDsWhere || '
366+ cteDsWhere := cteDsWhere || '
347367 AND cu.CollTypeID = ' || _coltypeid;
348368 END IF;
349369
350370 IF _altmin IS NOT NULL THEN
351- cteDsWhere := cteDsWhere || '
371+ cteDsWhere := cteDsWhere || '
352372 AND s.Altitude >= ' || _altmin;
353373 END IF;
354374
355375 IF _altmax IS NOT NULL THEN
356- cteDsWhere := cteDsWhere || '
376+ cteDsWhere := cteDsWhere || '
357377 AND s.Altitude <= ' || _altmax;
358378 END IF;
359379
360380 IF _dbid IS NOT NULL THEN
361- cteDsWhere := cteDsWhere || '
381+ cteDsWhere := cteDsWhere || '
362382 AND EXISTS (SELECT *
363383 FROM ndb.datasetdatabases db
364384 WHERE db.datasetid = ds.datasetid
365385 AND db.databaseid = ' || _dbid || ' )' ;
366386 END IF;
367387
368388 IF _contactid IS NOT NULL THEN
369- cteDsWhere := cteDsWhere || '
389+ cteDsWhere := cteDsWhere || '
370390 AND EXISTS (SELECT *
371391 FROM ap.datasetpisauthors p
372392 WHERE p.datasetid = ds.datasetid
373393 AND p.contactid = ' || _contactid || ' )' ;
374394 END IF;
375395
376- IF _keywordid IS NOT NULL AND noTaxa = true THEN
377- cteDsWhere := cteDsWhere || '
396+ IF _keywordid IS NOT NULL AND noTaxa = true THEN
397+ cteDsWhere := cteDsWhere || '
378398 AND EXISTS (SELECT k.datasetid, k.keywordid
379399 FROM ap.datasetkeywords k
380400 WHERE k.datasetid = ds.datasetid
381- AND k.keywordid = ' || _keywordid ' )' ;
401+ AND k.keywordid = ' || _keywordid ' )' ;
382402 END IF;
383403
384404 IF _datasettypeid IS NOT NULL THEN
385- cteDsWhere := cteDsWhere || '
405+ cteDsWhere := cteDsWhere || '
386406 AND ds.DatasetTypeID = ' || _datasettypeid;
387407 END IF;
388408
@@ -395,9 +415,9 @@ BEGIN
395415 _ageyoung := - 250 ;
396416 END IF;
397417 IF _agedocontain = true THEN
398- cteDsWhere := cteDsWhere || '
418+ cteDsWhere := cteDsWhere || '
399419 AND (
400- ( ' || _ageyoung || ' <= ages.ageyoungest AND ' || _ageold || ' >= ages.ageoldest) OR
420+ ( ' || _ageyoung || ' <= ages.ageyoungest AND ' || _ageold || ' >= ages.ageoldest) OR
401421 ( ' || _ageyoung || ' <= ages.minage AND ' || _ageold || ' >= ages.maxage)
402422 )' ;
403423 ELSE
@@ -411,13 +431,13 @@ BEGIN
411431 END IF;
412432
413433-- todo review postgis syntax ---
414-
434+
415435 RAISE NOTICE ' _coords value %' , _coords;
416436 IF _coords IS NOT NULL THEN
417437 BEGIN
418438 poly := ST_GeogFromText(_coords)::geography;
419-
420- cteDsWhere := format( ' %s' || '
439+
440+ cteDsWhere := format( ' %s' || '
421441 AND ST_Intersects(s.geog,' || ' %L' || ' ) = true' , cteDsWhere, poly);
422442 END;
423443 END IF;
@@ -427,9 +447,9 @@ BEGIN
427447 -- END building ds (dataset) CTE
428448 -- call CTEs
429449
430-
450+
431451 thesql := format(
432- ' %s' || ' %s' || ' %s' ||
452+ ' %s' || ' %s' || ' %s' ||
433453 ' SELECT
434454 ds.datasetid,
435455 dt.datasettype,
@@ -456,10 +476,10 @@ BEGIN
456476 , cteBase, cteAges, cteDs);
457477
458478RAISE NOTICE ' %' , thesql;
459-
479+
460480 RETURN QUERY EXECUTE thesql;
461481
462-
482+
463483
464484END;
465485
0 commit comments