def test_1(self):
        self.maxDiff = None
        data_path = os.path.dirname(os.path.realpath(__file__))
        votable_path = os.path.join(data_path, "./data/test_globals.xml")
        json_ref_path = os.path.join(data_path, "./data/test_globals_1.json")
        table_mapper = TableMapper("Results"
                             , votable_path
                             , json_inst_dict=DictUtils.read_dict_from_file(json_ref_path))
        table_mapper.resolve_refs_and_values(resolve_refs=True)

        #print(DictUtils.get_pretty_json(table_mapper.json["MODEL_INSTANCE"]["TABLE_MAPPING"]["my:other.role"]))
        self.assertDictEqual(table_mapper.json["MODEL_INSTANCE"]["TABLE_MAPPING"]["Results"]["my:other.role"]
                             ,{
                              "@ID": "TestParamRef",
                              "@dmtype": "Whatever",
                              "coords:whatever": {
                                "@dmtype": "coords:StdRefLocation",
                                "coords:StdRefLocation.position": {
                                  "@dmtype": "ivoa:string",
                                  "@ref": "param_ref",
                                  "@value": "param_value"
                                }
                              }
                            } 
                             , "")
Ejemplo n.º 2
0
    def build_table_mapper_map(self):
        logger.info("Looking for tables matching TABLE_MAPPING ")
        votable = parse(self.votable_path)
        for template_key in self.json_view["MODEL_INSTANCE"][
                "TABLE_MAPPING"].keys():
            logger.info("Looking for a table matching TABLE_MAPPING %s",
                        template_key)

            name = None
            parsed_table = None
            for table in votable.iter_tables():
                if template_key == table.ID:
                    logger.info("Table with ID = %s found", template_key)
                    name = table.ID
                    parsed_table = table
                    break
            if name == None:
                for table in votable.iter_tables():
                    if template_key == table.name:
                        logger.info("Table with name = %s found", template_key)
                        name = table.name
                        parsed_table = table
                        break
            if name == None:
                raise Exception("Cannot find table with name or ID = " + name)
            else:
                logger.info("Add TableMapper for table %s", name)
                self.table_mappers[template_key] = TableMapper(
                    template_key,
                    self.votable_path,
                    parsed_table=parsed_table,
                    json_inst_dict=self.json_view)
 def connect_votable(self, parsed_table):
     from client.inst_builder.table_mapper import TableMapper
     self.parsed_table = parsed_table
     ack = None
     acv = None
     for k in self.json_join_content.keys():
         if k.startswith("@") is False:
             ack = k
             acv = self.json_join_content[k]
             break
     logger.info("Build table_mapper for data joint with table %s", self.foreign_table)
     self.table_mapper = TableMapper(
         self.foreign_table,
         None,
         parsed_table=self.parsed_table,
         json_inst_dict={
             "MODEL_INSTANCE": {
                 "MODELS":{},
                 "GLOBALS":{},
                 "TABLE_MAPPING": {
                     self.foreign_table: {
                         "@tableref": self.foreign_table,
                         "root": [
                                 {
                                 "TABLE_ROW_TEMPLATE": {
                                     "FILTER": {
                                         "@ref": self.foreign_key,
                                         "@value": -1
                                         },
                                     ack: acv
                                     },
                                 }
                             ]
                         }
                     }
                 }
             }
         )
     self.table_mapper.resolve_refs_and_values(resolve_refs=False)
     self.table_mapper.map_columns()
     for _, table_iterator in self.table_mapper.table_iterators.items():
         self.row_filter = table_iterator.row_filter
         break;
Ejemplo n.º 4
0
    def setUp(self):
        self.data_path = os.path.dirname(os.path.realpath(__file__))
        self.votable_path = os.path.join(self.data_path,
                                         "./data/test_inst_fullfeature.xml")
        self.json_ref_path = ""

        self.instanceFromVotable = InstanceFromVotable(self.votable_path)

        self.instanceFromVotable._extract_vodml_block()
        self.instanceFromVotable._validate_vodml_block()

        self.builder = JsonMappingBuilder(
            json_dict=self.instanceFromVotable.json_block)
        #builder.revert_array()

        self.builder.revert_compositions("COLLECTION")
        self.builder.revert_templates()
        self.builder.revert_elements("INSTANCE")
        self.builder.revert_elements("ATTRIBUTE")
        #print(DictUtils.get_pretty_json(builder.json))

        self.table_mapper = TableMapper("Results",
                                        self.votable_path,
                                        json_inst_dict=self.builder.json)
