Displaying differences for changeset
 
display as  

test/TestDriver.java

@@ -9,6 +9,9 @@
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import org.testng.Assert;
@@ -27,6 +30,9 @@
 public class TestDriver {
 
     private static Connection conn;
+    private static ArrayList<RandomMapunit> testMapunits = new ArrayList<>();
+    private static int MAX_RANDOM_MAPUNITS = 5;
+    private static double MAX_AREA_DELTA = 0.1;
 
     public TestDriver() throws ClassNotFoundException, SQLException {
 //1395701
@@ -37,14 +43,13 @@
     //
     // @Test
     // public void hello() {}
-    
     @Test
     public void testResultSetIteration() {
-        String query = "SELECT top 100 legend.areasymbol, mapunit.musym, mapunit.mukey, mapunit.muname, muacres, brockdepmin FROM mapunit "                
-                + "INNER JOIN legend ON mapunit.lkey=legend.lkey  "
-                + "INNER JOIN muaggatt ON mapunit.mukey=muaggatt.mukey  WHERE "
-                + " legend.areatypename like 'Non-MLRA%' ORDER BY mapunit.mukey;";
-            
+        String query = "SELECT top 100 legend.areasymbol, mapunit.musym, mapunit.mukey, mapunit.muname, muacres, brockdepmin FROM mapunit "
+                + " INNER JOIN legend ON mapunit.lkey=legend.lkey  "
+                + " INNER JOIN muaggatt ON mapunit.mukey=muaggatt.mukey  WHERE "
+                + " legend.areatypename like 'Non-MLRA%' ORDER BY NEWID();";
+
         try {
             ResultSet results;
             Statement statement = conn.createStatement();
@@ -58,22 +63,22 @@
                 String muname = results.getString("muname");
                 double muacres = results.getDouble("muacres");
                 double brockdepmin = results.getDouble("brockdepmin");
-                count++;                
+                count++;
             }
-            Assert.assertTrue(count==100);
+            Assert.assertTrue(count == 100);
         } catch (SQLException ex) {
             Logger.getLogger(TestDriver.class.getName()).log(Level.SEVERE, null, ex);
             Assert.assertTrue(false);
         }
     }
-    
-    @Test 
-    public void testBadColumnName(){
-        String query = "SELECT top 1 legend.areasymbol, mapunit.musym, mapunit.mukey, mapunit.muname, muacres, brockdepmin FROM mapunit "                
+
+    @Test
+    public void testBadColumnName() {
+        String query = "SELECT top 1 legend.areasymbol, mapunit.musym, mapunit.mukey, mapunit.muname, muacres, brockdepmin FROM mapunit "
                 + "INNER JOIN legend ON mapunit.lkey=legend.lkey  "
                 + "INNER JOIN muaggatt ON mapunit.mukey=muaggatt.mukey  WHERE "
                 + " legend.areatypename like 'Non-MLRA%' ORDER BY mapunit.mukey;";
-            
+
         try {
             ResultSet results;
             Statement statement = conn.createStatement();
@@ -87,38 +92,59 @@
                 String muname = results.getString("muname");
                 double muacres = results.getDouble("muacres");
                 double brockdepmin = results.getDouble("brockdepmin");
-                double area = results.getDouble("area");   
+                double area = results.getDouble("area");
                 count++;
             }
             Assert.assertFalse(count > 0);  //We should have recived an SQLException.
         } catch (SQLException ex) {
             Logger.getLogger(TestDriver.class.getName()).log(Level.SEVERE, ex.getMessage());
             Assert.assertTrue(true);
-        }        
+        }
     }
-    
+
     @Test
