Beispiel #1
0
 def testDelItem(self):
     nkd = NamedKeyDict(self.dictionary)
     del nkd[self.a]
     self.assertNotIn("a", nkd)
     del nkd["b"]
     self.assertNotIn(self.b, nkd)
     self.assertEqual(len(nkd), 0)
Beispiel #2
0
 def testSchemaGeneration(self):
     tableSpecs = NamedKeyDict({})
     for element in self.universe.getStaticElements():
         if element.hasTable and element.viewOf is None:
             tableSpecs[element] = element.RecordClass.fields.makeTableSpec(
                 RegionReprClass=SpatialRegionDatabaseRepresentation,
                 TimespanReprClass=TimespanDatabaseRepresentation.Compound
             )
     for element, tableSpec in tableSpecs.items():
         for dep in element.required:
             with self.subTest(element=element.name, dep=dep.name):
                 if dep != element:
                     self.assertIn(dep.name, tableSpec.fields)
                     self.assertEqual(tableSpec.fields[dep.name].dtype, dep.primaryKey.dtype)
                     self.assertEqual(tableSpec.fields[dep.name].length, dep.primaryKey.length)
                     self.assertEqual(tableSpec.fields[dep.name].nbytes, dep.primaryKey.nbytes)
                     self.assertFalse(tableSpec.fields[dep.name].nullable)
                     self.assertTrue(tableSpec.fields[dep.name].primaryKey)
                 else:
                     self.assertIn(element.primaryKey.name, tableSpec.fields)
                     self.assertEqual(tableSpec.fields[element.primaryKey.name].dtype,
                                      dep.primaryKey.dtype)
                     self.assertEqual(tableSpec.fields[element.primaryKey.name].length,
                                      dep.primaryKey.length)
                     self.assertEqual(tableSpec.fields[element.primaryKey.name].nbytes,
                                      dep.primaryKey.nbytes)
                     self.assertFalse(tableSpec.fields[element.primaryKey.name].nullable)
                     self.assertTrue(tableSpec.fields[element.primaryKey.name].primaryKey)
         for dep in element.implied:
             with self.subTest(element=element.name, dep=dep.name):
                 self.assertIn(dep.name, tableSpec.fields)
                 self.assertEqual(tableSpec.fields[dep.name].dtype, dep.primaryKey.dtype)
                 self.assertFalse(tableSpec.fields[dep.name].primaryKey)
         for foreignKey in tableSpec.foreignKeys:
             self.assertIn(foreignKey.table, tableSpecs)
             self.assertIn(foreignKey.table, element.graph.dimensions.names)
             self.assertEqual(len(foreignKey.source), len(foreignKey.target))
             for source, target in zip(foreignKey.source, foreignKey.target):
                 self.assertIn(source, tableSpec.fields.names)
                 self.assertIn(target, tableSpecs[foreignKey.table].fields.names)
                 self.assertEqual(tableSpec.fields[source].dtype,
                                  tableSpecs[foreignKey.table].fields[target].dtype)
                 self.assertEqual(tableSpec.fields[source].length,
                                  tableSpecs[foreignKey.table].fields[target].length)
                 self.assertEqual(tableSpec.fields[source].nbytes,
                                  tableSpecs[foreignKey.table].fields[target].nbytes)
Beispiel #3
0
 def testGetItem(self):
     nkd = NamedKeyDict(self.dictionary)
     self.assertEqual(nkd["a"], 10)
     self.assertEqual(nkd[self.a], 10)
     self.assertEqual(nkd["b"], 20)
     self.assertEqual(nkd[self.b], 20)
     self.assertIn("a", nkd)
     self.assertIn(self.b, nkd)
Beispiel #4
0
 def testSetItem(self):
     nkd = NamedKeyDict(self.dictionary)
     nkd[self.a] = 30
     self.assertEqual(nkd["a"], 30)
     nkd["b"] = 40
     self.assertEqual(nkd[self.b], 40)
     with self.assertRaises(KeyError):
         nkd["c"] = 50
     with self.assertRaises(AssertionError):
         nkd[self.TestTuple("a", 3)] = 60
Beispiel #5
0
    def unpackMultiRefs(self) -> NamedKeyDict[DatasetType, DatasetRef]:
        """Unpack nested multi-element `DatasetRef` dicts into a new
        mapping with `DatasetType` keys and `set` of `DatasetRef` values.

        Returns
        -------
        dictionary : `NamedKeyDict`
            Dictionary mapping `DatasetType` to `DatasetRef`, with both
            `DatasetType` instances and string names usable as keys.
        """
        return NamedKeyDict({
            datasetType: list(refs.values())
            for datasetType, refs in self.items()
        })
