Ticket 703: Add possibility to select what fields that should be included in the... jenkins-Beast-369
authorAnders Henja <anders@henjab.se>
Thu, 16 Nov 2017 21:16:10 +0000 (22:16 +0100)
committerAnders Henja <anders@henjab.se>
Thu, 16 Nov 2017 21:16:10 +0000 (22:16 +0100)
etc/create_db.sql
etc/upgrade_db.sql
itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest-delete.xls
itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest-store.xls
itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest-update.xls
itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest.java
itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest.xls
src/eu/baltrad/beast/rules/wrwp/WrwpRule.java
src/eu/baltrad/beast/rules/wrwp/WrwpRuleManager.java
test/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerTest.java
test/eu/baltrad/beast/rules/wrwp/WrwpRuleTest.java

index cc18016..ea320aa 100644 (file)
@@ -210,7 +210,8 @@ create table beast_wrwp_rules (
   mindistance INTEGER NOT NULL,
   maxdistance INTEGER NOT NULL,
   minelangle DECIMAL NOT NULL,
-  minvelocitythresh DECIMAL NOT NULL
+  minvelocitythresh DECIMAL NOT NULL,
+  fields TEXT NOT NULL
 );  
 
 create table beast_wrwp_sources (
index 6164481..f43418b 100644 (file)
@@ -337,6 +337,17 @@ BEGIN
 END;
 $$ LANGUAGE plpgsql;
 
+CREATE OR REPLACE FUNCTION update_beast_wrwp_with_fields() RETURNS VOID AS $$
+BEGIN
+  PERFORM true FROM information_schema.columns WHERE table_name = 'beast_wrwp_rules' AND column_name = 'fields';
+  IF NOT FOUND THEN
+    ALTER TABLE beast_wrwp_rules ADD COLUMN fields TEXT;
+    UPDATE beast_wrwp_rules SET fields='';
+    ALTER TABLE beast_wrwp_rules ALTER COLUMN fields SET NOT NULL;
+  END IF; 
+END;
+$$ LANGUAGE plpgsql;
+
 select create_beast_gmap_rules();
 select create_beast_host_filter();
 select create_beast_acrr_rules();
@@ -357,6 +368,7 @@ select update_beast_volume_rules_with_qc_mode();
 select update_beast_composite_rules_with_qc_mode();
 select update_beast_site2d_rules_with_qc_mode();
 select update_beast_composite_rules_with_reprocess_quality();
+select update_beast_wrwp_with_fields();
 
 drop function create_beast_gmap_rules();
 drop function create_beast_host_filter();
@@ -378,3 +390,4 @@ drop function update_beast_volume_rules_with_qc_mode();
 drop function update_beast_composite_rules_with_qc_mode();
 drop function update_beast_site2d_rules_with_qc_mode();
 drop function update_beast_composite_rules_with_reprocess_quality();
+drop function update_beast_wrwp_with_fields()
index 9e5c617..843bd91 100644 (file)
Binary files a/itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest-delete.xls and b/itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest-delete.xls differ
index 4b3b4a0..fde6453 100644 (file)
Binary files a/itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest-store.xls and b/itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest-store.xls differ
index d3008a2..5c50343 100644 (file)
Binary files a/itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest-update.xls and b/itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest-update.xls differ
index 1a27451..f454fe6 100644 (file)
@@ -102,6 +102,7 @@ public class WrwpRuleManagerITest {
     rule.setMaxdistance(20000);
     rule.setMinelevationangle(1.5);
     rule.setMinvelocitythreshold(0.5);
+    rule.setFields("de,ef");
     rule.setSources(sources);
     
     classUnderTest.store(4, rule);
@@ -120,12 +121,28 @@ public class WrwpRuleManagerITest {
     assertEquals(10000, rule.getMaxdistance());
     assertEquals(2.5, rule.getMinelevationangle(), 4);
     assertEquals(3.5, rule.getMinvelocitythreshold(), 4);
+    assertEquals("abcd", rule.getFieldsAsStr());
     assertEquals(3, rule.getSources().size());
     assertTrue(rule.getSources().contains("sekkr"));
     assertTrue(rule.getSources().contains("selul"));
     assertTrue(rule.getSources().contains("seang"));
   }
-  
+
+  @Test
+  public void test_load_empty_fields() throws Exception {
+    WrwpRule rule = (WrwpRule)classUnderTest.load(3);
+    assertEquals(500, rule.getInterval());
+    assertEquals(10000, rule.getMaxheight());
+    assertEquals(2000, rule.getMindistance());
+    assertEquals(20000, rule.getMaxdistance());
+    assertEquals(3.5, rule.getMinelevationangle(), 4);
+    assertEquals(2.5, rule.getMinvelocitythreshold(), 4);
+    assertEquals("", rule.getFieldsAsStr());
+    assertEquals(0, rule.getFields().size());
+    assertEquals(1, rule.getSources().size());
+    assertTrue(rule.getSources().contains("selek"));
+  }
+
   @Test
   public void test_update() throws Exception {
     List<String> sources = new ArrayList<String>();
@@ -139,6 +156,7 @@ public class WrwpRuleManagerITest {
     rule.setMaxdistance(5000);
     rule.setMinelevationangle(1.1);
     rule.setMinvelocitythreshold(0.1);
+    rule.setFields("ghgh");
     rule.setSources(sources);
 
     classUnderTest.update(2, rule);
index a0a43e4..3b3ff60 100644 (file)
Binary files a/itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest.xls and b/itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest.xls differ
index 655986c..48e7a28 100644 (file)
@@ -21,6 +21,9 @@ package eu.baltrad.beast.rules.wrwp;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.StringTokenizer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
@@ -98,6 +101,11 @@ public class WrwpRule implements IRule, InitializingBean {
   private double velocitythreshold = 2.0;
   
   /**
+   * A list of fields to generate
+   */
+  private List<String> fields = new ArrayList<String>();
+  
+  /**
    * The filter used for matching files
    */
   private IFilter filter = null;
@@ -107,6 +115,8 @@ public class WrwpRule implements IRule, InitializingBean {
    */
   private MetadataMatcher matcher;
   
+  private Pattern FIELDS_PATTERN = Pattern.compile("^[A-Za-z_0-9\\-]+$");
+  
   /**
    * The logger
    */
@@ -256,6 +266,72 @@ public class WrwpRule implements IRule, InitializingBean {
     return this.sources;
   }
   
+  /**
+   * @return a comma separated list of fields to generate
+   */
+  public String getFieldsAsStr() {
+    String result = "";
+    if (fields.size()==0)
+      return "";
+    
+    for (String s : fields) {
+      result = result + "," + s;
+    }
+    
+    return result.substring(1);
+  }
+
+  /**
+   * @return a list of fields
+   */
+  public List<String> getFields() {
+    return fields;
+  }
+  
+  /**
+   * @param fields a comma separated list of fields to generate
+   */
+  public boolean setFields(String fields) {
+    List<String> newFields = new ArrayList<String>();
+    
+    if (fields==null)
+      return false;
+    
+    if (fields.trim().length()==0) {
+      this.fields = newFields;
+      return true;
+    }
+    
+    StringTokenizer tokenizer=new StringTokenizer(fields, ",");
+    while (tokenizer.hasMoreTokens()) {
+      String token = tokenizer.nextToken().trim();
+      Matcher m = FIELDS_PATTERN.matcher(token);
+      if (!m.matches())
+        return false;
+      newFields.add(token);
+    }
+    this.fields = newFields;
+    return true;
+  }
+  
+  /**
+   * Sets the fields to generate 
+   * @param fields the fields to generate
+   * @return if field names are allowed
+   */
+  public boolean setFields(List<String> fields) {
+    List<String> newFields = new ArrayList<String>();
+    for (String s : fields) {
+      String fname = s.trim();
+      Matcher m = FIELDS_PATTERN.matcher(fname);
+      if (!m.matches())
+        return false;
+      newFields.add(fname);
+    }
+    this.fields = newFields;
+    return true;
+  }
+  
   public IFilter getFilter() {
     return filter;
   }
@@ -295,6 +371,8 @@ public class WrwpRule implements IRule, InitializingBean {
           args.add("--maxdistance="+maxdistance);
           args.add("--minelevationangle="+minelevationangle);
           args.add("--velocitythreshold="+velocitythreshold);
+          if (fields.size() > 0)
+            args.add("--fields="+getFieldsAsStr());
           result.setArguments(args.toArray(new String[0]));
         }
       }
index 6612659..4c91f6f 100644 (file)
@@ -92,12 +92,13 @@ public class WrwpRuleManager implements IRuleManager {
     int maxdistance = wrule.getMaxdistance();
     double minelangle = wrule.getMinelevationangle();
     double minvelocitythresh = wrule.getMinvelocitythreshold();
+    String fields = wrule.getFieldsAsStr();
     
     template.update(
         "INSERT INTO beast_wrwp_rules" +
-        " (rule_id, interval, maxheight, mindistance, maxdistance, minelangle, minvelocitythresh)" +
-        " VALUES (?,?,?,?,?,?,?)", 
-        new Object[]{ruleId, interval, maxheight, mindistance, maxdistance, minelangle, minvelocitythresh});
+        " (rule_id, interval, maxheight, mindistance, maxdistance, minelangle, minvelocitythresh, fields)" +
+        " VALUES (?,?,?,?,?,?,?,?)", 
+        new Object[]{ruleId, interval, maxheight, mindistance, maxdistance, minelangle, minvelocitythresh, fields});
     
     updateSources(ruleId, wrule.getSources());
     
@@ -130,11 +131,12 @@ public class WrwpRuleManager implements IRuleManager {
     int maxdistance = wrule.getMaxdistance();
     double minelangle = wrule.getMinelevationangle();
     double minvelocitythresh = wrule.getMinvelocitythreshold();
+    String fields = wrule.getFieldsAsStr();
     
     template.update(
         "UPDATE beast_wrwp_rules SET interval=?, maxheight=?, mindistance=?," +
-        " maxdistance=?, minelangle=?, minvelocitythresh=? WHERE rule_id=?",
-        new Object[]{interval, maxheight, mindistance, maxdistance, minelangle, minvelocitythresh, ruleId});
+        " maxdistance=?, minelangle=?, minvelocitythresh=?, fields=? WHERE rule_id=?",
+        new Object[]{interval, maxheight, mindistance, maxdistance, minelangle, minvelocitythresh, fields, ruleId});
     
     updateSources(ruleId, wrule.getSources());
     
@@ -205,6 +207,9 @@ public class WrwpRuleManager implements IRuleManager {
         result.setMaxdistance(rs.getInt("maxdistance"));
         result.setMinelevationangle(rs.getDouble("minelangle"));
         result.setMinvelocitythreshold(rs.getDouble("minvelocitythresh"));
+        String fields = rs.getString("fields");
+        result.setFields(fields == null ? "" : fields);
+
         result.setSources(getSources(result.getRuleId()));
         return result;
       }
index 86c0bf8..90c4063 100644 (file)
@@ -108,11 +108,12 @@ public class WrwpRuleManagerTest extends EasyMockSupport {
     rule.setMinelevationangle(1.5);
     rule.setMinvelocitythreshold(10.0);
     rule.setSources(sources);
+    rule.setFields("dd,aa");
 
     expect(jdbc.update("INSERT INTO beast_wrwp_rules " + 
-               "(rule_id, interval, maxheight, mindistance, maxdistance, minelangle, minvelocitythresh) " +
-        "VALUES (?,?,?,?,?,?,?)", 
-        new Object[]{10, 300, 5000, 1000, 10000, 1.5, 10.0})).andReturn(1);
+               "(rule_id, interval, maxheight, mindistance, maxdistance, minelangle, minvelocitythresh, fields) " +
+        "VALUES (?,?,?,?,?,?,?,?)", 
+        new Object[]{10, 300, 5000, 1000, 10000, 1.5, 10.0, "dd,aa"})).andReturn(1);
     
     filterManager.deleteFilters(10);
     
@@ -174,12 +175,13 @@ public class WrwpRuleManagerTest extends EasyMockSupport {
     rule.setMaxdistance(10000);
     rule.setMinelevationangle(1.5);
     rule.setMinvelocitythreshold(10.0);
+    rule.setFields("aa,dd");
     rule.setSources(sources);
 
     expect(jdbc.update(
         "UPDATE beast_wrwp_rules SET interval=?, maxheight=?, mindistance=?," +
-        " maxdistance=?, minelangle=?, minvelocitythresh=? WHERE rule_id=?",
-        new Object[]{300, 5000, 1000, 10000, 1.5, 10.0, 12})).andReturn(1);
+        " maxdistance=?, minelangle=?, minvelocitythresh=?, fields=? WHERE rule_id=?",
+        new Object[]{300, 5000, 1000, 10000, 1.5, 10.0, "aa,dd", 12})).andReturn(1);
     methods.updateSources(12, sources);
     
     filterManager.deleteFilters(12);
@@ -307,6 +309,7 @@ public class WrwpRuleManagerTest extends EasyMockSupport {
     expect(rs.getInt("maxdistance")).andReturn(10000);
     expect(rs.getDouble("minelangle")).andReturn(4.5);
     expect(rs.getDouble("minvelocitythresh")).andReturn(1.5);
+    expect(rs.getString("fields")).andReturn("aa,dd");
     
     expect(methods.getSources(3)).andReturn(sources);
     
@@ -325,12 +328,53 @@ public class WrwpRuleManagerTest extends EasyMockSupport {
     assertEquals(10000, result.getMaxdistance());
     assertEquals(4.5, result.getMinelevationangle(), 4);
     assertEquals(1.5, result.getMinvelocitythreshold(), 4);
+    assertEquals("aa,dd", result.getFieldsAsStr());
     assertSame(sources, result.getSources());
     assertSame(cat, result.getCatalog());
     assertSame(utils, result.getRuleUtilities());
   }
 
   @Test
+  public void test_wrwp_rule_mapper_fields_null() throws Exception {
+    IRuleUtilities utils = createMock(IRuleUtilities.class);
+    Catalog cat = createMock(Catalog.class);
+    ResultSet rs = createMock(ResultSet.class);
+
+    List<String> sources = new ArrayList<String>();
+    
+    expect(rs.getInt("rule_id")).andReturn(3);
+    expect(rs.getInt("interval")).andReturn(300);
+    expect(rs.getInt("maxheight")).andReturn(5000);
+    expect(rs.getInt("mindistance")).andReturn(1000);
+    expect(rs.getInt("maxdistance")).andReturn(10000);
+    expect(rs.getDouble("minelangle")).andReturn(4.5);
+    expect(rs.getDouble("minvelocitythresh")).andReturn(1.5);
+    expect(rs.getString("fields")).andReturn(null);
+    
+    expect(methods.getSources(3)).andReturn(sources);
+    
+    classUnderTest.setCatalog(cat);
+    classUnderTest.setRuleUtilities(utils);
+    
+    replayAll();
+    
+    WrwpRule result = classUnderTest.getWrwpRuleMapper().mapRow(rs, 1); 
+    
+    verifyAll();
+    assertEquals(3, result.getRuleId());
+    assertEquals(300, result.getInterval());
+    assertEquals(5000, result.getMaxheight());
+    assertEquals(1000, result.getMindistance());
+    assertEquals(10000, result.getMaxdistance());
+    assertEquals(4.5, result.getMinelevationangle(), 4);
+    assertEquals(1.5, result.getMinvelocitythreshold(), 4);
+    assertEquals("", result.getFieldsAsStr());
+    assertSame(sources, result.getSources());
+    assertSame(cat, result.getCatalog());
+    assertSame(utils, result.getRuleUtilities());
+  }
+  
+  @Test
   public void test_source_mapper() throws Exception {
     ResultSet rs = createMock(ResultSet.class);
    
index cadd7cb..207ad67 100644 (file)
@@ -118,6 +118,61 @@ public class WrwpRuleTest extends EasyMockSupport {
   }
   
   @Test
+  public void test_fields() {
+    assertEquals(0, classUnderTest.getFields().size());
+    List<String> newFields = new ArrayList<String>();
+    newFields.add("ff");
+    newFields.add(" fg");
+    newFields.add("fh ");
+
+    assertEquals(true, classUnderTest.setFields(newFields));
+    
+    assertEquals(3, classUnderTest.getFields().size());
+    assertEquals("ff", classUnderTest.getFields().get(0));
+    assertEquals("fg", classUnderTest.getFields().get(1));
+    assertEquals("fh", classUnderTest.getFields().get(2));
+  }
+
+  @Test
+  public void test_invalid_field() {
+    assertEquals(0, classUnderTest.getFields().size());
+    List<String> newFields = new ArrayList<String>();
+    newFields.add("f f");
+
+    assertEquals(false, classUnderTest.setFields(newFields));
+    
+    assertEquals(0, classUnderTest.getFields().size());
+  }
+  
+  @Test
+  public void test_fields_str() {
+    assertEquals("", classUnderTest.getFieldsAsStr());
+    String[][] valid_values={
+        {"ff,ff_dev,dd ","ff,ff_dev,dd"},
+        {" ff, ff_dev, dd", "ff,ff_dev,dd"},
+        {",ff,ff_dev,dd", "ff,ff_dev,dd"},
+        {"   ", ""}}; 
+    
+    for (String[] x : valid_values) {
+      assertEquals(true, classUnderTest.setFields(x[0]));
+      assertEquals(x[1], classUnderTest.getFieldsAsStr());
+    }
+  }
+  
+  @Test
+  public void test_fields_nok_str() {
+    assertEquals("", classUnderTest.getFieldsAsStr());
+    String[] valid_values={
+        " ff, ff _dev, dd",
+        " f a  "}; 
+    
+    for (String x : valid_values) {
+      assertEquals(false, classUnderTest.setFields(x));
+      assertEquals("", classUnderTest.getFieldsAsStr());
+    }
+  }
+  
+  @Test
   public void test_handle() {
     FileEntry fe = createMock(FileEntry.class);
     Metadata meta = createMock(Metadata.class);
@@ -162,6 +217,52 @@ public class WrwpRuleTest extends EasyMockSupport {
   }
 
   @Test
+  public void test_handle_with_fields() {
+    FileEntry fe = createMock(FileEntry.class);
+    Metadata meta = createMock(Metadata.class);
+    Source src = new Source("seang");
+    List<String> sources = new ArrayList<String>();
+    UUID uuid = UUID.randomUUID();
+    
+    sources.add("searl");
+    sources.add("seang");
+    
+    BltDataMessage msg = new BltDataMessage();
+    msg.setFileEntry(fe);
+    
+    classUnderTest.setInterval(500);
+    classUnderTest.setMaxdistance(10000);
+    classUnderTest.setMindistance(1000);
+    classUnderTest.setMaxheight(10000);
+    classUnderTest.setMinelevationangle(3.5);
+    classUnderTest.setMinvelocitythreshold(4.5);
+    classUnderTest.setSources(sources);
+    classUnderTest.setFields("ff,ff_dev,dd");
+    
+    expect(fe.getMetadata()).andReturn(meta);
+    expect(meta.getWhatObject()).andReturn("PVOL");
+    expect(fe.getSource()).andReturn(src);
+    expect(fe.getUuid()).andReturn(uuid);
+    
+    replayAll();
+    
+    BltGenerateMessage result = (BltGenerateMessage)classUnderTest.handle(msg);
+    
+    verifyAll();
+    assertEquals("eu.baltrad.beast.GenerateWrwp", result.getAlgorithm());
+    assertEquals(1, result.getFiles().length);
+    assertEquals(uuid.toString(), result.getFiles()[0]);
+    assertEquals(7, result.getArguments().length);
+    assertEquals("--interval=500", result.getArguments()[0]);
+    assertEquals("--maxheight=10000", result.getArguments()[1]);
+    assertEquals("--mindistance=1000", result.getArguments()[2]);
+    assertEquals("--maxdistance=10000", result.getArguments()[3]);
+    assertEquals("--minelevationangle=3.5", result.getArguments()[4]);
+    assertEquals("--velocitythreshold=4.5", result.getArguments()[5]);
+    assertEquals("--fields=ff,ff_dev,dd", result.getArguments()[6]);
+  }
+  
+  @Test
   public void test_handle_notSupportedSource() {
     FileEntry fe = createMock(FileEntry.class);
     Metadata meta = createMock(Metadata.class);