@Rule("decimal '\\,' decimal") protected GeoPt coordinate(Number lat, Number lon) { return new GeoPt(lat.floatValue(), lon.floatValue()); }
/** * Returns {@code com.google.appengine.api.datastore.GeoPt} value as string * representation. */ @Override protected String convertToString(Object value) throws Throwable { GeoPt geoPt = (GeoPt) value; return new BigDecimal(geoPt.getLatitude()) + "," + new BigDecimal(geoPt.getLongitude()); }
@Test public void testGets() throws Exception { Query query = new Query(kindName, rootKey); GeoPt filter = new GeoPt(Float.valueOf(60).floatValue(), Float.valueOf(145).floatValue()); query.setFilter(new FilterPredicate(propertyName, Query.FilterOperator.EQUAL, filter)); Entity entity = service.prepare(query).asSingleEntity(); GeoPt geopt = (GeoPt) entity.getProperty(propertyName); assertTrue(geopt.equals(filter)); assertEquals(Float.valueOf(geopt.getLatitude()).toString(), Float.valueOf(60).toString()); assertEquals(Float.valueOf(geopt.getLongitude()).toString(), Float.valueOf(145).toString()); }
@Test public void testGeoptType() { List<Entity> elist = doQuery(kindName, propertyName, GeoPt.class, true); GeoPt rate = (GeoPt) elist.get(0).getProperty(propertyName); GeoPt sameDat = (GeoPt) elist.get(0).getProperty(propertyName); GeoPt diffDat = (GeoPt) elist.get(1).getProperty(propertyName); assertTrue(rate.equals(sameDat)); assertFalse(rate.equals(diffDat)); assertEquals(-12, rate.getLatitude(), 0); assertEquals(120, rate.getLongitude(), 0); assertEquals(0, rate.compareTo(sameDat)); assertTrue(rate.compareTo(diffDat) != 0); assertEquals(rate.hashCode(), rate.hashCode()); } }
@Override public GeoPoint toFieldValue(Object hrdValue) { GeoPt point = (GeoPt) hrdValue; return new GeoPoint(point.getLatitude(), point.getLongitude()); } };
@Rule("ns latitude '\\,' we longitude") protected GeoPt coordinate(int ns, Number lat, int we, Number lon) { return new GeoPt(ns*lat.floatValue(), we*lon.floatValue()); }
@Override public GeoPoint from(GeoPt from) { return from == null ? null : new GeoPoint(from.getLatitude(), from.getLongitude()); }
/** * Converts the specified value to * {@code com.google.appengine.api.datastore.GeoPt}. * * @see org.apache.commons.beanutils.converters.AbstractConverter#convertToType(java.lang.Class, java.lang.Object) */ @SuppressWarnings("rawtypes") @Override protected Object convertToType(Class type, Object value) throws Throwable { String[] strings = value.toString().split(","); if (strings.length != 2) { throw new ConversionException( "GeoPt 'value' must be able to be splitted into 2 float values " + "by ',' (latitude,longitude)"); } try { float latitude = new BigDecimal(strings[0].trim()).floatValue(); float longitude = new BigDecimal(strings[1].trim()).floatValue(); return new GeoPt(latitude, longitude); } catch (Exception e) { throw new ConversionException( "Cannot parse GeoPt value into 2 float values: " + "latitude [" + strings[0].trim() + "], longitude [" + strings[1].trim() + "]"); } }
public static String toString(GeoPt pt) { float lat = pt.getLatitude(); char ns = lat > 0 ? 'N' : 'S'; lat = Math.abs(lat); int lati = (int) lat; lat = lat-lati; float lon = pt.getLongitude(); char we = lon > 0 ? 'E' : 'W'; lon = Math.abs(lon); int loni = (int) lon; lon = lon-loni; return String.format(Locale.US, "%c %d\u00b0 %.3f', %c %d\u00b0 %.3f'", ns, lati, lat*60, we, loni, lon*60 ); } public static byte[] getBytes(Object ob)
public static void serialize(SerializationStreamWriter streamWriter, GeoPt instance) throws SerializationException { streamWriter.writeFloat(instance.getLatitude()); streamWriter.writeFloat(instance.getLongitude()); } }
public static GeoPt instantiate(SerializationStreamReader streamReader) throws SerializationException { return new GeoPt(streamReader.readFloat(), streamReader.readFloat()); }
@Override public Object toHrdProperty(GeoPoint value) { return new GeoPt((float)value.getLatitude(), (float)value.getLongitude()); }
@Override public GeoPt from(GeoPoint from) { return from == null ? null : new GeoPt((float) from.getLatitude(), (float) from.getLongitude()); }
@Test public void testFilter() throws Exception { doAllFilters(kindName, propertyName, new GeoPt(Float.valueOf(24).floatValue(), Float.valueOf(-90).floatValue())); }
@Before public void addData() throws InterruptedException { Query query = new Query(kindName, rootKey); if (service.prepare(query).countEntities(fetchOption) == 0) { List<Entity> elist = new ArrayList<Entity>(); for (int i = 0; i < count; i++) { Entity newRec = new Entity(kindName, rootKey); newRec.setProperty("stringData", "string test data " + i); newRec.setProperty("intData", 10 * i); newRec.setProperty("stringList", Arrays.asList("abc" + i, "xyz" + i, "abc" + i)); newRec.setProperty("intList", Arrays.asList(i, 50 + i, 90 + i)); newRec.setProperty("timestamp", new Date()); newRec.setProperty("floatData", new Float(i + 0.1)); newRec.setProperty("ratingData", new Rating(i + 20)); newRec.setProperty("booleanData", true); newRec.setProperty("geoptData", new GeoPt((float) (i * 20 - 90), new Float(i * 30 - 179.1))); newRec.setProperty("byteStrProp", new ShortBlob(("shortblob" + (i * 30)).getBytes())); elist.add(newRec); } service.put(elist); sync(waitTime); } }
@Test public void testWithPropertyProjection() { Query query = new Query(kindName, rootKey); query.addProjection(new PropertyProjection("geoptData", GeoPt.class)); Filter filter1 = Query.CompositeFilterOperator.or( Query.FilterOperator.LESS_THAN.of("intList", 5), Query.FilterOperator.GREATER_THAN.of("intList", 90)); Filter filter2 = Query.FilterOperator.EQUAL.of("intList", 52); query.setFilter(Query.CompositeFilterOperator.and(filter1, filter2)); // sql statement String sql = "SELECT geoptData FROM " + kindName; sql += " WHERE ((intList < 5 or intList > 90) AND intList = 52)"; sql += " AND __ancestor__ is " + rootKey; assertEquals(sql.toLowerCase(), query.toString().toLowerCase()); // check query result List<Entity> results = service.prepare(query).asList(fo); Assert.assertTrue(results.size() > 0); assertEquals(new GeoPt((float) (2.12), (float) (2.98)), results.get(0).getProperty("geoptData")); for (Entity e : results) { assertEquals(1, e.getProperties().size()); assertTrue(e.getProperties().containsKey("geoptData")); } }
new GeoPt((float) (i / (props - 9) + 12.0), (float) (i / (props - 9) + 90.0))); newRec.setProperty("intList", Arrays.asList(i / (props - 11), 50 + i / (props - 11), 90 + i / (props - 11)));
@Before public void createData() throws InterruptedException { clearData(kindName); List<Entity> elist = new ArrayList<>(); for (int i = 0; i < count; i++) { Entity newRec = new Entity(kindName, rootKey); newRec.setProperty("stringData", "string data" + i); newRec.setProperty("timestamp", new Date()); newRec.setProperty("shortBlobData", new ShortBlob(("shortBlobData" + i).getBytes())); newRec.setProperty("intData", 20 * i); newRec.setProperty("textData", new Text("textData" + i)); newRec.setProperty("floatData", 1234 + 0.1 * i); newRec.setProperty("booleanData", true); newRec.setProperty("urlData", new Link("http://www.google.com")); newRec.setProperty("emailData", new Email("somebody123" + i + "@google.com")); newRec.setProperty("phoneData", new PhoneNumber("408-123-000" + i)); newRec.setProperty("adressData", new PostalAddress("123 st. CA 12345" + i)); newRec.setProperty("ratingData", new Rating(10 * i)); newRec.setProperty("geoptData", new GeoPt((float) (i + 0.12), (float) (i + 0.98))); newRec.setProperty("categoryData", new Category("category" + i)); newRec.setProperty("intList", Arrays.asList(i, 50 + i, 90 + i)); elist.add(newRec); } service.put(elist); sync(1000); }
newRec.setProperty("adressData", new PostalAddress("123 st. CA 12345")); newRec.setProperty("ratingData", new Rating(55)); newRec.setProperty("geoptData", new GeoPt((float) 12.12, (float) 98.98)); newRec.setProperty("categoryData", new Category("abc")); eList.add(newRec);