Changeset: eb4af5e703db for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/eb4af5e703db
Modified Files:
        geom/monetdb5/geom.c
Branch: geo-update
Log Message:

Using BATproejct when ordering input instead of doing it myself, fixed unused 
variables.


diffs (237 lines):

diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -828,38 +828,6 @@ geoPointEquals(GeoPoint pointA, GeoPoint
        return (pointA.lat == pointB.lat) && (pointA.lon = pointB.lon);
 }
 
-//POSTgis Calculate Perpendicular of Point
-/*
-normal_cart = cross_product(line->start, line->end)
-point_cart = geo2cart(p)
-dot = dot_product(normal,pt)
-
-vector_scale(&n, dot_product(&p, &n));
-vector_difference(&p, &n, &k);
-normalize(&k);
-cart2geog(&k, &gk);
-edge_contains_point(e, &gk)
-*/
-
-//POSTgis Calculate Point in Edge
-/*
-e -> edge // p -> point
-geog2cart(&(e->start), &vs);
-geog2cart(&(e->end), &ve);
-if ( vs.x == -1.0 * ve.x && vs.y == -1.0 * ve.y && vs.z == -1.0 * ve.z )
-       return LW_TRUE;
-geog2cart(p, &vp);
-vector_sum(&vs, &ve, &vcp);
-normalize(&vcp);
-vs_dot_vcp = dot_product(&vs, &vcp);
-
-POINT ON PLANE (Plane defined by Edge)
-normal_cart = cross_product(line->start, line->end)
-point_cart = geo2cart(p)
-dot = dot_product(normal,pt)
-return dot == 0
-*/
-
 //TODO If a line covers a point, it must have 0 distance to one of the 
