LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  September 2015

HPS-SVN September 2015

Subject:

r3524 - in /java/trunk: conditions/ conditions/src/main/java/org/hps/conditions/ conditions/src/main/java/org/hps/conditions/api/ conditions/src/main/java/org/hps/conditions/cli/ conditions/src/main/java/org/hps/conditions/database/ conditions/src/main/java/org/hps/conditions/run/ conditions/src/test/java/org/hps/conditions/ conditions/src/test/java/org/hps/conditions/api/ evio/src/main/java/org/hps/evio/

From:

[log in to unmask]

Reply-To:

Notification of commits to the hps svn repository <[log in to unmask]>

Date:

Fri, 4 Sep 2015 19:59:40 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (960 lines)

Author: [log in to unmask]
Date: Fri Sep  4 12:59:35 2015
New Revision: 3524

Log:
Merge in conditions branch to trunk.  HPSJAVA-517

Added:
    java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsTag.java
      - copied unchanged from r3393, java/branches/conditions-HPSJAVA-517/src/main/java/org/hps/conditions/api/ConditionsTag.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsTagConverter.java
      - copied unchanged from r3393, java/branches/conditions-HPSJAVA-517/src/main/java/org/hps/conditions/database/ConditionsTagConverter.java
    java/trunk/conditions/src/test/java/org/hps/conditions/api/ConditionsTagTest.java
      - copied, changed from r3393, java/branches/conditions-HPSJAVA-517/src/test/java/org/hps/conditions/api/ConditionsTagTest.java
Modified:
    java/trunk/conditions/   (props changed)
    java/trunk/conditions/pom.xml
    java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/TableMetaData.java
    java/trunk/conditions/src/main/java/org/hps/conditions/cli/AbstractCommand.java
    java/trunk/conditions/src/main/java/org/hps/conditions/cli/AddCommand.java
    java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java
    java/trunk/conditions/src/main/java/org/hps/conditions/cli/TagCommand.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java
    java/trunk/conditions/src/main/java/org/hps/conditions/run/RunSpreadsheet.java
    java/trunk/conditions/src/test/java/org/hps/conditions/EngRunConditionsTest.java
    java/trunk/evio/src/main/java/org/hps/evio/EvioToLcio.java

Modified: java/trunk/conditions/pom.xml
 =============================================================================
--- java/trunk/conditions/pom.xml	(original)
+++ java/trunk/conditions/pom.xml	Fri Sep  4 12:59:35 2015
@@ -32,12 +32,14 @@
                         <exclude>org/hps/conditions/svt/SvtDetectorSetupTest.java</exclude> 
                         <exclude>org/hps/conditions/svt/SvtConfigurationTest.java</exclude>
                         <exclude>org/hps/conditions/svt/SvtDaqMappingTest.java</exclude>
+                        <exclude>org/hps/conditions/svt/TestRunSvtBadChannelsTest.java</exclude>
                         <exclude>org/hps/conditions/svt/TestRunSvtConditionsConverterTest.java</exclude>
                         <exclude>org/hps/conditions/svt/TestRunSvtDaqMappingTest.java</exclude>
                         <exclude>org/hps/conditions/beam/BeamConditionsTest.java</exclude>
                         <exclude>org/hps/conditions/ecal/EcalHardwareConditionsTest.java</exclude>
                         <exclude>org/hps/conditions/database/CollectionIdTest.java</exclude>
                         <exclude>org/hps/conditions/svt/SvtTimingConstantsTest.java</exclude>
+                        <exclude>org/hps/conditions/api/ConditionsTagTest.java</exclude>
                         <exclude>org/hps/conditions/dummy/**.java</exclude>
                     </excludes>
                 </configuration>

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java	Fri Sep  4 12:59:35 2015
@@ -75,7 +75,7 @@
 
         if (this.tag != null) {
             // Set a tag for filtering ConditionsRecord objects.
-            conditionsManager.setTag(this.tag);
+            conditionsManager.addTag(this.tag);
         }
         if (this.detectorName != null) {
             // The manager can only be initialized here if there is a user supplied detector name.

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java	Fri Sep  4 12:59:35 2015
@@ -358,9 +358,11 @@
     /**
      * Get the string tag associated with these conditions.
      *
+     * @deprecated Use the {@link ConditionsTag} class instead.
      * @return The string tag.
      */
     @Field(names = {"tag"})
+    @Deprecated
     public String getTag() {
         return this.getFieldValue("tag");
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/api/TableMetaData.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/TableMetaData.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/TableMetaData.java	Fri Sep  4 12:59:35 2015
@@ -262,9 +262,16 @@
         buff.append('\n');
         return buff.toString();
     }
