async def test_resolved_attribute_limit(self): expected_log_codes = { CdmLogCode.ERR_REL_MAX_RESOLVED_ATTR_REACHED } corpus = TestHelper.get_local_corpus(self.tests_sub_path, 'test_resolved_attribute_limit', expected_codes=expected_log_codes) # type: CdmCorpusDefinition main_entity = await corpus.fetch_object_async('local:/mainEntity.cdm.json/mainEntity') # type: CdmEntityDefinition res_opt = ResolveOptions(wrt_doc=main_entity.in_document) # if attribute limit is reached, entity should be None res_opt._resolved_attribute_limit = 4 resEnt = await main_entity.create_resolved_entity_async('{}_zeroAtts'.format(main_entity.entity_name), res_opt) # type: CdmEntityDefinition self.assertIsNone(resEnt) # when the attribute limit is set to null, there should not be a limit on the possible number of attributes res_opt._resolved_attribute_limit = None ras = main_entity._fetch_resolved_attributes(res_opt) # type: ResolvedAttributeSet resEnt = await main_entity.create_resolved_entity_async('{}_normalized_referenceOnly'.format(main_entity.entity_name), res_opt) # there are 5 total attributes self.assertEqual(5, ras._resolved_attribute_count) self.assertEqual(5, len(ras._set)) self.assertEqual(3, len(main_entity.attributes)) # there are 2 attributes grouped in an entity attribute # and 2 attributes grouped in an attribute group self.assertEqual(2, len(main_entity.attributes[2].explicit_reference.members)) # using the default limit number res_opt = ResolveOptions(wrt_doc=main_entity.in_document) ras = main_entity._fetch_resolved_attributes(res_opt) resEnt = await main_entity.create_resolved_entity_async('{}_normalized_referenceOnly'.format(main_entity.entity_name), res_opt) # there are 5 total attributes self.assertEqual(5, ras._resolved_attribute_count) self.assertEqual(5, len(ras._set)) self.assertEqual(3, len(main_entity.attributes)) # there are 2 attributes grouped in an entity attribute # and 2 attributes grouped in an attribute group self.assertEqual(2, len(main_entity.attributes[2].explicit_reference.members)) res_opt.directives = AttributeResolutionDirectiveSet({'normalized', 'structured'}) ras = main_entity._fetch_resolved_attributes(res_opt) resEnt = await main_entity.create_resolved_entity_async('{}_normalized_structured'.format(main_entity.entity_name), res_opt) # there are 5 total attributes self.assertEqual(5, ras._resolved_attribute_count) # the attribute count is different because one attribute is a group that contains two different attributes self.assertEqual(4, len(ras._set)) self.assertEqual(3, len(main_entity.attributes)) # again there are 2 attributes grouped in an entity attribute # and 2 attributes grouped in an attribute group self.assertEqual(2, len(main_entity.attributes[2].explicit_reference.members))
def _copy_resolve_options(res_opt: 'ResolveOptions') -> 'ResolveOptions': from cdm.utilities import ResolveOptions # pylint: disable=redefined-outer-name res_opt_copy = ResolveOptions() res_opt_copy.wrt_doc = res_opt.wrt_doc res_opt_copy._relationship_depth = res_opt._relationship_depth res_opt_copy._localize_references_for = res_opt._localize_references_for res_opt_copy._indexing_doc = res_opt._indexing_doc res_opt_copy.shallow_validation = res_opt.shallow_validation res_opt_copy._resolved_attribute_limit = res_opt._resolved_attribute_limit if res_opt.directives: res_opt_copy.directives = res_opt.directives.copy() return res_opt_copy