segments (is this true?)
 #if 0
 static bool geoLineCoversPoint (GeoLines lines, GeoPoint point) {
@@ -970,57 +938,6 @@ wkbCoversGeographic(bit *out, wkb **a, w
 * Collect (Group By implementation) 
 * 
 **/
-static str 
-orderGroupsAndInput(BAT *b, BAT *g, BAT **b_ordered, BAT **g_ordered)
-{
-       str msg = MAL_SUCCEED;
-       BAT *sortedgroups, *sortedorder;
-       const oid *sortedgroupsids = NULL, *sortedorderids = NULL;
-       oid sortedordercounter;
-       wkb **b_ordered_values = NULL;
-
-       //Sort the groups
-       if ((BATsort(&sortedgroups, &sortedorder, NULL, g, NULL, NULL, false, 
false, true)) != GDK_SUCCEED)
-               return createException(MAL, "geom.Collect", "BAT sort failed.");
-
-       if (sortedgroups && !BATtdense(sortedgroups))
-               sortedgroupsids = (const oid *)Tloc(sortedgroups, 0);
-       //TODO Else, if it is a dense BAT
-
-       if (sortedorder && !BATtdense(sortedorder))
-               sortedorderids = (const oid *)Tloc(sortedorder, 0);
-       else if (BATtdense(sortedorder))
-               sortedordercounter = sortedorder->tseqbase;
-
-       //Project new order onto input bat IF the sortedorder isn't dense -> in 
which case, the original input order is correct
-       if (sortedorderids) {
-               //TODO Is this how the in-order BAT should be created?
-               if ((*b_ordered = COLnew(b->hseqbase, ATOMindex("wkb"), 
BATcount(b), TRANSIENT)) == NULL)
-                       return createException(MAL, "geom.Collect", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               if ((b_ordered_values = GDKzalloc(sizeof(wkb *) * BATcount(b))) 
== NULL)
-                       return createException(MAL, "geom.Collect", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
-
-               BATiter bi = bat_iterator(b);
-               for (BUN i = 0; i < BATcount(b); i++) 
-                       //TODO Is this needed? -> oid is = i + 
sortedorder->hseqbase;
-                       b_ordered_values[i] = (wkb *)BUNtail(bi, 
sortedorderids[i]);
-               bat_iterator_end(&bi);
-
-               //Assign ordered BATs
-               if (BUNappendmulti(*b_ordered, b_ordered_values, BATcount(b), 
false) != GDK_SUCCEED)
-                       return createException(MAL, "geom.Collect", 
SQLSTATE(38000) "BUNappend operation failed");
-               *g_ordered = sortedgroups;
-
-               //TODO Free the original b and g BATs
-       }
-       else {
-               //In the case the original BATs are already ordered
-               *g_ordered = NULL;
-               *b_ordered = NULL;
-       }
-       return msg;
-}
-
 //Gets the type of collection a single geometry should belong to
 static int
 GEOSGeom_getCollectionType (int GEOSGeom_type) {
@@ -1041,6 +958,7 @@ str
 wkbCollectAggrSubGroupedCand(bat *outid, const bat *bid, const bat *gid, const 
bat *eid, const bat *sid, const bit *skip_nils)
 {
        BAT *b = NULL, *g = NULL, *e = NULL, *s = NULL, *out = NULL;
+       BAT *sortedgroups, *sortedorder, *sortedinput;
        BATiter bi;
        const oid *gids = NULL;
        str msg = MAL_SUCCEED;
@@ -1057,21 +975,32 @@ wkbCollectAggrSubGroupedCand(bat *outid,
        GEOSGeom *unionGroup = NULL, collection;
 
        (void)skip_nils;
-
-       //Get the BAT descriptors for the value bat + the other 3 optional BATs
-       if ((b = BATdescriptor(*bid)) == NULL ||
-               (gid && !is_bat_nil(*gid) && (g = BATdescriptor(*gid)) == NULL) 
||
-               (eid && !is_bat_nil(*eid) && (e = BATdescriptor(*eid)) == NULL) 
||
-               (sid && !is_bat_nil(*sid) && (s = BATdescriptor(*sid)) == 
NULL)) {
+       (void)eid;
+       (void)sid;
+
+       //Get the BAT descriptors for the value and group bat
+       if ((b = BATdescriptor(*bid)) == NULL || (gid && !is_bat_nil(*gid) && 
(g = BATdescriptor(*gid)) == NULL)) {
                msg = createException(MAL, "geom.Collect", 
RUNTIME_OBJECT_MISSING);
-               //TODO goto free?
-               return msg;
-       }
-
-       BAT *b_ordered, *g_ordered;
-       if(((msg = orderGroupsAndInput(b,g,&b_ordered,&g_ordered)) == 
MAL_SUCCEED) && b_ordered != NULL && g_ordered != NULL) {
-               b = b_ordered;
-               g = g_ordered;
+               goto free;
+       }
+
+       if ((BATsort(&sortedgroups, &sortedorder, NULL, g, NULL, NULL, false, 
false, true)) != GDK_SUCCEED) {
+               msg = createException(MAL, "geom.Collect", "BAT sort failed.");
+               goto free;
+       }
+               
+       //Project new order onto input bat IF the sortedorder isn't dense (in 
which case, the original input order is correct)
+       if (!BATtdense(sortedorder)) {
+               sortedinput = BATproject(sortedorder,b);
+               BBPunfix(b->batCacheid);
+               BBPunfix(g->batCacheid);
+               b = sortedinput;
+               g = sortedgroups;
+               BBPunfix(sortedorder->batCacheid);
+       }
+       else {
+               BBPunfix(sortedgroups->batCacheid);
+               BBPunfix(sortedorder->batCacheid);
        }
 
        //Fill in the values of the group aggregate operation
@@ -1082,6 +1011,7 @@ wkbCollectAggrSubGroupedCand(bat *outid,
 
        if (ngrp == 0) {
                msg = createException(MAL, "geom.Collect", "Number of groups is 
equal to 0");
+               //TODO Return empty BAT?
                goto free;
        }
 
@@ -1094,6 +1024,7 @@ wkbCollectAggrSubGroupedCand(bat *outid,
        //All unions for output BAT
        if ((unions = GDKzalloc(sizeof(wkb *) * ngrp)) == NULL) {
                msg = createException(MAL, "geom.Collect", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               BBPunfix(out->batCacheid);
                goto free;
        }
 
@@ -1101,6 +1032,7 @@ wkbCollectAggrSubGroupedCand(bat *outid,
        //TODO Change allocation size
        if ((unionGroup = GDKzalloc(sizeof(GEOSGeom) * ncand)) == NULL) {
                msg = createException(MAL, "geom.Collect", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               BBPunfix(out->batCacheid);
                if (unions)
                        GDKfree(unions);
                goto free;
@@ -1184,20 +1116,12 @@ wkbCollectAggrSubGroupedCand(bat *outid,
        BBPunfix(b->batCacheid);
        if (g)
                BBPunfix(g->batCacheid);
-       if (e)
-               BBPunfix(e->batCacheid);
-       if (s)
-               BBPunfix(s->batCacheid);
        return MAL_SUCCEED;
 free:
        if (b)
                BBPunfix(b->batCacheid);
        if (g)
                BBPunfix(g->batCacheid);
-       if (e)
-               BBPunfix(e->batCacheid);
-       if (s)
-               BBPunfix(s->batCacheid);
        return msg;
 }
 
@@ -1213,36 +1137,6 @@ wkbCollectAggrGrouped(bat *out, const ba
        return wkbCollectAggrSubGroupedCand(out, bid, gid, eid, NULL, 
&(bit){1});
 }
 
-/**
-* Unused code 
-* 
-**/
-
-#if 0
-/**
-* Convert spherical coordinates to cartesian coordinates
-*/
-static CartPoint geo2cart_r(GeoPoint geo)
-{
-       CartPoint cart;
-       cart.x = earth_radius * cos(geo.lat) * cos(geo.lon);
-       cart.y = earth_radius * cos(geo.lat) * sin(geo.lon);
-       cart.z = earth_radius * sin(geo.lat);
-       return cart;
-}
-
-/**
-* Convert cartesian coordinates to spherical coordinates
-*/
-static GeoPoint cart2geo_r(CartPoint cart)
-{
-       GeoPoint geo;
-       geo.lon = atan2(cart.y, cart.x);
-       geo.lat = asin(cart.z / earth_radius);
-       return geo;
-}
-#endif
-
 /** 
 * 
 * Geographic update code end
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to