-    public void testComplexIntersectionQuery(){
-        String query = "SELECT areasymbol, musym, mukey, muname, muacres, brockdepmin, geography::STGeomFromText(intersectPoly.STAsText(), 4326).MakeValid().STArea() / 4046.86 AS area   FROM  (SELECT m.areasymbol, m.musym, m.mukey, mapunit.muacres, mapunit.muname, muaggatt.brockdepmin,  m.mupolygongeo.STIntersection(geometry::STGeomFromText ('POLYGON ((-72.54863 42.4476, -72.54835 42.44746, -72.54756 42.44709, -72.54863 42.44709, -72.54863 42.4476))', 4326)).MakeValid() as intersectPoly  FROM dbo.mupolygon as m  WITH (index(SI_mupolygon_24876))  INNER JOIN dbo.mapunit ON m.mukey=dbo.mapunit.mukey  INNER JOIN dbo.legend ON mapunit.lkey=dbo.legend.lkey  INNER JOIN dbo.muaggatt ON m.mukey=dbo.muaggatt.mukey  WHERE m.mupolygongeo.STIntersects(geometry::STGeomFromText ('POLYGON ((-72.54863 42.4476, -72.54835 42.44746, -72.54756 42.44709, -72.54863 42.44709, -72.54863 42.4476))', 4326)) = 1  AND m.mupolygongeo.STIsValid()=1  AND (geometry:: STGeomFromText ('POLYGON ((-72.54863 42.4476, -72.54835 42.44746, -72.54756 42.44709, -72.54863 42.44709, -72.54863 42.4476))', 4326).STIsValid())=1  AND legend.areatypename like 'Non-MLRA%' ) as a ORDER BY mukey;";
-            
-        try {
-            ResultSet results;
-            Statement statement = conn.createStatement();
-            results = statement.executeQuery(query);
+    public void testComplexIntersectionQuery() {
+        String bufferWKT;
 
-            while (results.next()) {
-                String areasymbol = results.getString("areasymbol");
-                String musym = results.getString("musym");
-                String mukey = results.getString("mukey");
-                String muname = results.getString("muname");
-                double muacres = results.getDouble("muacres");
-                double brockdepmin = results.getDouble("brockdepmin");
-                double area = results.getDouble("area");
+        for (RandomMapunit tMapunit : testMapunits) {
+            bufferWKT = tMapunit.getBufferWKT();
+
+            String query = "SELECT areasymbol, musym, mukey, muname, muacres, brockdepmin, "
+                    + " geography::STGeomFromText(intersectPoly.STAsText(), 4326).MakeValid().STArea() / 4046.86 AS area   "
+                    + " FROM  ("
+                    + "        SELECT m.areasymbol, m.musym, m.mukey, mapunit.muacres, mapunit.muname, muaggatt.brockdepmin,  "
+                    + "               m.mupolygongeo.STIntersection(geometry::STGeomFromText ('" + bufferWKT + "', 4326)).MakeValid() as intersectPoly  "
+                    + "         FROM dbo.mupolygon as m  WITH (index(SI_mupolygon_24876))  "
+                    + "           INNER JOIN dbo.mapunit ON m.mukey=dbo.mapunit.mukey  "
+                    + "           INNER JOIN dbo.legend ON mapunit.lkey=dbo.legend.lkey  "
+                    + "           INNER JOIN dbo.muaggatt ON m.mukey=dbo.muaggatt.mukey  "
+                    + "         WHERE m.mupolygongeo.STIntersects(geometry::STGeomFromText ('" + bufferWKT + "', 4326)) = 1  "
+                    + "              AND m.mupolygongeo.STIsValid()=1 "
+                    + "              AND (geometry:: STGeomFromText ('" + bufferWKT + "', 4326).STIsValid())=1  "
+                    + "              AND legend.areatypename like 'Non-MLRA%' ) as a ORDER BY mukey;";
+
+            try {
+                ResultSet results;
+                Statement statement = conn.createStatement();
+                results = statement.executeQuery(query);
+                double area = 0.0;
+
+                while (results.next()) {
+                    String areasymbol = results.getString("areasymbol");
+                    String musym = results.getString("musym");
+                    String mukey = results.getString("mukey");
+                    String muname = results.getString("muname");
+                    double muacres = results.getDouble("muacres");
+                    double brockdepmin = results.getDouble("brockdepmin");
+                    area += results.getDouble("area");
+                }
+                
+                Assert.assertEquals(area, tMapunit.getArea(), MAX_AREA_DELTA);
+            } catch (SQLException ex) {
+                Logger.getLogger(TestDriver.class.getName()).log(Level.SEVERE, null, ex);
+                Assert.assertTrue(false);
             }
-        } catch (SQLException ex) {
-            Logger.getLogger(TestDriver.class.getName()).log(Level.SEVERE, null, ex);
-            Assert.assertTrue(false);
-        }        
+        }
     }
 
     @BeforeClass
@@ -127,6 +153,36 @@
         Reporter.log("Driver was loaded for: org.csu.csip.sdm.SDMDrive");
         conn = DriverManager.getConnection("jdbc:sdm:rest://SDMDataAccess.sc.egov.usda.gov/Tabular/post.rest");
         Reporter.log("Connection to remote SDM REST Service was successful");
+
+        //fill randomMapunits
+        String query = "SELECT mupolygon.mupolygonkey, mupolygon.mukey, legend.areasymbol, mupolygon.mupolygongeo.STCentroid().STAsText() as centerPoint "
+                + "FROM mupolygon, legend, mapunit "
+                + "  WHERE mupolygon.mupolygonkey in  "
+                + "  ("
+                + "    SELECT TOP " + MAX_RANDOM_MAPUNITS + " mupolygonkey "
+                + "       FROM mupolygon, legend, mapunit "
+                + "       WHERE legend.lkey=mapunit.lkey AND mapunit.mukey=mupolygon.mukey AND legend.areatypename like 'Non-MLRA%' "
+                + "       ORDER BY newid() "
+                + "  ) "
+                + "  AND legend.lkey=mapunit.lkey AND mapunit.mukey=mupolygon.mukey; ";
+
+        try {
+            ResultSet results;
+            Statement statement = conn.createStatement();
+            results = statement.executeQuery(query);
+
+            while (results.next()) {
+                RandomMapunit tMapunit = new RandomMapunit(results.getString("mupolygonkey"), results.getString("mukey"), results.getString("areasymbol"), results.getString("centerPoint"));
+                testMapunits.add(tMapunit);
+            }
+        } catch (SQLException ex) {
+            Logger.getLogger(TestDriver.class.getName()).log(Level.SEVERE, null, ex);
+            Assert.assertTrue(false);
+        }
+
+        for (RandomMapunit tMapunit : testMapunits) {
+            tMapunit.getBuffers(conn);
+        }
     }
 
     @AfterClass
@@ -140,4 +196,53 @@
     @AfterMethod
     public void tearDownMethod() throws Exception {
     }
+
+    private static class RandomMapunit {
+
+        private String mupolygonKey;
+        private String mukey;
+        private String areasymbol;
+        private String centroidWKT;
+        private String bufferWKT;
+        private double area;
+        private double bufferSize;
+
+        public RandomMapunit(String mupolygonKey, String mukey, String areasymbol, String centroidWKT) {
+            this.mupolygonKey = mupolygonKey;
+            this.mukey = mukey;
+            this.areasymbol = areasymbol;
+            this.centroidWKT = centroidWKT;
+            bufferSize = ThreadLocalRandom.current().nextDouble(50, 100);
+        }
+
+        public void getBuffers(Connection conn) {
+            String query = "SELECT geography::STGeomFromText('" + centroidWKT + "', 4326).STBuffer(" + bufferSize + ").STAsText() as bufferWKT, "
+                    + " geography::STGeomFromText('" + centroidWKT + "', 4326).STBuffer(" + bufferSize + ").STArea() / 4046.86 as area "
+                    + "FROM mupolygon"
+                    + "  WHERE mupolygonkey=" + mupolygonKey + "; ";
+
+            try {
+                ResultSet results;
+                Statement statement = conn.createStatement();
+                results = statement.executeQuery(query);
+
+                if (results.next()) {
+                    bufferWKT = results.getString("bufferWKT");
+                    area = results.getDouble("area");
+                }
+            } catch (SQLException ex) {
+                Logger.getLogger(TestDriver.class.getName()).log(Level.SEVERE, null, ex);
+                Assert.assertTrue(false);
+            }
+        }
+
+        public String getBufferWKT() {
+            return bufferWKT;
+        }
+
+        public double getArea() {
+            return area;
+        }
+    }
+
 }