Ejemplo n.º 5
0
    def test_1(self):
        self.maxDiff = None
        data_path = os.path.dirname(os.path.realpath(__file__))
        votable_path = os.path.join(data_path, "./data/test_array.xml")
        json_ref_path = os.path.join(data_path, "./data/test_array_1.json")
        table_mapper = TableMapper("Results"
                             , votable_path
                             , json_inst_dict=DictUtils.read_dict_from_file(json_ref_path))
        table_mapper.resolve_refs_and_values()

        self.assertListEqual([*table_mapper.table_iterators], ['meas:Error.statError'], "")
        self.assertDictEqual(table_mapper.table_iterators['meas:Error.statError'].column_mapping.column_refs
                             , {'_poserr_148': {'parent_role': 'meas:Symmetrical.radius', 'role': 'ivoa:RealQuantity.value', 'index': None, 'field': None}}
                             , "")
        
        table_mapper.map_columns()
        self.assertDictEqual(table_mapper.table_iterators['meas:Error.statError'].column_mapping.column_ids
                             , {0: {'name': 'oidsaada', 'ref': None, 'id': '_poserr_148'}}
                             , "")

        self.assertListEqual(table_mapper.get_flatten_data_head()
                         ,['meas:Symmetrical.radius(ivoa:RealQuantity.value) [col#0 _poserr_148]'],""),
        cpt=1
        while True:
            inst = table_mapper._get_next_flatten_row()
            if inst != None:
                self.assertListEqual(inst, [cpt], "")
                cpt += 1
            else:
                break
        table_mapper.rewind()
        cpt=1
        while True:
            inst = table_mapper._get_next_row_instance()
            if inst != None:
                self.assertDictEqual(inst
                                     , {
                                      "@dmtype": "meas:Symmetrical",
                                      "meas:Symmetrical.radius": {
                                        "@dmtype": "ivoa:RealQuantity",
                                        "ivoa:Quantity.unit": {
                                          "@dmtype": "ivoa:Unit",
                                          "@value": "arcsec"
                                        },
                                        "ivoa:RealQuantity.value": {
                                          "@dmtype": "ivoa:real",
                                          "@ref": "_poserr_148",
                                          "@value": cpt
                                        }
                                      }
                                    }
                                     , "")
                cpt+=1
            else:
                break
class JoinIterator(object):
    '''
    classdocs
    '''
    def __init__(self, 
                 foreign_table,
                 primary_key, 
                 foreign_key,
                 json_join_content):
        self.foreign_table = foreign_table
        self.primary_key = primary_key
        self.foreign_key = foreign_key
        self.json_join_content = json_join_content
        self.table_mapper = None
        self.parsed_table = None
        self.row_filter = None
        #print(DictUtils.get_pretty_json(self.json_join_content))
        
    def __repr__(self):
        return "Join iterator f_table={} p_key={}, f_key={}".format(
            self.foreign_table, self.primary_key, self.foreign_key)
        
    def connect_votable(self, parsed_table):
        from client.inst_builder.table_mapper import TableMapper
        self.parsed_table = parsed_table
        ack = None
        acv = None
        for k in self.json_join_content.keys():
            if k.startswith("@") is False:
                ack = k
                acv = self.json_join_content[k]
                break
        logger.info("Build table_mapper for data joint with table %s", self.foreign_table)
        self.table_mapper = TableMapper(
            self.foreign_table,
            None,
            parsed_table=self.parsed_table,
            json_inst_dict={
                "MODEL_INSTANCE": {
                    "MODELS":{},
                    "GLOBALS":{},
                    "TABLE_MAPPING": {
                        self.foreign_table: {
                            "@tableref": self.foreign_table,
                            "root": [
                                    {
                                    "TABLE_ROW_TEMPLATE": {
                                        "FILTER": {
                                            "@ref": self.foreign_key,
                                            "@value": -1
                                            },
                                        ack: acv
                                        },
                                    }
                                ]
                            }
                        }
                    }
                }
            )
        self.table_mapper.resolve_refs_and_values(resolve_refs=False)
        self.table_mapper.map_columns()
        for _, table_iterator in self.table_mapper.table_iterators.items():
            self.row_filter = table_iterator.row_filter
            break;

    def set_foreignkey_value(self, value):   
        self.row_filter.value = value
        self.table_mapper.rewind()
        
    def get_subset_instance(self, key_value):
        self.row_filter = RowFilter({
                "@ref": self.foreign_key,
                "@value": key_value
                })
        self.table_iterator = TableIterator(
                                "join",
                                self.table_votable, 
                                self.json_join_content,
                                self.column_mapping,
                                self.row_filter
                                )