Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.usergrid.client; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.DoubleNode; import org.apache.usergrid.java.client.Usergrid; import org.apache.usergrid.java.client.auth.UsergridAppAuth; import org.apache.usergrid.java.client.model.UsergridEntity; import org.apache.usergrid.java.client.query.UsergridQuery; import org.apache.usergrid.java.client.response.UsergridResponse; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import static org.junit.Assert.*; public class QueryTestCase { public static final String COLLECTION = "shapes"; public static float distFrom(float lat1, float lng1, float lat2, float lng2) { double earthRadius = 6371000; //meters double dLat = Math.toRadians(lat2 - lat1); double dLng = Math.toRadians(lng2 - lng1); double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(dLng / 2) * Math.sin(dLng / 2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return (float) (earthRadius * c); } @Before public void before() { Usergrid.initSharedInstance(SDKTestConfiguration.ORG_NAME, SDKTestConfiguration.APP_NAME, SDKTestConfiguration.USERGRID_URL, SDKTestConfiguration.authFallBack); Usergrid.authenticateApp( new UsergridAppAuth(SDKTestConfiguration.APP_CLIENT_ID, SDKTestConfiguration.APP_CLIENT_SECRET)); } @After public void after() { Usergrid.reset(); } /** * Test a basic set of queries where there is inclusion and exclusion based on * two fields */ @Test public void testBasicQuery() { UsergridQuery qDelete = new UsergridQuery(COLLECTION); Usergrid.DELETE(qDelete); Map<String, UsergridEntity> entityMapByUUID = SDKTestUtils.createColorShapes(COLLECTION); Map<String, UsergridEntity> entityMapByName = new HashMap<>(entityMapByUUID.size()); for (Map.Entry<String, UsergridEntity> uuidEntity : entityMapByUUID.entrySet()) { entityMapByName.put(uuidEntity.getValue().getName(), uuidEntity.getValue()); } SDKTestUtils.indexSleep(); Map<String, String> fields = new HashMap<>(7); fields.put("red", "square"); fields.put("blue", "circle"); fields.put("yellow", "triangle"); for (Map.Entry<String, String> entry : fields.entrySet()) { UsergridEntity targetEntity = entityMapByName.get(entry.getKey() + entry.getValue()); UsergridResponse response = Usergrid.GET(new UsergridQuery(COLLECTION).eq("color", entry.getKey())); assertNotNull("entities returned should not be null.", response.getEntities()); assertTrue( "query for " + entry.getKey() + " shape should return 1, not: " + response.getEntities().size(), response.getEntities().size() == 1); UsergridEntity responseEntity = response.first(); assertNotNull("first entity should not be null.", responseEntity); assertEquals("query for " + entry.getKey() + " shape should the right UUID", responseEntity.getUuid(), targetEntity.getUuid()); } Usergrid.DELETE(qDelete); } /** * Test that geolocation is working as expected with different ranges and radius * also test that results are sorted ascending by distance from the specified point */ @Test public void testGeoQuery() { String collectionName = "sdkTestLocation"; UsergridQuery deleteQuery = new UsergridQuery(collectionName); Usergrid.DELETE(deleteQuery); ArrayList<UsergridEntity> entities = new ArrayList<>(); UsergridEntity apigeeOffice = new UsergridEntity(collectionName, "Apigee Office"); apigeeOffice.setLocation(37.334115, -121.894340); entities.add(apigeeOffice); UsergridEntity amicis = new UsergridEntity(collectionName, "Amicis"); amicis.setLocation(37.335616, -121.894168); entities.add(amicis); UsergridEntity sanPedroMarket = new UsergridEntity(collectionName, "SanPedroMarket"); sanPedroMarket.setLocation(37.336499, -121.894356); entities.add(sanPedroMarket); UsergridEntity saintJamesPark = new UsergridEntity(collectionName, "saintJamesPark"); saintJamesPark.setLocation(37.339079, -121.891422); entities.add(saintJamesPark); UsergridEntity sanJoseNews = new UsergridEntity(collectionName, "sanJoseNews"); sanJoseNews.setLocation(37.337812, -121.890784); entities.add(sanJoseNews); UsergridEntity deAnza = new UsergridEntity(collectionName, "deAnza"); deAnza.setLocation(37.334370, -121.895081); entities.add(deAnza); Usergrid.POST(entities); SDKTestUtils.indexSleep(); float centerLat = 37.334110f; float centerLon = -121.894340f; // Test a large distance UsergridResponse queryResponse = Usergrid .GET(new UsergridQuery(collectionName).locationWithin(611.00000, centerLat, centerLon)); assertNotNull(queryResponse.getEntities()); float lastDistanceFrom = 0; for (UsergridEntity entity : queryResponse.getEntities()) { JsonNode locationNode = entity.getEntityProperty("location"); assertNotNull("location node should not be null", locationNode); DoubleNode lat = (DoubleNode) locationNode.get("latitude"); DoubleNode lon = (DoubleNode) locationNode.get("longitude"); float distanceFrom = distFrom(centerLat, centerLon, lat.floatValue(), lon.floatValue()); System.out.println("Entity " + entity.getName() + " is " + distanceFrom + " away"); assertTrue("Entity " + entity.getName() + " was included but is not within specified distance (" + distanceFrom + ")", distanceFrom <= 611.0); if (lastDistanceFrom != 0) { assertTrue("GEO results are not sorted by distance ascending: expected " + lastDistanceFrom + " <= " + distanceFrom, lastDistanceFrom <= distanceFrom); } lastDistanceFrom = distanceFrom; } // Test a small distance queryResponse = Usergrid.GET(new UsergridQuery(collectionName).locationWithin(150, centerLat, centerLon)); assertNotNull(queryResponse.getEntities()); lastDistanceFrom = 0; for (UsergridEntity entity : queryResponse.getEntities()) { JsonNode locationNode = entity.getEntityProperty("location"); assertNotNull("location node should not be null", locationNode); DoubleNode lat = (DoubleNode) locationNode.get("latitude"); DoubleNode lon = (DoubleNode) locationNode.get("longitude"); float distanceFrom = distFrom(centerLat, centerLon, lat.floatValue(), lon.floatValue()); System.out.println("Entity " + entity.getName() + " is " + distanceFrom + " away"); assertTrue("Entity " + entity.getName() + " was included but is not within specified distance (" + distanceFrom + ")", distanceFrom <= 150); if (lastDistanceFrom != 0) { assertTrue("GEO results are not sorted by distance ascending: expected " + lastDistanceFrom + " <= " + distanceFrom, lastDistanceFrom <= distanceFrom); } lastDistanceFrom = distanceFrom; } Usergrid.DELETE(deleteQuery); } }