-
-    // TODO: add methods for getting SQL strings for PreparedStatements; can be setup once at initialization time for
-    // each table
+    
+    /**
+     * Method for removing a field that was found using the automatic introspection methods.
+     */
+    void removeField(String fieldName) {
+        fieldNames.remove(fieldName);
+        fieldTypes.remove(fieldName);
+    }
+
+    // TODO: add methods for getting SQL strings for PreparedStatements; can be setup once at initialization time for each table
     // String getSelectStatement();
     // String getInsertStatement();
     // String getUpdateStatement();

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/cli/AbstractCommand.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/cli/AbstractCommand.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/cli/AbstractCommand.java	Fri Sep  4 12:59:35 2015
@@ -6,6 +6,7 @@
 import org.apache.commons.cli.ParseException;
 import org.apache.commons.cli.Parser;
 import org.apache.commons.cli.PosixParser;
+import org.hps.conditions.database.DatabaseConditionsManager;
 
 /**
  * This is the API that sub-commands such as 'load' or 'print' must implement in the conditions command line interface.
@@ -108,4 +109,12 @@
         final HelpFormatter help = new HelpFormatter();
         help.printHelp(this.getName(), this.getOptions());
     }
+    
+    /**
+     * Convenience method for getting the conditions manager.
+     * @return the conditions manager
+     */
+    public DatabaseConditionsManager getManager() {
+        return DatabaseConditionsManager.getInstance();
+    }
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/cli/AddCommand.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/cli/AddCommand.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/cli/AddCommand.java	Fri Sep  4 12:59:35 2015
@@ -41,7 +41,6 @@
         OPTIONS.getOption("t").setRequired(true);
         OPTIONS.addOption("c", true, "collection ID (required)");
         OPTIONS.getOption("c").setRequired(true);
-        OPTIONS.addOption("T", true, "tag value (optional)");
         OPTIONS.addOption("u", true, "user name (optional)");
         OPTIONS.addOption("m", true, "notes about this conditions set (optional)");
     }
@@ -67,7 +66,7 @@
      * @return the new conditions record
      */
     private ConditionsRecord createConditionsRecord(final int runStart, final int runEnd, final String tableName,
-            final String name, final int collectionId, final String createdBy, final String tag, final String notes) {
+            final String name, final int collectionId, final String createdBy, final String notes) {
         final ConditionsRecord conditionsRecord = new ConditionsRecord();
         final FieldValuesMap fieldValues = new FieldValuesMap();
         fieldValues.setValue("run_start", runStart);
@@ -76,9 +75,6 @@
         fieldValues.setValue("name", name);
         fieldValues.setValue("collection_id", collectionId);
         fieldValues.setValue("created_by", createdBy);
-        if (tag != null) {
-            fieldValues.setValue("tag", tag);
-        }
         if (notes != null) {
             fieldValues.setValue("notes", notes);
         }
@@ -134,12 +130,6 @@
             createdBy = commandLine.getOptionValue("u");
         }
 
