static void test_patch_pointn_last_first() { // 00 endian (big) // 00000000 pcid // 00000000 compression // 00000003 npoints // 0000000800000003000000050006 pt1 (XYZi) // 0000000200000003000000040008 pt2 (XYZi) // 0000000200000003000000040009 pt3 (XYZi) char *hexbuf = "00000000000000000000000003000000080000000300000005000600000002000000030000000400080000000200000003000000040009"; size_t hexsize = strlen(hexbuf); uint8_t *wkb = bytes_from_hexbytes(hexbuf, hexsize); char *str; PCPATCH *pa = pc_patch_from_wkb(simpleschema, wkb, hexsize/2); PCPOINT *pt = pc_patch_pointn(pa, -1); str = pc_point_to_string(pt); CU_ASSERT_STRING_EQUAL(str, "{\"pcid\":0,\"pt\":[0.02,0.03,0.04,9]}"); pc_point_free(pt); free(str); pt = pc_patch_pointn(pa, -3); str = pc_point_to_string(pt); CU_ASSERT_STRING_EQUAL(str, "{\"pcid\":0,\"pt\":[0.08,0.03,0.05,6]}"); pc_point_free(pt); free(str); pc_patch_free(pa); pcfree(wkb); }
static void test_patch_pointn_laz_compression() { // 00 endian (big) // 00000000 pcid // 00000000 compression // 00000003 npoints // 0000000800000003000000050006 pt1 (XYZi) // 0000000200000003000000040008 pt2 (XYZi) // 0000000200000003000000040009 pt3 (XYZi) char *hexbuf = "00000000000000000000000003000000080000000300000005000600000002000000030000000400080000000200000003000000040009"; size_t hexsize = strlen(hexbuf); uint8_t *wkb = bytes_from_hexbytes(hexbuf, hexsize); char *str; PCPATCH *pa = pc_patch_from_wkb(simpleschema, wkb, hexsize/2); PCPOINTLIST *li = pc_pointlist_from_patch(pa); PCPATCH_LAZPERF* paz = pc_patch_lazperf_from_pointlist(li); PCPOINT *pt = pc_patch_pointn((PCPATCH*) paz, 2); CU_ASSERT(pt != NULL); str = pc_point_to_string(pt); CU_ASSERT_STRING_EQUAL(str, "{\"pcid\":0,\"pt\":[0.02,0.03,0.04,8]}"); pc_patch_free((PCPATCH *)paz); pc_point_free(pt); pcfree(str); pcfree(wkb); pc_patch_free(pa); pc_pointlist_free(li); }
static void test_patch_pointn_ght_compression() { // 00 endian (big) // 00000000 pcid // 00000000 compression // 00000003 npoints // 0000000800000003000000050006 pt1 (XYZi) // 0000000200000003000000040008 pt2 (XYZi) // 0000000200000003000000040009 pt3 (XYZi) char *hexbuf = "00000000000000000000000003000000080000000300000005000600000002000000030000000400080000000200000003000000040009"; size_t hexsize = strlen(hexbuf); uint8_t *wkb = bytes_from_hexbytes(hexbuf, hexsize); PCPATCH *pa = pc_patch_from_wkb(simpleschema, wkb, hexsize/2); PCPOINTLIST *li = pc_pointlist_from_patch(pa); #ifdef HAVE_LIBGHT PCPATCH_GHT* pag = pc_patch_ght_from_pointlist(li); PCPOINT *pt = pc_patch_pointn((PCPATCH*) pag, 2); CU_ASSERT(pt != NULL); CU_ASSERT_STRING_EQUAL(pc_point_to_string(pt), "{\"pcid\":0,\"pt\":[0.02,0.03,0.04,8]}"); pc_patch_free( (PCPATCH*) pag ); pc_point_free(pt); #endif // free pcfree(wkb); pc_patch_free(pa); pc_pointlist_free(li); }
static void test_patch_set_schema_dimensional_compression(enum DIMCOMPRESSIONS dimcomp) { // init data PCPATCH_DIMENSIONAL *padim1, *padim2; PCPATCH *pat; PCPOINT *pt; PCPOINTLIST *pl; char *str; int i; int npts = PCDIMSTATS_MIN_SAMPLE+1; // force to keep custom compression // build a patch pl = pc_pointlist_make(npts); for ( i = npts; i >= 0; i-- ) { pt = pc_point_make(simpleschema); pc_point_set_double_by_name(pt, "X", i * 0.1); pc_point_set_double_by_name(pt, "Y", i * 0.2); pc_point_set_double_by_name(pt, "Z", i * 0.3); pc_point_set_double_by_name(pt, "Intensity", 10); pc_pointlist_add_point(pl, pt); } padim1 = pc_patch_dimensional_from_pointlist(pl); // set dimensional compression for each dimension PCDIMSTATS *stats = pc_dimstats_make(simpleschema); pc_dimstats_update(stats, padim1); for ( i = 0; i<padim1->schema->ndims; i++ ) stats->stats[i].recommended_compression = dimcomp; // compress patch padim2 = pc_patch_dimensional_compress(padim1, stats); // assign a valid schema to the patch pat = pc_patch_set_schema((PCPATCH*) padim2, simpleschema_nointensity, 0.0); CU_ASSERT(pat != NULL); pt = pc_patch_pointn(pat, 1); str = pc_point_to_string(pt); CU_ASSERT_STRING_EQUAL(str,"{\"pcid\":0,\"pt\":[1000.1,2000.2,3000.3]}"); pcfree(str); pc_point_free(pt); pc_patch_free(pat); pc_pointlist_free(pl); pc_dimstats_free(stats); pc_patch_free((PCPATCH *)padim1); pc_patch_free((PCPATCH *)padim2); }
Datum pcpoint_as_text(PG_FUNCTION_ARGS) { SERIALIZED_POINT *serpt = PG_GETARG_SERPOINT_P(0); text *txt; char *str; PCSCHEMA *schema = pc_schema_from_pcid(serpt->pcid, fcinfo); PCPOINT *pt = pc_point_deserialize(serpt, schema); if ( ! pt ) PG_RETURN_NULL(); str = pc_point_to_string(pt); pc_point_free(pt); txt = cstring_to_text(str); pfree(str); PG_RETURN_TEXT_P(txt); }