Beispiel #6
0
 def testConstructor(self):
     """Test of constructor.
     """
     # Quantum specific arguments
     run = None  # TODO add Run
     taskName = "some.task.object"  # can't use a real PipelineTask due to inverted package dependency
     # Base class arguments
     startTime = astropy.time.Time("2018-01-01", format="iso", scale="utc")
     endTime = astropy.time.Time("2018-01-02", format="iso", scale="utc")
     host = "localhost"
     quantum = Quantum(taskName=taskName,
                       run=run,
                       startTime=startTime,
                       endTime=endTime,
                       host=host)
     self.assertEqual(quantum.taskName, taskName)
     self.assertEqual(quantum.run, run)
     self.assertEqual(quantum.predictedInputs, NamedKeyDict())
     self.assertEqual(quantum.actualInputs, NamedKeyDict())
     self.assertIsNone(quantum.dataId)
     self.assertIsNone(quantum.id)
     self.assertEqual(quantum.startTime, startTime)
     self.assertEqual(quantum.endTime, endTime)
     self.assertEqual(quantum.host, host)
Beispiel #7
0
    def initialize(
        cls,
        db: Database,
        context: StaticTablesContext,
        *,
        collections: CollectionManager,
        dimensions: DimensionRecordStorageManager,
    ) -> CollectionSummaryManager:
        """Create all summary tables (or check that they have been created),
        returning an object to manage them.

        Parameters
        ----------
        db : `Database`
            Interface to the underlying database engine and namespace.
        context : `StaticTablesContext`
            Context object obtained from `Database.declareStaticTables`; used
            to declare any tables that should always be present.
        collections: `CollectionManager`
            Manager object for the collections in this `Registry`.
        dimensions : `DimensionRecordStorageManager`
            Manager object for the dimensions in this `Registry`.

        Returns
        -------
        manager : `CollectionSummaryManager`
            New manager object for collection summaries.
        """
        specs = CollectionSummaryTables.makeTableSpecs(collections, dimensions)
        tables = CollectionSummaryTables(
            datasetType=context.addTable("collection_summary_dataset_type",
                                         specs.datasetType),
            dimensions=NamedKeyDict({
                dimension:
                context.addTable(f"collection_summary_{dimension.name}", spec)
                for dimension, spec in specs.dimensions.items()
            }).freeze(),
        )
        return cls(
            db=db,
            collections=collections,
            dimensions=dimensions,
            tables=tables,
        )
Beispiel #8
0
    def unpackSingleRefs(self) -> NamedKeyDict[DatasetType, DatasetRef]:
        """Unpack nested single-element `DatasetRef` dicts into a new
        mapping with `DatasetType` keys and `DatasetRef` values.

        This method assumes that each nest contains exactly one item, as is the
        case for all "init" datasets.

        Returns
        -------
        dictionary : `NamedKeyDict`
            Dictionary mapping `DatasetType` to `DatasetRef`, with both
            `DatasetType` instances and string names usable as keys.
        """
        def getOne(refs: Dict[DataCoordinate, DatasetRef]) -> DatasetRef:
            ref, = refs.values()
            return ref

        return NamedKeyDict(
            {datasetType: getOne(refs)
             for datasetType, refs in self.items()})
Beispiel #9
0
    def testConstructor(self):
        """Test of constructor.
        """
        # Quantum specific arguments
        taskName = "some.task.object"  # can't use a real PipelineTask due to inverted package dependency

        quantum = Quantum(taskName=taskName)
        self.assertEqual(quantum.taskName, taskName)
        self.assertEqual(quantum.initInputs, {})
        self.assertEqual(quantum.inputs, NamedKeyDict())
        self.assertEqual(quantum.outputs, {})
        self.assertIsNone(quantum.dataId)

        universe = DimensionUniverse()
        instrument = "DummyCam"
        datasetTypeName = "test_ds"
        storageClass = StorageClass("testref_StructuredData")
        datasetType = DatasetType(datasetTypeName,
                                  universe.extract(("instrument", "visit")),
                                  storageClass)
        predictedInputs = {
            datasetType: [
                DatasetRef(datasetType, dict(instrument=instrument, visit=42)),
                DatasetRef(datasetType, dict(instrument=instrument, visit=43))
            ]
        }
        outputs = {
            datasetType: [
                DatasetRef(datasetType, dict(instrument=instrument, visit=42)),
                DatasetRef(datasetType, dict(instrument=instrument, visit=43))
            ]
        }

        quantum = Quantum(taskName=taskName,
                          inputs=predictedInputs,
                          outputs=outputs)
        self.assertEqual(len(quantum.inputs[datasetType]), 2)
        self.assertEqual(len(quantum.outputs[datasetType]), 2)
