On 06 Sep 2013, at 17:51, Simon Davies <[email protected]> wrote:
>> Are there any other ways to kind of memoize the GeomFromText function
>> (or the parameters to distance) besides aux_data?
>
> select Distance( constGeom, geometry ) from table, (select
> GeomFromText('Point(13.457 3)') as constGeom );
I just tried this out, but unfortunately it doesn't make a difference. I guess
this boils down to the same thing as what I was doing before. table and the sub
select get joined and the function is invoked for every row again.
Or I could be doing something in wrong in my code of course. Snippet copied
below. With a simple query this prints 'Recreate' for each row.
Pepijn
disclaimer: this is just quick and dirty proof of concept code to see if this
would work or not.
static void ST_Contains(sqlite3_context *context, int nbArgs, sqlite3_value
**args) {
GEOS_START(context);
const GEOSPreparedGeometry *pg1 = sqlite3_get_auxdata(context, 0);
if (pg1 == NULL) {
printf("Recreate\n");
GEOSGeometry *g1 = GEOS_GET_GEOM( args, 0 );
if (g1 == NULL) {
sqlite3_result_error(context, error_message(&error), -1);
return;
}
pg1 = GEOSPrepare_r(GEOS_HANDLE, g1);
if (pg1 == NULL) {
sqlite3_result_error(context, error_message(&error), -1);
return;
}
} else {
printf("Reuse\n");
}
GEOSGeometry *g2 = GEOS_GET_GEOM( args, 1 );
if (g2 == NULL) {
sqlite3_result_error(context, error_message(&error), -1);
return;
}
char result = GEOSPreparedContains_r(GEOS_HANDLE, pg1, g2);
if (result == 2) {
geom_get_geos_error(&error);
sqlite3_result_error(context, error_message(&error), -1);
} else {
sqlite3_result_int(context, result);
}
GEOS_FREE_GEOM( g2 );
sqlite3_set_auxdata(context, 0, pg1, NULL);
}
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users