-        // Tag to assign (optional).
-        String tag = null;
-        if (commandLine.hasOption("T")) {
-            tag = commandLine.getOptionValue("T");
-        }
-
         // Notes (optional).
         String notes = null;
         if (commandLine.hasOption("m")) {
@@ -148,7 +138,7 @@
 
         // Create the conditions record to insert.
         final ConditionsRecord conditionsRecord = this.createConditionsRecord(runStart, runEnd, tableName, name,
-                collectionId, createdBy, tag, notes);
+                collectionId, createdBy, notes);
         LOGGER.info("inserting conditions record ..." + '\n' + conditionsRecord);
         try {
             boolean createdConnection = false;

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java	Fri Sep  4 12:59:35 2015
@@ -202,7 +202,7 @@
         // User specified tag of conditions records.
         if (commandLine.hasOption("t")) {
             final String tag = commandLine.getOptionValue("t");
-            this.conditionsManager.setTag(tag);
+            this.conditionsManager.addTag(tag);
             LOGGER.config("using tag " + tag);
         }
 

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/cli/TagCommand.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/cli/TagCommand.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/cli/TagCommand.java	Fri Sep  4 12:59:35 2015
@@ -1,9 +1,9 @@
 package org.hps.conditions.cli;
 
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -12,54 +12,81 @@
 import org.apache.commons.cli.Options;
 import org.hps.conditions.api.ConditionsObjectException;
 import org.hps.conditions.api.ConditionsRecord;
-import org.hps.conditions.api.TableRegistry;
 import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
+import org.hps.conditions.api.ConditionsTag;
+import org.hps.conditions.api.ConditionsTag.ConditionsTagCollection;
 import org.hps.conditions.api.DatabaseObjectException;
 import org.hps.conditions.api.TableMetaData;
-import org.hps.conditions.database.DatabaseConditionsManager;
-import org.lcsim.conditions.ConditionsManager.ConditionsNotFoundException;
+import org.hps.conditions.api.TableRegistry;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.lcsim.util.log.DefaultLogFormatter;
 import org.lcsim.util.log.LogUtil;
 
 /**
  * Create a conditions system tag.
+ * <p>
+ * The tag groups together conditions records from the <i>conditions</i> database table with a run validity range that 
+ * is between a specified starting and ending run.
+ * <p>
+ * Tagging will not disambiguate overlapping conditions, which is done at run-time based on the current run number.
  *
  * @author Jeremy McCormick, SLAC
  */
-public class TagCommand extends AbstractCommand {
-
-    /**
-     * The default detector name (dummy detector).
-     */
-    private static final String DETECTOR_NAME = "HPS-dummy-detector";
-
-    /**
-     * Setup logger.
-     */
-    private static final Logger LOGGER = LogUtil.create(TagCommand.class);
-
+final class TagCommand extends AbstractCommand {
+
+    /**
+     * Setup the logger.
+     */
+    private static final Logger LOGGER = LogUtil.create(TagCommand.class, new DefaultLogFormatter(), Level.ALL);
+    
     /**
      * Defines command options.
      */
     private static Options OPTIONS = new Options();
 
     /**
-     * Define command options.
+     * Define all command options.
      */
     static {
         OPTIONS.addOption(new Option("h", false, "Show help for tag command"));
-        OPTIONS.addOption(new Option("r", true, "List of run numbers to scan (at least one must be provided)"));
-        OPTIONS.getOption("r").setArgs(Option.UNLIMITED_VALUES);
-        OPTIONS.getOption("r").setRequired(true);
-        OPTIONS.addOption(new Option("t", true, "The new conditions tag"));
+        OPTIONS.addOption(new Option("t", true, "Conditions tag name"));
+        OPTIONS.addOption(new Option("s", true, "Starting run number (required)"));
+        OPTIONS.getOption("s").setRequired(true);
+        OPTIONS.addOption(new Option("e", true, "Ending run number (default is unlimited)"));
         OPTIONS.getOption("t").setRequired(true);
-        OPTIONS.addOption(new Option("f", false, "Don't prompt before making tag (careful!)"));
+        OPTIONS.addOption(new Option("m", true,
+                "MultipleCollectionsAction to use for disambiguation (default is LAST_CREATED)"));
+        OPTIONS.addOption(new Option("d", false, "Don't prompt before making tag (be careful!)"));
     }
 
     /**
      * Class constructor.
      */
     TagCommand() {
-        super("tag", "Tag a set of collections by copying their conditions records", OPTIONS);
+        super("tag", "Tag a set of conditions records to group them together", OPTIONS);
+    }
+
+    /**
+     * Create the collection with the records for creating a new conditions "tag".
+     *
+     * @param tagConditionsRecordCollection the tag record collection
+     * @param tagName the tag name
+     * @return the tag record collection
+     */
+    private ConditionsTagCollection createConditionsTagCollection(
+            final ConditionsRecordCollection tagConditionsRecordCollection, final String tagName) {
+        final ConditionsTagCollection conditionsTagCollection = new ConditionsTagCollection();
+        conditionsTagCollection.setConnection(this.getManager().getConnection());
+        conditionsTagCollection.setTableMetaData(TableRegistry.getTableRegistry().findByTableName("conditions_tags"));
+        for (final ConditionsRecord conditionsRecord : tagConditionsRecordCollection) {
+            final ConditionsTag conditionsTag = new ConditionsTag(conditionsRecord.getRowId(), tagName);
+            try {
+                conditionsTagCollection.add(conditionsTag);
+            } catch (final ConditionsObjectException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return conditionsTagCollection;
     }
 
     /**
@@ -70,108 +97,154 @@
 
         final CommandLine commandLine = this.parse(arguments);
 
-        final Set<Integer> runNumbers = new LinkedHashSet<Integer>();
-        if (commandLine.getOptionValues("r") == null) {
-            throw new RuntimeException("Missing -r argument with list of run numbers.");
-        }
-        for (final String value : commandLine.getOptionValues("r")) {
-            runNumbers.add(Integer.parseInt(value));
-        }
-        if (runNumbers.size() == 0) {
-            throw new RuntimeException("At least one run number must be provided with the -r switch.");
-        }
-
-        final String newTag;
+        // New tag name.
+        final String tagName;
         if (commandLine.hasOption("t")) {
-            newTag = commandLine.getOptionValue("t");
+            tagName = commandLine.getOptionValue("t");
+            LOGGER.info("tag name set to " + tagName);
         } else {
             throw new RuntimeException("Missing required -t argument with the tag name.");
         }
 
-        boolean dontPrompt = false;
-        if (commandLine.hasOption("f")) {
-            dontPrompt = true;
-        }
-
-        final ConditionsRecordCollection tagRecords = new ConditionsRecordCollection();
-        final Set<Integer> addedIds = new HashSet<Integer>();
-
-        final DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance();
-        manager.setXmlConfig("/org/hps/conditions/config/conditions_database_no_svt.xml");
-        manager.setLogLevel(Level.ALL);
-
-        // Scan through all the runs between the start and end run, inclusive.
-        for (final Integer run : runNumbers) {
-            try {
-                // Setup the conditions manager with the run number.
-                manager.setDetector(TagCommand.DETECTOR_NAME, run);
-            } catch (final ConditionsNotFoundException e) {
-                throw new RuntimeException(e);
-            }
-
-            // The unique conditions keys from this run.
-            final Set<String> keys = manager.getConditionsRecords().getConditionsKeys();
-
-            // Scan through all the unique keys.
-            for (final String key : keys) {
-
-                // Get the table meta data for the key.
-                final TableMetaData tableMetaData = manager.findTableMetaData(key);
-
-                // Get the ConditionsRecord from the collection.
-                final ConditionsRecordCollection records = manager.findConditionsRecords(key);
-                records.sortByUpdated();
-                final ConditionsRecord record = records.get(records.size() - 1);
-
-                manager.getCachedConditions(tableMetaData.getCollectionClass(), tableMetaData.getTableName())
-                        .getCachedData();
-
-                // Is this record already part of the new tag?
-                if (!addedIds.contains(record.getRowId())) {
-                    // Create a new record copied from the old one.
-                    final ConditionsRecord newRecord = new ConditionsRecord(record);
-
-                    // Set the tag value.
-                    newRecord.setFieldValue("tag", newTag);
-
-                    // Add the record to the tag.
-                    try {
-                        tagRecords.add(newRecord);
-                    } catch (final ConditionsObjectException e) {
-                        throw new RuntimeException(e);
-                    }
-
-                    // Flag the record's ID as used so it is only added once.
-                    addedIds.add(record.getRowId());
-                }
-            }
-        }
-
-        // Print out all the records that were found.
-        LOGGER.info("found ConditionsRecords for tag " + newTag + " ...");
-        for (final ConditionsRecord record : tagRecords) {
-            LOGGER.info(record.toString());
-        }
-
-        // Prompt user to verify with console input.
-        boolean makeTag = true;
-        if (!dontPrompt) {
-            LOGGER.info("Create conditions tag " + newTag + " in database?  (Y/N)");
+        // Starting run number (required).
+        int runStart = -1;
+        if (commandLine.hasOption("s")) {
+            runStart = Integer.parseInt(commandLine.getOptionValue("s"));
+            LOGGER.config("run start set to " + runStart);
+        } else {
+            throw new RuntimeException("missing require -s argument with starting run number");
+        }
+
+        // Ending run number (max integer is default).
+        int runEnd = Integer.MAX_VALUE;
+        if (commandLine.hasOption("e")) {
+            runEnd = Integer.parseInt(commandLine.getOptionValue("e"));
+            LOGGER.config("run end set to " + runEnd);
+        }
+
+        // Run end must be greater than or equal to run start.
+        if (runEnd < runStart) {
+            throw new IllegalArgumentException("runEnd < runStart");
+        }
+
+        // Action for disambiguating overlapping collections (default is to use the most recent creation date).
+        MultipleCollectionsAction multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED;
+        if (commandLine.hasOption("m")) {
+            multipleCollectionsAction = MultipleCollectionsAction
+                    .valueOf(commandLine.getOptionValue("m").toUpperCase());
+        }
+        LOGGER.config("multiple collections action set tco " + multipleCollectionsAction);
+
+        // Whether to prompt before tagging (default is yes).
+        boolean promptBeforeTagging = true;
+        if (commandLine.hasOption("d")) {
+            promptBeforeTagging = false;
+        }
+        LOGGER.config("prompt before tagging: " + promptBeforeTagging);
+
+        // Conditions system configuration.
+        this.getManager().setXmlConfig("/org/hps/conditions/config/conditions_database_no_svt.xml");
+        this.getManager().setLogLevel(Level.ALL);
+
+        // Find all the applicable conditions records by their run number ranges.
+        ConditionsRecordCollection tagConditionsRecordCollection = this.findConditionsRecords(runStart, runEnd);
+
+        LOGGER.info("found " + tagConditionsRecordCollection.size() + " conditions records for the tag");
+
+        // Build the collection of tag records to insert into the database.
+        final ConditionsTagCollection conditionsTagCollection = this.createConditionsTagCollection(
+                tagConditionsRecordCollection, tagName);
+
+        LOGGER.info("created " + conditionsTagCollection.size() + " tag records ..." + '\n' + conditionsTagCollection);
+
+        LOGGER.getHandlers()[0].flush();
+
+        // Prompt user to verify tag creation.
+        boolean createTag = true;
+        if (promptBeforeTagging) {
+            System.out.println("Create conditions tag '" + tagName + "' in the database?  (Y/N)");
             final String line = System.console().readLine();
             if (!line.equals("Y")) {
-                makeTag = false;
-            }
-        }
-
-        // Create the tag in the database if user verified or force option was present.
-        if (makeTag) {
+                createTag = false;
+            }
+        }
+
+        // Create the tag.
+        if (createTag) {
             try {
-                tagRecords.setConnection(manager.getConnection());
-                tagRecords.setTableMetaData(TableRegistry.getTableRegistry().findByTableName("conditions"));
-                tagRecords.insert();
+                LOGGER.info("creating tag " + tagName + " in the database ...");
+                conditionsTagCollection.insert();
             } catch (DatabaseObjectException | SQLException e) {
                 throw new RuntimeException(e);
             }
-        }
+        } else {
+            LOGGER.warning("user aborted tag operation!");
+        }
+
+        LOGGER.info("done!");
+    }
+   
+    /**
+     * Find all the conditions records that are applicable for the given run range.
+     * <p>
+     * Overlapping run numbers in conditions with the same key are not disambiguated.
+     * This must be done in the user's job at runtime; usually the most recently created 
+     * conditions record will be used if multiple one's are applicable to the current run.
+     *
+     * @param runStart the start run
+     * @param runEnd the end run (must be greater than or equal to <code>runStart</code>)
+     * @return the conditions records that fall in the run range
+     */
+    private ConditionsRecordCollection findConditionsRecords(final int runStart, final int runEnd) {
+        if (runStart > runEnd) {
+            throw new IllegalArgumentException("runStart > runEnd");
+        }
+        if (runStart < 0) {
+            throw new IllegalArgumentException("invalid runStart: " + runStart);
+        }
+        if (runEnd < 0) {
+            throw new IllegalArgumentException("invalid runEnd: " + runEnd);
+        }
+        final Connection connection = this.getManager().getConnection();
+        final ConditionsRecordCollection conditionsRecordCollection = new ConditionsRecordCollection();
+        final TableMetaData tableMetaData = TableRegistry.getTableRegistry().findByTableName("conditions");
+        PreparedStatement statement = null;
+        try {
+            /*
+             * SQL statement handles 3 cases: 
+             * 1) condition's run_start in range 
+             * 2) condition's run_end in range 
+             * 3) condition's run_start and run_end enclose the range
+             */
+            statement = connection
+                    .prepareStatement("SELECT id FROM conditions WHERE (run_start >= ? and run_start <= ?) or (run_end >= ? and run_end <= ?)"
+                            + " or (run_start <= ? and run_end >= ?)");
+            statement.setInt(1, runStart);
+            statement.setInt(2, runEnd);
+            statement.setInt(3, runStart);
+            statement.setInt(4, runEnd);
+            statement.setInt(5, runStart);
+            statement.setInt(6, runEnd);
+
+            final ResultSet resultSet = statement.executeQuery();
+            while (resultSet.next()) {
+                final ConditionsRecord record = new ConditionsRecord();
+                record.setConnection(connection);
+                record.setTableMetaData(tableMetaData);
+                record.select(resultSet.getInt(1));
+                conditionsRecordCollection.add(record);
+            }
+        } catch (DatabaseObjectException | ConditionsObjectException | SQLException e) {
+            throw new RuntimeException(e);
+        } finally {
+            try {
+                if (statement != null) {
+                    statement.close();
+                }
+            } catch (final SQLException e) {
+                e.printStackTrace();
+            }
+        }
+        return conditionsRecordCollection;
     }
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java	Fri Sep  4 12:59:35 2015
@@ -12,6 +12,7 @@
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
@@ -21,10 +22,9 @@
 import org.hps.conditions.api.AbstractConditionsObjectConverter;
 import org.hps.conditions.api.ConditionsObject;
 import org.hps.conditions.api.ConditionsObjectCollection;
-import org.hps.conditions.api.ConditionsObjectException;
-import org.hps.conditions.api.ConditionsRecord;
 import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
 import org.hps.conditions.api.ConditionsSeries;
+import org.hps.conditions.api.ConditionsTag.ConditionsTagCollection;
 import org.hps.conditions.api.TableMetaData;
 import org.hps.conditions.api.TableRegistry;
 import org.hps.conditions.ecal.EcalConditions;
@@ -64,7 +64,12 @@
     /**
      * Name of system property that can be used to specify custom database connection parameters.
      */
-    private static final String CONNECTION_PROPERTY = "org.hps.conditions.connection.file";
+    private static final String CONNECTION_PROPERTY_FILE = "org.hps.conditions.connection.file";
+    
+    /**
+     * Connection property resource.
+     */
+    private static final String CONNECTION_PROPERTY_RESOURCE = "org.hps.conditions.connection.resource";
 
     /**
      * The default XML config.
@@ -255,22 +260,47 @@
     private final TableRegistry tableRegistry = TableRegistry.getTableRegistry();
 
     /**
-     * The currently active conditions tag.
-     */
-    private String tag = null;
-
+     * The currently active conditions tag (empty collection means no tag is active).
+     */
+    private ConditionsTagCollection conditionsTagCollection = new ConditionsTagCollection();
+    
+    /**
+     * The current set of conditions for the run.
+     */
+    private ConditionsRecordCollection conditionsRecordCollection = null;
+    
+    /**
+     * The currently applied conditions tags.
+     */
+    private Set<String> tags = new HashSet<String>();
+    
     /**
      * Class constructor. Calling this will automatically register this manager as the global default.
      */
     private DatabaseConditionsManager() {
+        
+        // Register detector conditions converter.
         this.registerConditionsConverter(new DetectorConditionsConverter());
-        this.setupConnectionFromSystemProperty();
+        
+        // Setup connection from system property pointing to a file, if it was set.
+        this.setupConnectionSystemPropertyFile();
+        
+        // Setup connection from system property pointing to a resource, if it was set.
+        this.setupConnectionSystemPropertyResource();
+        
+        // Register default conditions manager.
         ConditionsManager.setDefaultConditionsManager(this);
+        
+        // Set run to invalid number.
         this.setRun(-1);
+        
+        // Register conditions converters.
         for (final AbstractConditionsObjectConverter converter : this.converters.values()) {
             // logger.fine("registering converter for " + converter.getType());
             this.registerConditionsConverter(converter);
         }
+        
+        // Add the SVT detector setup object as a listener.
         this.addConditionsListener(this.svtSetup);
     }
 
@@ -378,27 +408,7 @@
      * @return the set of matching conditions records
      */
     public ConditionsRecordCollection findConditionsRecords(final String name) {
-        final ConditionsRecordCollection runConditionsRecords = this.getCachedConditions(
-                ConditionsRecordCollection.class, "conditions").getCachedData();
-        logger.fine("searching for conditions with name " + name + " in " + runConditionsRecords.size() + " records");
-        final ConditionsRecordCollection foundConditionsRecords = new ConditionsRecordCollection();
-        for (final ConditionsRecord record : runConditionsRecords) {
-            if (record.getName().equals(name)) {
-                if (this.matchesTag(record)) {
-                    try {
-                        foundConditionsRecords.add(record);
-                    } catch (final ConditionsObjectException e) {
-                        throw new RuntimeException(e);
-                    }
-                    logger.finer("found matching conditions record " + record.getRowId());
-                } else {
-                    logger.finer("conditions record " + record.getRowId() + " rejected from non-matching tag "
-                            + record.getTag());
-                }
-            }
-        }
-        logger.fine("found " + foundConditionsRecords.size() + " conditions records matching tag " + this.tag);
-        return foundConditionsRecords;
+        return getConditionsRecords().findByKey(name);
     }
 
     /**
@@ -479,31 +489,30 @@
         collection.setCollectionId(collectionId);
         return collectionId;
     }
-
-    /**
-     * Get a list of all the {@link ConditionsRecord} objects.
-     *
-     * @return the list of all the {@link ConditionsRecord} objects
-     */
-    // FIXME: This should use a cache that is created during initialization, rather than look these up every time.
+    
+    /**
+     * Get the list of conditions records for the run, filtered by the current set of active tags.
+     * 
+     * @return the list of conditions records for the run
+     */
     public ConditionsRecordCollection getConditionsRecords() {
-        logger.finer("getting conditions records ...");
-        final ConditionsRecordCollection conditionsRecords = new ConditionsRecordCollection();
-        for (final TableMetaData tableMetaData : this.tableRegistry.values()) {
-            try {
-                final ConditionsRecordCollection foundConditionsRecords = this.findConditionsRecords(tableMetaData
-                        .getKey());
-                logger.finer("found " + foundConditionsRecords.size() + " collections with name "
-                        + tableMetaData.getKey());
-                conditionsRecords.addAll(foundConditionsRecords);
-            } catch (final Exception e) {
-                e.printStackTrace();
-                logger.warning(e.getMessage());
-            }
-        }
-        logger.finer("found " + conditionsRecords + " conditions records");
-        logger.getHandlers()[0].flush();
-        return conditionsRecords;
+        if (this.run == -1 || this.detectorName == null) {
+            throw new IllegalStateException("Conditions system is not initialized.");
+        } 
+        // If the collection is null then the new conditions records need to be retrieved from the database.
+        if (this.conditionsRecordCollection == null) {
+            
+            // Get the collection of conditions that are applicable for the current run.
+            this.conditionsRecordCollection =  
+                    this.getCachedConditions(ConditionsRecordCollection.class, "conditions").getCachedData();
+            
+            // If there is one or more tags enabled then filter the collection by the tag names.
+            if (this.conditionsTagCollection.size() > 0) {
+                this.conditionsRecordCollection = 
+                        this.conditionsTagCollection.filter(this.conditionsRecordCollection);
+            }
+        }
+        return this.conditionsRecordCollection;
     }
 
     /**
@@ -671,11 +680,14 @@
 
         // Open the database connection.
         this.openConnection();
-
+        
+        // Reset the conditions records to trigger a re-caching.
+        this.conditionsRecordCollection = null;
+        
         // Call the super class's setDetector method to construct the detector object and activate conditions listeners.
         logger.fine("activating default conditions manager");
         super.setDetector(detectorName, runNumber);
-
+        
         // Should all conditions sets be cached?
         if (this.cacheAllConditions) {
             // Cache the conditions sets of all registered converters.
@@ -807,24 +819,11 @@
     }
 
     /**
-     * Return <code>true</code> if the conditions record matches the current tag
-     *
-     * @param record the conditions record
-     * @return <code>true</code> if conditions record matches the currently used tag
-     */
-    private boolean matchesTag(final ConditionsRecord record) {
-        if (this.tag == null) {
-            // If there is no tag set then all records pass.
-            return true;
-        }
-        final String recordTag = record.getTag();
-        if (recordTag == null) {
-            // If there is a tag set but the record has no tag, it is rejected.
-            return false;
-        }
-        return this.tag.equals(recordTag);
-    }
-
+     * Create a new collection with the given type.
+     * 
+     * @param collectionType the collection type
+     * @return the new collection
+     */
     public <CollectionType extends ConditionsObjectCollection<?>> CollectionType newCollection(
             final Class<CollectionType> collectionType) {
         final List<TableMetaData> tableMetaDataList = TableRegistry.getTableRegistry().findByCollectionType(
@@ -845,6 +844,13 @@
         return collection;
     }
 
+    /**
+     * Create a new collection with the given type and table name.
+     * 
+     * @param collectionType the collection type
+     * @param tableName the table name
+     * @return the new collection
+     */
     public <CollectionType extends ConditionsObjectCollection<?>> CollectionType newCollection(
             final Class<CollectionType> collectionType, final String tableName) {
         final TableMetaData tableMetaData = TableRegistry.getTableRegistry().findByTableName(tableName);
@@ -1040,31 +1046,69 @@
     }
 
     /**
-     * Set a tag used to filter the accessible conditions records
+     * Add a tag used to filter the accessible conditions records.
+     * <p>
+     * Multiple tags are OR'd together.
      *
      * @param tag the tag value used to filter returned conditions records
      */
-    public void setTag(final String tag) {
-        this.tag = tag;
-        logger.info("using conditions tag: " + tag);
+    public void addTag(final String tag) {
+        if (!this.tags.contains(tag)) {
+            logger.info("adding tag " + tag);
+            ConditionsTagCollection addConditionsTagCollection = this.getCachedConditions(ConditionsTagCollection.class, tag).getCachedData();
+            logger.info("adding conditions tag " + tag + " with " + conditionsTagCollection.size() + " records");
+            this.conditionsTagCollection.addAll(addConditionsTagCollection);                    
+        } else {
+            logger.warning("tag " + tag + " is already added");
+        }
+    }
+    
+    /**
+     * Add one or more tags for filtering records.
+     * 
+     * @param tags the <code>Set</code> of tags to add
+     */
+    public void addTags(final Set<String> tags) {
+        for (String tag : tags) {
+            this.addTag(tag);
+        }
+    }
+    
+    /**
+     * Clear the tags used to filter the {@link org.hps.conditons.api.ConditionsRecord}s.
+     */
+    public void clearTags() {
+        this.tags.clear();
+        this.conditionsTagCollection.clear();
     }
 
     /**
      * Setup the database connection from a file specified by a Java system property setting. This could be overridden
      * by subsequent API calls to {@link #setConnectionProperties(File)} or {@link #setConnectionResource(String)}.
      */
-    private void setupConnectionFromSystemProperty() {
-        final String systemPropertiesConnectionPath = (String) System.getProperties().get(CONNECTION_PROPERTY);
+    private void setupConnectionSystemPropertyFile() {
+        final String systemPropertiesConnectionPath = (String) System.getProperties().get(CONNECTION_PROPERTY_FILE);
         if (systemPropertiesConnectionPath != null) {
             final File f = new File(systemPropertiesConnectionPath);
             if (!f.exists()) {
-                throw new RuntimeException("Connection properties file from " + CONNECTION_PROPERTY
+                throw new RuntimeException("Connection properties file from " + CONNECTION_PROPERTY_FILE
                         + " does not exist.");
             }
             this.setConnectionProperties(f);
-            logger.info("connection setup from system property " + CONNECTION_PROPERTY + " = "
+            logger.info("connection setup from system property " + CONNECTION_PROPERTY_FILE + " = "
                     + systemPropertiesConnectionPath);
-        }
+        }                              
+    }
+    
+    /**
+     * Setup the database connection from a file specified by a Java system property setting. This could be overridden
+     * by subsequent API calls to {@link #setConnectionProperties(File)} or {@link #setConnectionResource(String)}.
+     */
+    private void setupConnectionSystemPropertyResource() {
+        final String systemPropertiesConnectionResource = (String) System.getProperties().get(CONNECTION_PROPERTY_RESOURCE);
+        if (systemPropertiesConnectionResource != null) {
+            this.setConnectionResource(systemPropertiesConnectionResource);
+        } 
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/run/RunSpreadsheet.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/run/RunSpreadsheet.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/run/RunSpreadsheet.java	Fri Sep  4 12:59:35 2015
@@ -7,11 +7,9 @@
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Locale;
 import java.util.TimeZone;
 
 import org.apache.commons.csv.CSVFormat;

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/EngRunConditionsTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/EngRunConditionsTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/EngRunConditionsTest.java	Fri Sep  4 12:59:35 2015
@@ -220,7 +220,7 @@
 
         final DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance();
         DatabaseConditionsManager.getLogger().setLevel(Level.ALL);
-        manager.setTag("pass0");
+        manager.addTag("pass0");
         manager.setXmlConfig("/org/hps/conditions/config/conditions_database_engrun.xml");
 
         final FileCache cache = new FileCache();

Copied: java/trunk/conditions/src/test/java/org/hps/conditions/api/ConditionsTagTest.java (from r3393, java/branches/conditions-HPSJAVA-517/src/test/java/org/hps/conditions/api/ConditionsTagTest.java)
 =============================================================================
--- java/branches/conditions-HPSJAVA-517/src/test/java/org/hps/conditions/api/ConditionsTagTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/api/ConditionsTagTest.java	Fri Sep  4 12:59:35 2015
@@ -73,14 +73,15 @@
         for (int run : RUNS) {
             MANAGER.setDetector("HPS-conditions-test", run);
             ConditionsRecordCollection conditionsRecordCollection = MANAGER.getConditionsRecords();
-            System.out.println("run " + run + " has " + conditionsRecordCollection.size());
+            System.out.println("run " + run + " has " + conditionsRecordCollection.size() + " conditions records");
             System.out.println(conditionsRecordCollection);
             for (int i = 0; i < CONDITIONS.length; i++) {
                 try {
                     BaseConditionsObjectCollection<?> conditionsObjectCollection = 
                             BaseConditionsObjectCollection.class.cast(
                                     MANAGER.getCachedConditions(TYPES[i], CONDITIONS[i]).getCachedData());
-                System.out.println("got collection " + conditionsObjectCollection.getTableMetaData().getTableName() 
+                System.out.println("got collection " + conditionsObjectCollection.getTableMetaData().getTableName() + ":" 
+                        + conditionsObjectCollection.getCollectionId()
                         + " with type " + conditionsObjectCollection.getTableMetaData().getCollectionClass().getName() 
                         + " and " + conditionsObjectCollection.size() + " objects");
                 } catch (Exception e) {

Modified: java/trunk/evio/src/main/java/org/hps/evio/EvioToLcio.java
 =============================================================================
--- java/trunk/evio/src/main/java/org/hps/evio/EvioToLcio.java	(original)
+++ java/trunk/evio/src/main/java/org/hps/evio/EvioToLcio.java	Fri Sep  4 12:59:35 2015
@@ -404,10 +404,13 @@
             LOGGER.config("User set run number to " + runNumber + " with command option.");
         }
 
-        // Set the conditions system tag.
+        // Add conditions system tag filters.
         if (cl.hasOption("t")) {
-            final String tag = cl.getOptionValue("t");
-            DatabaseConditionsManager.getInstance().setTag(tag);
+            final String[] tags = cl.getOptionValues("t");
+            for (String tag : tags) {
+                LOGGER.config("adding conditions tag " + tag);
+                DatabaseConditionsManager.getInstance().addTag(tag);
+            }
         }
 
         // Is there a run number from the command line options?

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

November 2017
August 2017
July 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use