Beispiel #10
0
 def testEquality(self):
     nkd = NamedKeyDict(self.dictionary)
     self.assertEqual(nkd, self.dictionary)
     self.assertEqual(self.dictionary, nkd)
Beispiel #11
0
 def testIter(self):
     self.assertEqual(set(iter(NamedKeyDict(self.dictionary))),
                      set(self.dictionary))
Beispiel #12
0
 def testNoNameConstruction(self):
     self.dictionary["a"] = 30
     with self.assertRaises(AttributeError):
         NamedKeyDict(self.dictionary)
     with self.assertRaises(AttributeError):
         NamedKeyDict(iter(self.dictionary.items()))
Beispiel #13
0
 def testDuplicateNameConstruction(self):
     self.dictionary[self.TestTuple(name="a", id=3)] = 30
     with self.assertRaises(AssertionError):
         NamedKeyDict(self.dictionary)
     with self.assertRaises(AssertionError):
         NamedKeyDict(iter(self.dictionary.items()))
Beispiel #14
0
 def testConstruction(self):
     self.check(NamedKeyDict(self.dictionary))
     self.check(NamedKeyDict(iter(self.dictionary.items())))
Beispiel #15
0
 def testSchemaGeneration(self):
     tableSpecs = NamedKeyDict({})
     for element in self.universe.elements:
         if element.hasTable and element.viewOf is None:
             tableSpecs[element] = makeDimensionElementTableSpec(element)
     for element, tableSpec in tableSpecs.items():
         for dep in element.required:
             with self.subTest(element=element.name, dep=dep.name):
                 if dep != element:
                     self.assertIn(dep.name, tableSpec.fields)
                     self.assertEqual(tableSpec.fields[dep.name].dtype,
                                      dep.primaryKey.dtype)
                     self.assertEqual(tableSpec.fields[dep.name].length,
                                      dep.primaryKey.length)
                     self.assertEqual(tableSpec.fields[dep.name].nbytes,
                                      dep.primaryKey.nbytes)
                     self.assertFalse(tableSpec.fields[dep.name].nullable)
                     self.assertTrue(tableSpec.fields[dep.name].primaryKey)
                 else:
                     self.assertIn(element.primaryKey.name,
                                   tableSpec.fields)
                     self.assertEqual(
                         tableSpec.fields[element.primaryKey.name].dtype,
                         dep.primaryKey.dtype)
                     self.assertEqual(
                         tableSpec.fields[element.primaryKey.name].length,
                         dep.primaryKey.length)
                     self.assertEqual(
                         tableSpec.fields[element.primaryKey.name].nbytes,
                         dep.primaryKey.nbytes)
                     self.assertFalse(
                         tableSpec.fields[element.primaryKey.name].nullable)
                     self.assertTrue(tableSpec.fields[
                         element.primaryKey.name].primaryKey)
         for dep in element.implied:
             with self.subTest(element=element.name, dep=dep.name):
                 self.assertIn(dep.name, tableSpec.fields)
                 self.assertEqual(tableSpec.fields[dep.name].dtype,
                                  dep.primaryKey.dtype)
                 self.assertFalse(tableSpec.fields[dep.name].primaryKey)
         for foreignKey in tableSpec.foreignKeys:
             self.assertIn(foreignKey.table, tableSpecs)
             self.assertIn(foreignKey.table, element.graph.dimensions.names)
             self.assertEqual(len(foreignKey.source),
                              len(foreignKey.target))
             for source, target in zip(foreignKey.source,
                                       foreignKey.target):
                 self.assertIn(source, tableSpec.fields.names)
                 self.assertIn(target,
                               tableSpecs[foreignKey.table].fields.names)
                 self.assertEqual(
                     tableSpec.fields[source].dtype,
                     tableSpecs[foreignKey.table].fields[target].dtype)
                 self.assertEqual(
                     tableSpec.fields[source].length,
                     tableSpecs[foreignKey.table].fields[target].length)
                 self.assertEqual(
                     tableSpec.fields[source].nbytes,
                     tableSpecs[foreignKey.table].fields[target].nbytes)
         self.assertEqual(tuple(tableSpec.fields.names),
                          element.RecordClass.__slots__)