norBIT / alkisimport

ALKIS-Import
http://www.norbit.de/68/
GNU General Public License v2.0
28 stars 17 forks source link

Ist alkis-compat.sql noch nötig? #57

Closed ewie closed 1 year ago

ewie commented 1 year ago

alkis-compat.sql erstellt Funktionen als Ersatz für eventuell fehlende Funktionen. Teilweise handelt es sich um Shims für Postgres (array_length und unnest) sowie für PostGIS (ST_*). Bei den Funktionen ohne Präfix ST_ bin ich mir nicht sicher wofür die existieren. Hatte PostGIS mal eine API ohne den Präfix? Die werden von alkisimport aber auch nicht verwendet.

Ist jetzt die Frage, welche Postgres- und PostGIS-Versionen alkisimport überhaupt unterstützt (keine Aussage dazu in der README oder auf https://www.norbit.de/68/). Aber Funktionen array_length und unnest existieren seit Postgres 8.4 (https://www.postgresql.org/docs/8.4/release-8-4.html#AEN97667). Postgres 8.3 ist seit 10 Jahren EOL.

Zumindest sollten die Funktionen nur erstellt werden wenn nötig, anstatt Schema public und das PostGIS-Schema mit unnötigen Objekten zuzumüllen. Beispielsweise wird Funktion cleanGeometry erstellt, um damit st_makevalid zu implementieren. cleanGeometry ist aber unnötig, wenn st_makevalid bereits existiert (seit PostGIS 2.0.0, https://postgis.net/docs/release_notes.html#idm46696).

Übersicht der verwendeten Funktionen aus alkis-compat.sql:

git grep -Eiho '\<('"$(grep -Eio 'create\s+function\s+\w+' -- alkis-compat.sql | awk '{print $3}' | sort | uniq | paste -sd '|')"')\s*\(' -- ':!alkis-compat.sql' | sort | uniq -c
  3 alkis_offsetcurve(
  9 array_length(
  7 st_area(
  1 st_asbinary(
 30 st_astext(
 21 st_azimuth(
  7 st_buffer(
161 st_centroid(
 17 st_collect(
 16 st_distance(
 34 st_dump(
 24 st_endpoint(
  9 st_equals(
  2 st_force2d(
  9 st_geometryn(
188 st_geomfromtext(
  4 st_intersection(
  8 st_intersects(
  5 st_isvalid(
  1 st_isValid(
 38 st_length(
 61 st_lineinterpolatepoint(
  5 st_linemerge(
 21 st_makeline(
  1 st_makevalid(
245 st_multi(
  3 st_numpoints(
  1 st_offsetcurve(
  5 st_point(
  9 st_pointn(
  2 st_pointonsurface(
  9 st_reverse(
  5 st_rotate(
  3 st_setsrid(
  3 st_srid(
 25 st_startpoint(
 34 st_translate(
 11 st_x(
  1 st_xmax(
  1 st_xmin(
 11 st_y(
  1 st_ymax(
  1 st_ymin(
 44 unnest(
jef-n commented 1 year ago

Es sollte noch mit allen Version seit 8.4 funktionen (bis auf das optional Ignorieren von Duplikaten) - was sich aber ggf. ändern könnte. Die meisten Funktionen aus alkis-compat.sql bilden auf älteren Versionen nur die aktuellen Funktionen nach und werden auch nur auf älteren Versionen (erfolgreich) angelegt. In PostgreSQL 13 mit PostGIS 3.2 bleiben z.B. nur:

CREATE FUNCTION public.array_length(anyarray, integer) RETURNS integer
CREATE FUNCTION public.asbinary(public.geometry, text) RETURNS bytea
CREATE FUNCTION public.cleangeometry(geom public.geometry) RETURNS public.geometry
CREATE FUNCTION public.setsrid(public.geometry, integer) RETURNS public.geometry
CREATE FUNCTION public.unnest(anyarray) RETURNS SETOF anyelement

Darin sehe ich allerdings kein Problem.

ewie commented 1 year ago

Ist mir erst im Nachhinein aufgefallen, dass ein Großteil der Funktionen gar nicht definiert wird, da CREATE FUNCTION fehlschlägt. Nun gut, dann droppe ich die paar Funktionen nachdem alkis-import.sh ausgeführt wurde.

Ich glaube aber nicht, dass noch jemand ernsthaft Postgres 8 einsetzt.