|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211 |
- import unittest
-
- import jsonschema
- import numpy
-
- from d3m import container, utils
- from d3m.metadata import base
-
-
- def copy_elements_metadata(source_metadata, target_metadata, from_selector, to_selector=(), *, ignore_all_elements=False):
- return source_metadata._copy_elements_metadata(target_metadata, list(from_selector), list(to_selector), [], ignore_all_elements)
-
-
- class TestMetadata(unittest.TestCase):
- def test_basic(self):
- md1 = base.Metadata({'value': 'test'})
-
- self.assertEqual(md1.query(()), {'value': 'test'})
- self.assertEqual(md1.query(('foo',)), {})
- self.assertEqual(md1.query(('bar',)), {})
-
- md2 = md1.update((), {'value2': 'test2'})
-
- self.assertEqual(md1.query(()), {'value': 'test'})
- self.assertEqual(md1.query(('foo',)), {})
- self.assertEqual(md1.query(('bar',)), {})
- self.assertEqual(md2.query(()), {'value': 'test', 'value2': 'test2'})
-
- md3 = md2.update(('foo',), {'element': 'one'})
-
- self.assertEqual(md1.query(()), {'value': 'test'})
- self.assertEqual(md1.query(('foo',)), {})
- self.assertEqual(md1.query(('bar',)), {})
- self.assertEqual(md2.query(()), {'value': 'test', 'value2': 'test2'})
- self.assertEqual(md3.query(()), {'value': 'test', 'value2': 'test2'})
- self.assertEqual(md3.query(('foo',)), {'element': 'one'})
-
- md4 = md3.update((base.ALL_ELEMENTS,), {'element': 'two'})
-
- self.assertEqual(md1.query(()), {'value': 'test'})
- self.assertEqual(md1.query(('foo',)), {})
- self.assertEqual(md1.query(('bar',)), {})
- self.assertEqual(md2.query(()), {'value': 'test', 'value2': 'test2'})
- self.assertEqual(md3.query(()), {'value': 'test', 'value2': 'test2'})
- self.assertEqual(md3.query(('foo',)), {'element': 'one'})
- self.assertEqual(md4.query(()), {'value': 'test', 'value2': 'test2'})
- self.assertEqual(md4.query((base.ALL_ELEMENTS,)), {'element': 'two'})
- self.assertEqual(md4.query(('foo',)), {'element': 'two'})
-
- md5 = md4.update(('foo',), {'element': 'three'})
-
- self.assertEqual(md1.query(()), {'value': 'test'})
- self.assertEqual(md1.query(('foo',)), {})
- self.assertEqual(md1.query(('bar',)), {})
- self.assertEqual(md2.query(()), {'value': 'test', 'value2': 'test2'})
- self.assertEqual(md3.query(()), {'value': 'test', 'value2': 'test2'})
- self.assertEqual(md3.query(('foo',)), {'element': 'one'})
- self.assertEqual(md4.query(()), {'value': 'test', 'value2': 'test2'})
- self.assertEqual(md4.query((base.ALL_ELEMENTS,)), {'element': 'two'})
- self.assertEqual(md4.query(('foo',)), {'element': 'two'})
- self.assertEqual(md5.query(()), {'value': 'test', 'value2': 'test2'})
- self.assertEqual(md5.query((base.ALL_ELEMENTS,)), {'element': 'two'})
- self.assertEqual(md5.query(('foo',)), {'element': 'three'})
-
- def test_all_elements(self):
- md1 = base.Metadata()
-
- md2 = md1.update((base.ALL_ELEMENTS, 'bar'), {'value': 'test1'})
-
- self.assertEqual(md2.query(('foo', 'bar')), {'value': 'test1'})
-
- md3 = md2.update(('foo', 'bar'), {'value': 'test2'})
-
- self.assertEqual(md2.query(('foo', 'bar')), {'value': 'test1'})
- self.assertEqual(md3.query(('foo', 'bar')), {'value': 'test2'})
-
- md4 = md3.update((base.ALL_ELEMENTS, 'bar'), {'value': 'test3'})
-
- self.assertEqual(md2.query(('foo', 'bar')), {'value': 'test1'})
- self.assertEqual(md3.query(('foo', 'bar')), {'value': 'test2'})
- self.assertEqual(md4.query(('foo', 'bar')), {'value': 'test3'})
-
- md5 = md4.update(('foo', base.ALL_ELEMENTS), {'value': 'test4'})
-
- self.assertEqual(md2.query(('foo', 'bar')), {'value': 'test1'})
- self.assertEqual(md3.query(('foo', 'bar')), {'value': 'test2'})
- self.assertEqual(md4.query(('foo', 'bar')), {'value': 'test3'})
- self.assertEqual(md5.query(('foo', 'bar')), {'value': 'test4'})
-
- md6 = md5.update(('foo', 'bar'), {'value': 'test5'})
-
- self.assertEqual(md2.query(('foo', 'bar')), {'value': 'test1'})
- self.assertEqual(md3.query(('foo', 'bar')), {'value': 'test2'})
- self.assertEqual(md4.query(('foo', 'bar')), {'value': 'test3'})
- self.assertEqual(md5.query(('foo', 'bar')), {'value': 'test4'})
- self.assertEqual(md6.query(('foo', 'bar')), {'value': 'test5'})
-
- md7 = md6.update((base.ALL_ELEMENTS, base.ALL_ELEMENTS), {'value': 'test6'})
-
- self.assertEqual(md2.query(('foo', 'bar')), {'value': 'test1'})
- self.assertEqual(md3.query(('foo', 'bar')), {'value': 'test2'})
- self.assertEqual(md4.query(('foo', 'bar')), {'value': 'test3'})
- self.assertEqual(md5.query(('foo', 'bar')), {'value': 'test4'})
- self.assertEqual(md6.query(('foo', 'bar')), {'value': 'test5'})
- self.assertEqual(md7.query(('foo', 'bar')), {'value': 'test6'})
-
- md8 = md7.update(('foo', 'bar'), {'value': 'test7'})
-
- self.assertEqual(md2.query(('foo', 'bar')), {'value': 'test1'})
- self.assertEqual(md3.query(('foo', 'bar')), {'value': 'test2'})
- self.assertEqual(md4.query(('foo', 'bar')), {'value': 'test3'})
- self.assertEqual(md5.query(('foo', 'bar')), {'value': 'test4'})
- self.assertEqual(md6.query(('foo', 'bar')), {'value': 'test5'})
- self.assertEqual(md7.query(('foo', 'bar')), {'value': 'test6'})
- self.assertEqual(md8.query(('foo', 'bar')), {'value': 'test7'})
-
- self.assertEqual(md8.to_internal_json_structure(), [{
- 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
- 'metadata': {
- 'value': 'test6'
- }
- }, {
- 'selector': ['foo', 'bar'],
- 'metadata': {
- 'value': 'test7'
- }
- }])
-
- def test_removal(self):
- md1 = base.Metadata().update((), {'value': 'test1'})
-
- self.assertEqual(md1.query(()), {'value': 'test1'})
-
- md2 = md1.update((), {'value': base.NO_VALUE})
-
- self.assertEqual(md1.query(()), {'value': 'test1'})
- self.assertEqual(md2.query(()), {})
- self.assertEqual(md2.query((), ignore_all_elements=True), {})
-
- md3 = md2.update((), {'value': {'value2': 'test2'}})
-
- self.assertEqual(md1.query(()), {'value': 'test1'})
- self.assertEqual(md2.query(()), {})
- self.assertEqual(md3.query(()), {'value': {'value2': 'test2'}})
-
- md4 = md3.update((), {'value': {'value2': base.NO_VALUE}})
-
- self.assertEqual(md1.query(()), {'value': 'test1'})
- self.assertEqual(md2.query(()), {})
- self.assertEqual(md3.query(()), {'value': {'value2': 'test2'}})
- self.assertEqual(md4.query(()), {})
-
- md5 = md4.update((), {'value': base.NO_VALUE})
-
- self.assertEqual(md1.query(()), {'value': 'test1'})
- self.assertEqual(md2.query(()), {})
- self.assertEqual(md3.query(()), {'value': {'value2': 'test2'}})
- self.assertEqual(md4.query(()), {})
- self.assertEqual(md5.query(()), {})
-
- def test_empty_dict(self):
- md = base.Metadata().update((), {'value': {}})
-
- self.assertEqual(md.query(()), {'value': {}})
-
- md = md.update((), {'value': {'a': '1', 'b': 2}})
-
- self.assertEqual(md.query(()), {'value': {'a': '1', 'b': 2}})
-
- md = md.update((), {'value': {'a': base.NO_VALUE, 'b': base.NO_VALUE}})
-
- self.assertEqual(md.query(()), {})
-
- md = md.update((), {'value': {'a': '1', 'b': 2}})
-
- self.assertEqual(md.query(()), {'value': {'a': '1', 'b': 2}})
-
- md = md.update((), {'value': {'a': base.NO_VALUE}})
-
- self.assertEqual(md.query(()), {'value': {'b': 2}})
-
- def test_remove(self):
- metadata = base.Metadata().update((), {'value': 'test1'})
- metadata = metadata.update(('a',), {'value': 'test2'})
- metadata = metadata.update(('a', 'b'), {'value': 'test3'})
- metadata = metadata.update(('a', 'b', 'c'), {'value': 'test4'})
- metadata = metadata.update((base.ALL_ELEMENTS, 'b', 'd'), {'value': 'test5'})
- metadata = metadata.update((base.ALL_ELEMENTS, 'b', 'e', base.ALL_ELEMENTS), {'value': 'test6'})
-
- self.assertEqual(utils.to_json_structure(metadata.to_internal_simple_structure()), [
- {
- 'selector': [],
- 'metadata': {
- 'value': 'test1',
- }
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
- 'metadata': {
- 'value': 'test5',
- },
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
- 'metadata': {
- 'value': 'test6',
- },
- },
- {
- 'selector': ['a'],
- 'metadata': {
- 'value': 'test2',
- },
- },
- {
- 'selector': ['a', 'b'],
- 'metadata': {
- 'value': 'test3',
- },
- },
- {
- 'selector': ['a', 'b', 'c'],
- 'metadata': {
- 'value': 'test4',
- },
- },
- ])
-
- new_metadata = metadata.remove(('a', 'b'))
-
- self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
- {
- 'selector': [],
- 'metadata': {
- 'value': 'test1',
- },
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
- 'metadata': {
- 'value': 'test5',
- },
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
- 'metadata': {
- 'value': 'test6',
- },
- },
- {
- 'selector': ['a'],
- 'metadata': {
- 'value': 'test2',
- },
- },
- {
- 'selector': ['a', 'b', 'c'],
- 'metadata': {
- 'value': 'test4',
- },
- },
- ])
-
- new_metadata = metadata.remove(('a', 'b'), recursive=True)
-
- self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
- {
- 'selector': [],
- 'metadata': {
- 'value': 'test1',
- },
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
- 'metadata': {
- 'value': 'test5',
- },
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
- 'metadata': {
- 'value': 'test6',
- },
- },
- {
- 'selector': ['a'],
- 'metadata': {
- 'value': 'test2',
- },
- },
- ])
-
- new_metadata = metadata.remove((), recursive=True)
-
- self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [])
-
- new_metadata = metadata.remove((base.ALL_ELEMENTS, 'b'))
-
- self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
- {
- 'selector': [],
- 'metadata': {
- 'value': 'test1',
- }
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
- 'metadata': {
- 'value': 'test5',
- },
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
- 'metadata': {
- 'value': 'test6',
- },
- },
- {
- 'selector': ['a'],
- 'metadata': {
- 'value': 'test2',
- },
- },
- {
- 'selector': ['a', 'b', 'c'],
- 'metadata': {
- 'value': 'test4',
- },
- },
- ])
-
- new_metadata = metadata.remove((base.ALL_ELEMENTS, 'b'), recursive=True)
-
- self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
- {
- 'selector': [],
- 'metadata': {
- 'value': 'test1',
- }
- },
- {
- 'selector': ['a'],
- 'metadata': {
- 'value': 'test2',
- },
- },
- ])
-
- new_metadata = metadata.remove((base.ALL_ELEMENTS, 'b'), strict_all_elements=True)
-
- self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
- {
- 'selector': [],
- 'metadata': {
- 'value': 'test1',
- }
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
- 'metadata': {
- 'value': 'test5',
- },
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
- 'metadata': {
- 'value': 'test6',
- },
- },
- {
- 'selector': ['a'],
- 'metadata': {
- 'value': 'test2',
- },
- },
- {
- 'selector': ['a', 'b'],
- 'metadata': {
- 'value': 'test3',
- },
- },
- {
- 'selector': ['a', 'b', 'c'],
- 'metadata': {
- 'value': 'test4',
- },
- },
- ])
-
- new_metadata = metadata.remove((base.ALL_ELEMENTS, 'b'), recursive=True, strict_all_elements=True)
-
- self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
- {
- 'selector': [],
- 'metadata': {
- 'value': 'test1',
- }
- },
- {
- 'selector': ['a'],
- 'metadata': {
- 'value': 'test2',
- },
- },
- {
- 'selector': ['a', 'b'],
- 'metadata': {
- 'value': 'test3',
- },
- },
- {
- 'selector': ['a', 'b', 'c'],
- 'metadata': {
- 'value': 'test4',
- },
- },
- ])
-
- new_metadata = metadata.remove(('a', base.ALL_ELEMENTS))
-
- self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
- {
- 'selector': [],
- 'metadata': {
- 'value': 'test1',
- }
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
- 'metadata': {
- 'value': 'test5',
- },
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
- 'metadata': {
- 'value': 'test6',
- },
- },
- {
- 'selector': ['a'],
- 'metadata': {
- 'value': 'test2',
- },
- },
- {
- 'selector': ['a', 'b', 'c'],
- 'metadata': {
- 'value': 'test4',
- },
- },
- ])
-
- new_metadata = metadata.remove(('a', base.ALL_ELEMENTS), strict_all_elements=True)
-
- self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
- {
- 'selector': [],
- 'metadata': {
- 'value': 'test1',
- }
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
- 'metadata': {
- 'value': 'test5',
- },
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
- 'metadata': {
- 'value': 'test6',
- },
- },
- {
- 'selector': ['a'],
- 'metadata': {
- 'value': 'test2',
- },
- },
- {
- 'selector': ['a', 'b'],
- 'metadata': {
- 'value': 'test3',
- },
- },
- {
- 'selector': ['a', 'b', 'c'],
- 'metadata': {
- 'value': 'test4',
- },
- },
- ])
-
- new_metadata = metadata.remove(('a', base.ALL_ELEMENTS), recursive=True)
-
- self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
- {
- 'selector': [],
- 'metadata': {
- 'value': 'test1',
- }
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
- 'metadata': {
- 'value': 'test5',
- },
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
- 'metadata': {
- 'value': 'test6',
- },
- },
- {
- 'selector': ['a'],
- 'metadata': {
- 'value': 'test2',
- },
- },
- ])
-
- new_metadata = metadata.remove((base.ALL_ELEMENTS, 'b', base.ALL_ELEMENTS))
-
- self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
- {
- 'selector': [],
- 'metadata': {
- 'value': 'test1',
- }
- },
- {
- 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
- 'metadata': {
- 'value': 'test6',
- },
- },
- {
- 'selector': ['a'],
- 'metadata': {
- 'value': 'test2',
- },
- },
- {
- 'selector': ['a', 'b'],
- 'metadata': {
- 'value': 'test3',
- },
- },
- ])
-
- new_metadata = metadata.remove((base.ALL_ELEMENTS, 'b', base.ALL_ELEMENTS), recursive=True)
-
- self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
- {
- 'selector': [],
- 'metadata': {
- 'value': 'test1',
- }
- },
- {
- 'selector': ['a'],
- 'metadata': {
- 'value': 'test2',
- },
- },
- {
- 'selector': ['a', 'b'],
- 'metadata': {
- 'value': 'test3',
- },
- },
- ])
-
- def test_remove_column(self):
- metadata = base.DataMetadata().update((base.ALL_ELEMENTS, 0), {'name': 'column1'})
- metadata = metadata.update((base.ALL_ELEMENTS, 1), {'name': 'column2'})
- metadata = metadata.update((10, 0), {'value': 'row10.0'})
- metadata = metadata.update((10, 1), {'value': 'row10.1'})
-
- self.assertEqual(utils.to_json_structure(metadata.to_internal_simple_structure()), [{
- 'selector': ['__ALL_ELEMENTS__', 0],
- 'metadata': {'name': 'column1'},
- }, {
- 'selector': ['__ALL_ELEMENTS__', 1],
- 'metadata': {'name': 'column2'},
- }, {
- 'selector': [10, 0],
- 'metadata': {'value': 'row10.0'},
- }, {
- 'selector': [10, 1],
- 'metadata': {'value': 'row10.1'},
- }])
-
- metadata = metadata.remove_column(0)
-
- self.assertEqual(utils.to_json_structure(metadata.to_internal_simple_structure()), [{
- 'selector': ['__ALL_ELEMENTS__', 1],
- 'metadata': {'name': 'column2'},
- }, {
- 'selector': [10, 1],
- 'metadata': {'value': 'row10.1'},
- }])
-
- def test_check(self):
- data = container.Dataset({
- '0': container.ndarray(numpy.array([
- [1, 2, 3],
- [4, 5, 6],
- ])),
- })
-
- md1 = base.DataMetadata().update((), {
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': type(data),
- 'value': 'test'
- })
-
- md1.check(data)
-
- md2 = md1.update(('missing',), {'value': 'test'})
-
- with self.assertRaisesRegex(ValueError, 'cannot be resolved'):
- md2.check(data)
-
- md3 = md1.update(('0', 1), {'value': 'test'})
-
- md4 = md3.update(('0', 2), {'value': 'test'})
-
- with self.assertRaisesRegex(ValueError, 'cannot be resolved'):
- md4.check(data)
-
- md5 = md3.update(('0', 1, 3), {'value': 'test'})
-
- with self.assertRaisesRegex(ValueError, 'cannot be resolved'):
- md5.check(data)
-
- md6 = md3.update(('0', 1, 2, base.ALL_ELEMENTS), {'value': 'test'})
-
- with self.assertRaisesRegex(ValueError, 'ALL_ELEMENTS set but dimension missing at'):
- md6.check(data)
-
- def test_errors(self):
- with self.assertRaisesRegex(TypeError, 'Metadata should be a dict'):
- base.Metadata().update((), None)
-
- class Custom:
- pass
-
- with self.assertRaisesRegex(TypeError, 'is not known to be immutable'):
- base.Metadata().update((), {'foo': Custom()})
-
- with self.assertRaisesRegex(TypeError, 'Selector is not a tuple or a list'):
- base.Metadata().update({}, {'value': 'test'})
-
- with self.assertRaisesRegex(TypeError, 'is not a str, int, or ALL_ELEMENTS'):
- base.Metadata().update((1.0,), {'value': 'test'})
-
- with self.assertRaisesRegex(TypeError, 'is not a str, int, or ALL_ELEMENTS'):
- base.Metadata().update((None,), {'value': 'test'})
-
- def test_data(self):
- data = container.Dataset({
- '0': container.ndarray(numpy.array([
- [1, 2, 3],
- [4, 5, 6],
- ])),
- })
-
- md1 = base.DataMetadata()
- md1.update((), {'value': 'test'})
-
- with self.assertRaisesRegex(jsonschema.exceptions.ValidationError, 'is a required property'):
- md1.check(md1)
-
- md1 = base.DataMetadata().generate(data, compact=True)
-
- md2 = md1.update((), {
- 'id': 'test-dataset',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': type(data),
- 'dimension': {
- 'length': 1
- }
- })
-
- md3 = md2.update(('0',), {
- 'structural_type': type(data['0']),
- 'dimension': {
- 'length': 2
- }
- })
-
- self.assertEqual(utils.to_json_structure(md3.to_internal_simple_structure()), [{
- 'selector': [],
- 'metadata': {
- 'id': 'test-dataset',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': 'd3m.container.dataset.Dataset',
- 'dimension': {
- 'name': 'resources',
- 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/DatasetResource'],
- 'length': 1
- },
- },
- }, {
- 'selector': ['__ALL_ELEMENTS__'],
- 'metadata': {
- 'dimension': {
- 'length': 2,
- 'name': 'rows',
- 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/TabularRow'],
- },
- 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/Table'],
- 'structural_type': 'd3m.container.numpy.ndarray',
- },
- }, {
- 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
- 'metadata': {
- 'dimension': {
- 'length': 3,
- 'name': 'columns',
- 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/TabularColumn'],
- },
- },
- }, {
- 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
- 'metadata': {
- 'structural_type': 'numpy.int64',
- },
- }, {
- 'selector': ['0'],
- 'metadata': {
- 'structural_type': 'd3m.container.numpy.ndarray',
- 'dimension': {
- 'length': 2,
- },
- },
- }])
-
- md1 = base.DataMetadata().generate(data, compact=False)
-
- md2 = md1.update((), {
- 'id': 'test-dataset',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': type(data),
- 'dimension': {
- 'length': 1
- }
- })
-
- md3 = md2.update(('0',), {
- 'structural_type': type(data['0']),
- 'dimension': {
- 'length': 2
- }
- })
-
- self.assertEqual(utils.to_json_structure(md3.to_internal_simple_structure()), [{
- 'selector': [],
- 'metadata': {
- 'id': 'test-dataset',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': 'd3m.container.dataset.Dataset',
- 'dimension': {
- 'name': 'resources',
- 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/DatasetResource'],
- 'length': 1
- },
- },
- }, {
- 'selector': ['0'],
- 'metadata': {
- 'dimension': {
- 'length': 2,
- 'name': 'rows',
- 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/TabularRow'],
- },
- 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/Table'],
- 'structural_type': 'd3m.container.numpy.ndarray',
- },
- }, {
- 'selector': ['0', '__ALL_ELEMENTS__'],
- 'metadata': {
- 'dimension': {
- 'length': 3,
- 'name': 'columns',
- 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/TabularColumn'],
- },
- },
- }, {
- 'selector': ['0', '__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
- 'metadata': {
- 'structural_type': 'numpy.int64',
- },
- }])
-
- def test_prune_bug(self):
- metadata = base.Metadata().update((base.ALL_ELEMENTS, 0), {'foo': 'bar1'})
- metadata = metadata.update((0, 1), {'foo': 'bar2'})
- metadata = metadata.update((1, 1), {'foo': 'bar2'})
- metadata = metadata.update((2, 1), {'foo': 'bar2'})
- metadata = metadata.update((base.ALL_ELEMENTS, base.ALL_ELEMENTS), {'foo': 'bar3'})
-
- self.assertEqual(utils.to_json_structure(metadata.to_internal_simple_structure()), [{
- 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
- 'metadata': {'foo': 'bar3'},
- }])
-
- def test_remove_empty_metadata(self):
- metadata = base.Metadata().update((base.ALL_ELEMENTS,), {
- 'foo': {
- 'bar': 42,
- },
- 'other': 1,
- })
-
- metadata = metadata.update((base.ALL_ELEMENTS,), {
- 'foo': {
- 'bar': base.NO_VALUE,
- },
- })
-
- self.assertEqual(metadata.query((base.ALL_ELEMENTS,)), {
- 'other': 1,
- })
-
- metadata = base.Metadata({
- 'foo': {
- 'bar': 42,
- },
- 'other': 1,
- })
-
- metadata = metadata.update((), {
- 'foo': {
- 'bar': base.NO_VALUE,
- },
- })
-
- self.assertEqual(metadata.query(()), {
- 'other': 1,
- })
-
- metadata = base.Metadata({
- 'foo': {
- 'bar': 42,
- },
- })
-
- metadata = metadata.update((), {
- 'foo': {
- 'bar': base.NO_VALUE,
- },
- })
-
- self.assertEqual(metadata.query(()), {})
-
- metadata = base.Metadata().update(('a',), {
- 'foo': {
- 'bar': 42,
- },
- })
-
- metadata = metadata.update((base.ALL_ELEMENTS,), {
- 'foo': {
- 'bar': base.NO_VALUE,
- },
- })
-
- self.assertEqual(metadata.query(('a',)), {})
-
- self.assertEqual(utils.to_json_structure(metadata.to_internal_simple_structure()), [{
- 'selector': ['__ALL_ELEMENTS__'],
- 'metadata': {
- 'foo': {
- 'bar': '__NO_VALUE__',
- },
- },
- }])
-
- def test_ignore_all_elements(self):
- metadata = base.Metadata().update((base.ALL_ELEMENTS,), {
- 'foo': 'bar',
- 'other': 42,
- })
-
- metadata = metadata.update((0,), {
- 'foo': base.NO_VALUE,
- })
-
- metadata = metadata.update((2,), {
- 'other2': 43,
- })
-
- self.assertEqual(metadata.query((0,)), {'other': 42})
- self.assertEqual(metadata.query((1,)), {'foo': 'bar', 'other': 42})
- self.assertEqual(metadata.query((2,)), {'foo': 'bar', 'other': 42, 'other2': 43})
- self.assertEqual(metadata.query((0,), ignore_all_elements=True), {})
- self.assertEqual(metadata.query((1,), ignore_all_elements=True), {})
- self.assertEqual(metadata.query((2,), ignore_all_elements=True), {'other2': 43})
-
- metadata = metadata.update((base.ALL_ELEMENTS,), {
- 'foo': 'bar2',
- })
-
- self.assertEqual(metadata.query((0,)), {'foo': 'bar2', 'other': 42})
- self.assertEqual(metadata.query((1,)), {'foo': 'bar2', 'other': 42})
- self.assertEqual(metadata.query((2,)), {'foo': 'bar2', 'other': 42, 'other2': 43})
- self.assertEqual(metadata.query((0,), ignore_all_elements=True), {})
- self.assertEqual(metadata.query((1,), ignore_all_elements=True), {})
- self.assertEqual(metadata.query((2,), ignore_all_elements=True), {'other2': 43})
-
- def test_query_with_exceptions(self):
- metadata = base.Metadata().update((base.ALL_ELEMENTS,), {
- 'foo': 'bar',
- 'other': 42,
- })
-
- metadata = metadata.update((0,), {
- 'foo': base.NO_VALUE,
- })
-
- metadata = metadata.update((2,), {
- 'other2': 43,
- })
-
- self.assertEqual(metadata.query((0,)), {'other': 42})
- self.assertEqual(metadata.query((1,)), {'foo': 'bar', 'other': 42})
- self.assertEqual(metadata.query((2,)), {'foo': 'bar', 'other': 42, 'other2': 43})
-
- self.assertEqual(metadata.query_with_exceptions((0,)), ({'other': 42}, {}))
- self.assertEqual(metadata.query_with_exceptions((1,)), ({'foo': 'bar', 'other': 42}, {}))
- self.assertEqual(metadata.query_with_exceptions((2,)), ({'foo': 'bar', 'other': 42, 'other2': 43}, {}))
-
- self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS,)), ({
- 'foo': 'bar',
- 'other': 42,
- }, {
- (0,): {'other': 42},
- (2,): {'foo': 'bar', 'other': 42, 'other2': 43},
- }))
-
- metadata = metadata.update((base.ALL_ELEMENTS,), {
- 'foo': 'bar2',
- })
-
- self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS,)), ({
- 'foo': 'bar2',
- 'other': 42,
- }, {
- (2,): {'foo': 'bar2', 'other': 42, 'other2': 43},
- }))
-
- metadata = base.Metadata().update((base.ALL_ELEMENTS, 0), {
- 'name': 'bar',
- })
-
- metadata = metadata.update((base.ALL_ELEMENTS, 1), {
- 'name': 'foo',
- })
-
- metadata = metadata.update((2, 0), {
- 'name': 'bar2',
- })
-
- metadata = metadata.update((2, 2), {
- 'name': 'foo2',
- })
-
- self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS, 0)), ({
- 'name': 'bar',
- }, {
- (2, 0): {'name': 'bar2'},
- }))
-
- self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS, 1)), ({
- 'name': 'foo',
- }, {}))
-
- self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS, 2)), ({}, {
- (2, 2): {'name': 'foo2'},
- }))
-
- self.assertEqual(metadata.query_with_exceptions((2, base.ALL_ELEMENTS)), ({}, {
- (2, 0): {'name': 'bar2'},
- (2, 2): {'name': 'foo2'},
- }))
-
- metadata = base.Metadata().update((base.ALL_ELEMENTS, base.ALL_ELEMENTS), {
- 'foo': 'bar',
- 'other': 42,
- })
-
- metadata = metadata.update((base.ALL_ELEMENTS, 0), {
- 'foo': base.NO_VALUE,
- })
-
- metadata = metadata.update((base.ALL_ELEMENTS, 2), {
- 'other2': 43,
- })
-
- self.assertEqual(metadata.query((base.ALL_ELEMENTS, 0)), {'other': 42})
- self.assertEqual(metadata.query((base.ALL_ELEMENTS, 1)), {'foo': 'bar', 'other': 42})
- self.assertEqual(metadata.query((base.ALL_ELEMENTS, 2)), {'foo': 'bar', 'other': 42, 'other2': 43})
-
- self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS, 0)), ({'other': 42}, {}))
- self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS, 1)), ({'foo': 'bar', 'other': 42}, {}))
- self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS, 2)), ({'foo': 'bar', 'other': 42, 'other2': 43}, {}))
-
- self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS, base.ALL_ELEMENTS)), ({
- 'foo': 'bar',
- 'other': 42,
- }, {
- (base.ALL_ELEMENTS, 0): {'other': 42},
- (base.ALL_ELEMENTS, 2): {'foo': 'bar', 'other': 42, 'other2': 43},
- }))
-
- def test_semantic_types(self):
- metadata = base.DataMetadata({
- 'structural_type': container.DataFrame,
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- })
-
- self.assertFalse(metadata.has_semantic_type((), 'https://metadata.datadrivendiscovery.org/types/DatasetResource'))
-
- metadata = metadata.add_semantic_type((), 'https://metadata.datadrivendiscovery.org/types/DatasetResource')
-
- self.assertTrue(metadata.has_semantic_type((), 'https://metadata.datadrivendiscovery.org/types/DatasetResource'))
-
- metadata = metadata.remove_semantic_type((), 'https://metadata.datadrivendiscovery.org/types/DatasetResource')
-
- self.assertFalse(metadata.has_semantic_type((), 'https://metadata.datadrivendiscovery.org/types/DatasetResource'))
-
- metadata = metadata.add_semantic_type((base.ALL_ELEMENTS, 0), 'https://metadata.datadrivendiscovery.org/types/Attribute')
- metadata = metadata.add_semantic_type((base.ALL_ELEMENTS, 1), 'https://metadata.datadrivendiscovery.org/types/PrimaryKey')
- metadata = metadata.add_semantic_type((base.ALL_ELEMENTS, 2), 'https://metadata.datadrivendiscovery.org/types/Attribute')
-
- self.assertEqual(metadata.get_elements_with_semantic_type((), 'https://metadata.datadrivendiscovery.org/types/Attribute'), [])
- self.assertEqual(metadata.get_elements_with_semantic_type((base.ALL_ELEMENTS,), 'https://metadata.datadrivendiscovery.org/types/Attribute'), [0, 2])
-
- def test_copy_elements_metadata(self):
- metadata = base.Metadata()
-
- metadata = metadata.update((), {'level0': 'foobar0'})
-
- metadata = metadata.update(('level1',), {'level1': 'foobar1'})
-
- metadata = metadata.update((base.ALL_ELEMENTS,), {'level1a': 'foobar1a', 'level1b': 'foobar1b'})
-
- metadata = metadata.update(('level1',), {'level1b': base.NO_VALUE})
-
- metadata = metadata.update(('level1', 'level2'), {'level2': 'foobar2'})
-
- metadata = metadata.update((base.ALL_ELEMENTS, base.ALL_ELEMENTS), {'level2a': 'foobar2a', 'level2b': 'foobar2b'})
-
- metadata = metadata.update(('level1', 'level2'), {'level2b': base.NO_VALUE})
-
- metadata = metadata.update(('level1', 'level2', 'level3'), {'level3': 'foobar3'})
-
- metadata = metadata.update((base.ALL_ELEMENTS, base.ALL_ELEMENTS, 'level3'), {'level3a': 'foobar3a'})
-
- metadata = metadata.update(('level1', 'level2', 'level3.1'), {'level3.1': 'foobar3.1'})
-
- metadata = metadata.update(('level1', 'level2', 'level3', 'level4'), {'level4': 'foobar4'})
-
- metadata = metadata.update(('level1', 'level2', 'level3', 'level4.1'), {'level4.1': 'foobar4.1'})
-
- self.assertEqual(utils.to_json_structure(metadata.to_internal_simple_structure()), [{
- 'selector': [],
- 'metadata': {'level0': 'foobar0'},
- }, {
- 'selector': ['__ALL_ELEMENTS__'],
- 'metadata': {'level1a': 'foobar1a', 'level1b': 'foobar1b'},
- }, {
- 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
- 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
- }, {
- 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__', 'level3'],
- 'metadata': {'level3a': 'foobar3a'},
- }, {
- 'selector': ['level1'],
- 'metadata': {'level1': 'foobar1', 'level1b': '__NO_VALUE__'},
- }, {
- 'selector': ['level1', 'level2'],
- 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
- }, {
- 'selector': ['level1', 'level2', 'level3'],
- 'metadata': {'level3': 'foobar3'},
- }, {
- 'selector': ['level1', 'level2', 'level3', 'level4'],
- 'metadata': {'level4': 'foobar4'},
- }, {
- 'selector': ['level1', 'level2', 'level3', 'level4.1'],
- 'metadata': {'level4.1': 'foobar4.1'},
- }, {
- 'selector': ['level1', 'level2', 'level3.1'],
- 'metadata': {'level3.1': 'foobar3.1'},
- }])
-
- self.assertEqual(metadata.query(('level1', 'level2')), {
- 'level2a': 'foobar2a',
- 'level2': 'foobar2',
- })
-
- target_metadata = base.DataMetadata({
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': container.DataFrame,
- })
-
- target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
-
- target_metadata = copy_elements_metadata(metadata, target_metadata, ())
-
- self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
- 'selector': [],
- 'metadata': {
- 'level0z': 'foobar0z',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': 'd3m.container.pandas.DataFrame',
- },
- }, {
- 'selector': ['__ALL_ELEMENTS__'],
- 'metadata': {'level1a': 'foobar1a', 'level1b': 'foobar1b'},
- }, {
- 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
- 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
- }, {
- 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__', 'level3'],
- 'metadata': {'level3a': 'foobar3a'},
- }, {
- 'selector': ['level1'],
- 'metadata': {'level1': 'foobar1', 'level1b': '__NO_VALUE__'},
- }, {
- 'selector': ['level1', 'level2'],
- 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
- }, {
- 'selector': ['level1', 'level2', 'level3'],
- 'metadata': {'level3': 'foobar3'},
- }, {
- 'selector': ['level1', 'level2', 'level3', 'level4'],
- 'metadata': {'level4': 'foobar4'},
- }, {
- 'selector': ['level1', 'level2', 'level3', 'level4.1'],
- 'metadata': {'level4.1': 'foobar4.1'},
- }, {
- 'selector': ['level1', 'level2', 'level3.1'],
- 'metadata': {'level3.1': 'foobar3.1'},
- }])
-
- self.assertEqual(target_metadata.to_json_structure(), [{
- 'selector': [],
- 'metadata': {
- 'level0z': 'foobar0z',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': 'd3m.container.pandas.DataFrame',
- },
- }, {
- 'selector': ['__ALL_ELEMENTS__'],
- 'metadata': {'level1a': 'foobar1a', 'level1b': 'foobar1b'},
- }, {
- 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
- 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
- }, {
- 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__', 'level3'],
- 'metadata': {'level3a': 'foobar3a'},
- }, {
- 'selector': ['level1'],
- 'metadata': {'level1': 'foobar1', 'level1a': 'foobar1a'},
- }, {
- 'selector': ['level1', '__ALL_ELEMENTS__'],
- 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
- }, {
- 'selector': ['level1', '__ALL_ELEMENTS__', 'level3'],
- 'metadata': {'level3a': 'foobar3a'},
- }, {
- 'selector': ['level1', 'level2'],
- 'metadata': {'level2': 'foobar2', 'level2a': 'foobar2a'},
- }, {
- 'selector': ['level1', 'level2', 'level3'],
- 'metadata': {'level3': 'foobar3', 'level3a': 'foobar3a'},
- }, {
- 'selector': ['level1', 'level2', 'level3', 'level4'],
- 'metadata': {'level4': 'foobar4'},
- }, {
- 'selector': ['level1', 'level2', 'level3', 'level4.1'],
- 'metadata': {'level4.1': 'foobar4.1'},
- }, {
- 'selector': ['level1', 'level2', 'level3.1'],
- 'metadata': {'level3.1': 'foobar3.1'},
- }])
-
- target_metadata = base.DataMetadata({
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': container.DataFrame,
- })
-
- target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
-
- target_metadata = copy_elements_metadata(metadata, target_metadata, ('level1',))
-
- self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
- 'selector': [],
- 'metadata': {
- 'level0z': 'foobar0z',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': 'd3m.container.pandas.DataFrame',
- },
- }, {
- 'selector': ['__ALL_ELEMENTS__'],
- 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
- }, {
- 'selector': ['__ALL_ELEMENTS__', 'level3'],
- 'metadata': {'level3a': 'foobar3a'},
- }, {
- 'selector': ['level2'],
- 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
- }, {
- 'selector': ['level2', 'level3'],
- 'metadata': {'level3': 'foobar3'},
- }, {
- 'selector': ['level2', 'level3', 'level4'],
- 'metadata': {'level4': 'foobar4'},
- }, {
- 'selector': ['level2', 'level3', 'level4.1'],
- 'metadata': {'level4.1': 'foobar4.1'},
- }, {
- 'selector': ['level2', 'level3.1'],
- 'metadata': {'level3.1': 'foobar3.1'},
- }])
-
- self.assertEqual(target_metadata.query(('level2',)), {
- 'level2a': 'foobar2a',
- 'level2': 'foobar2',
- })
-
- target_metadata = base.DataMetadata({
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': container.DataFrame,
- })
-
- target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
- target_metadata = target_metadata.update(('zlevel',), {'level1z': 'foobar1z'})
-
- target_metadata = copy_elements_metadata(metadata, target_metadata, ('level1',), ('zlevel',))
-
- self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
- 'selector': [],
- 'metadata': {
- 'level0z': 'foobar0z',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': 'd3m.container.pandas.DataFrame',
- },
- }, {
- 'selector': ['zlevel'],
- 'metadata': {'level1z': 'foobar1z'},
- }, {
- 'selector': ['zlevel', '__ALL_ELEMENTS__'],
- 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
- }, {
- 'selector': ['zlevel', '__ALL_ELEMENTS__', 'level3'],
- 'metadata': {'level3a': 'foobar3a'},
- }, {
- 'selector': ['zlevel', 'level2'],
- 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
- }, {
- 'selector': ['zlevel', 'level2', 'level3'],
- 'metadata': {'level3': 'foobar3'},
- }, {
- 'selector': ['zlevel', 'level2', 'level3', 'level4'],
- 'metadata': {'level4': 'foobar4'},
- }, {
- 'selector': ['zlevel', 'level2', 'level3', 'level4.1'],
- 'metadata': {'level4.1': 'foobar4.1'},
- }, {
- 'selector': ['zlevel', 'level2', 'level3.1'],
- 'metadata': {'level3.1': 'foobar3.1'},
- }])
-
- self.assertEqual(target_metadata.query(('zlevel', 'level2',)), {
- 'level2a': 'foobar2a',
- 'level2': 'foobar2',
- })
-
- target_metadata = base.DataMetadata({
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': container.DataFrame,
- })
-
- target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
-
- target_metadata = copy_elements_metadata(metadata, target_metadata, ('level1', 'level2'))
-
- self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
- 'selector': [],
- 'metadata': {
- 'level0z': 'foobar0z',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': 'd3m.container.pandas.DataFrame',
- },
- }, {
- 'selector': ['level3'],
- 'metadata': {'level3': 'foobar3', 'level3a': 'foobar3a'},
- }, {
- 'selector': ['level3', 'level4'],
- 'metadata': {'level4': 'foobar4'},
- }, {
- 'selector': ['level3', 'level4.1'],
- 'metadata': {'level4.1': 'foobar4.1'},
- }, {
- 'selector': ['level3.1'],
- 'metadata': {'level3.1': 'foobar3.1'},
- }])
-
- target_metadata = base.DataMetadata({
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': container.DataFrame,
- })
-
- target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
- target_metadata = target_metadata.update(('zlevel',), {'level1z': 'foobar1z'})
-
- target_metadata = copy_elements_metadata(metadata, target_metadata, ('level1', 'level2'), ('zlevel',))
-
- self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
- 'selector': [],
- 'metadata': {
- 'level0z': 'foobar0z',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': 'd3m.container.pandas.DataFrame',
- },
- }, {
- 'selector': ['zlevel'],
- 'metadata': {'level1z': 'foobar1z'},
- }, {
- 'selector': ['zlevel', 'level3'],
- 'metadata': {'level3': 'foobar3', 'level3a': 'foobar3a'},
- }, {
- 'selector': ['zlevel', 'level3', 'level4'],
- 'metadata': {'level4': 'foobar4'},
- }, {
- 'selector': ['zlevel', 'level3', 'level4.1'],
- 'metadata': {'level4.1': 'foobar4.1'},
- }, {
- 'selector': ['zlevel', 'level3.1'],
- 'metadata': {'level3.1': 'foobar3.1'},
- }])
-
- def test_copy_metadata(self):
- metadata = base.Metadata()
-
- metadata = metadata.update((), {'level0': 'foobar0'})
-
- metadata = metadata.update(('level1',), {'level1': 'foobar1'})
-
- metadata = metadata.update((base.ALL_ELEMENTS,), {'level1a': 'foobar1a', 'level1b': 'foobar1b'})
-
- metadata = metadata.update(('level1',), {'level1b': base.NO_VALUE})
-
- metadata = metadata.update(('level1', 'level2'), {'level2': 'foobar2'})
-
- metadata = metadata.update((base.ALL_ELEMENTS, base.ALL_ELEMENTS), {'level2a': 'foobar2a', 'level2b': 'foobar2b'})
-
- metadata = metadata.update(('level1', 'level2'), {'level2b': base.NO_VALUE})
-
- metadata = metadata.update(('level1', 'level2', 'level3'), {'level3': 'foobar3'})
-
- metadata = metadata.update((base.ALL_ELEMENTS, base.ALL_ELEMENTS, 'level3'), {'level3a': 'foobar3a'})
-
- metadata = metadata.update(('level1', 'level2', 'level3.1'), {'level3.1': 'foobar3.1'})
-
- metadata = metadata.update(('level1', 'level2', 'level3', 'level4'), {'level4': 'foobar4'})
-
- metadata = metadata.update(('level1', 'level2', 'level3', 'level4.1'), {'level4.1': 'foobar4.1'})
-
- self.assertEqual(utils.to_json_structure(metadata.to_internal_simple_structure()), [{
- 'selector': [],
- 'metadata': {'level0': 'foobar0'},
- }, {
- 'selector': ['__ALL_ELEMENTS__'],
- 'metadata': {'level1a': 'foobar1a', 'level1b': 'foobar1b'},
- }, {
- 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
- 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
- }, {
- 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__', 'level3'],
- 'metadata': {'level3a': 'foobar3a'},
- }, {
- 'selector': ['level1'],
- 'metadata': {'level1': 'foobar1', 'level1b': '__NO_VALUE__'},
- }, {
- 'selector': ['level1', 'level2'],
- 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
- }, {
- 'selector': ['level1', 'level2', 'level3'],
- 'metadata': {'level3': 'foobar3'},
- }, {
- 'selector': ['level1', 'level2', 'level3', 'level4'],
- 'metadata': {'level4': 'foobar4'},
- }, {
- 'selector': ['level1', 'level2', 'level3', 'level4.1'],
- 'metadata': {'level4.1': 'foobar4.1'},
- }, {
- 'selector': ['level1', 'level2', 'level3.1'],
- 'metadata': {'level3.1': 'foobar3.1'},
- }])
-
- self.assertEqual(metadata.query(('level1', 'level2')), {
- 'level2a': 'foobar2a',
- 'level2': 'foobar2',
- })
-
- target_metadata = base.DataMetadata({
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': container.DataFrame,
- })
-
- target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
-
- target_metadata = metadata.copy_to(target_metadata, ())
-
- self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
- 'selector': [],
- 'metadata': {
- 'level0': 'foobar0',
- 'level0z': 'foobar0z',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': 'd3m.container.pandas.DataFrame',
- },
- }, {
- 'selector': ['__ALL_ELEMENTS__'],
- 'metadata': {'level1a': 'foobar1a', 'level1b': 'foobar1b'},
- }, {
- 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
- 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
- }, {
- 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__', 'level3'],
- 'metadata': {'level3a': 'foobar3a'},
- }, {
- 'selector': ['level1'],
- 'metadata': {'level1': 'foobar1', 'level1b': '__NO_VALUE__'},
- }, {
- 'selector': ['level1', 'level2'],
- 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
- }, {
- 'selector': ['level1', 'level2', 'level3'],
- 'metadata': {'level3': 'foobar3'},
- }, {
- 'selector': ['level1', 'level2', 'level3', 'level4'],
- 'metadata': {'level4': 'foobar4'},
- }, {
- 'selector': ['level1', 'level2', 'level3', 'level4.1'],
- 'metadata': {'level4.1': 'foobar4.1'},
- }, {
- 'selector': ['level1', 'level2', 'level3.1'],
- 'metadata': {'level3.1': 'foobar3.1'},
- }])
-
- target_metadata = base.DataMetadata({
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': container.DataFrame,
- })
-
- target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
-
- target_metadata = metadata.copy_to(target_metadata, ('level1',))
-
- self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
- 'selector': [],
- 'metadata': {
- 'level0z': 'foobar0z',
- 'level1': 'foobar1',
- 'level1b': '__NO_VALUE__',
- 'level1a': 'foobar1a',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': 'd3m.container.pandas.DataFrame',
- },
- }, {
- 'selector': ['__ALL_ELEMENTS__'],
- 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
- }, {
- 'selector': ['__ALL_ELEMENTS__', 'level3'],
- 'metadata': {'level3a': 'foobar3a'},
- }, {
- 'selector': ['level2'],
- 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
- }, {
- 'selector': ['level2', 'level3'],
- 'metadata': {'level3': 'foobar3'},
- }, {
- 'selector': ['level2', 'level3', 'level4'],
- 'metadata': {'level4': 'foobar4'},
- }, {
- 'selector': ['level2', 'level3', 'level4.1'],
- 'metadata': {'level4.1': 'foobar4.1'},
- }, {
- 'selector': ['level2', 'level3.1'],
- 'metadata': {'level3.1': 'foobar3.1'},
- }])
-
- self.assertEqual(target_metadata.query(('level2',)), {
- 'level2a': 'foobar2a',
- 'level2': 'foobar2',
- })
-
- target_metadata = base.DataMetadata({
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': container.DataFrame,
- })
-
- target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
- target_metadata = target_metadata.update(('zlevel',), {'level1z': 'foobar1z'})
-
- target_metadata = metadata.copy_to(target_metadata, ('level1',), ('zlevel',))
-
- self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
- 'selector': [],
- 'metadata': {
- 'level0z': 'foobar0z',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': 'd3m.container.pandas.DataFrame',
- },
- }, {
- 'selector': ['zlevel'],
- 'metadata': {'level1z': 'foobar1z', 'level1': 'foobar1', 'level1b': '__NO_VALUE__', 'level1a': 'foobar1a'},
- }, {
- 'selector': ['zlevel', '__ALL_ELEMENTS__'],
- 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
- }, {
- 'selector': ['zlevel', '__ALL_ELEMENTS__', 'level3'],
- 'metadata': {'level3a': 'foobar3a'},
- }, {
- 'selector': ['zlevel', 'level2'],
- 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
- }, {
- 'selector': ['zlevel', 'level2', 'level3'],
- 'metadata': {'level3': 'foobar3'},
- }, {
- 'selector': ['zlevel', 'level2', 'level3', 'level4'],
- 'metadata': {'level4': 'foobar4'},
- }, {
- 'selector': ['zlevel', 'level2', 'level3', 'level4.1'],
- 'metadata': {'level4.1': 'foobar4.1'},
- }, {
- 'selector': ['zlevel', 'level2', 'level3.1'],
- 'metadata': {'level3.1': 'foobar3.1'},
- }])
-
- self.assertEqual(target_metadata.query(('zlevel', 'level2',)), {
- 'level2a': 'foobar2a',
- 'level2': 'foobar2',
- })
-
- target_metadata = base.DataMetadata({
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': container.DataFrame,
- })
-
- target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
-
- target_metadata = metadata.copy_to(target_metadata, ('level1', 'level2'))
-
- self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
- 'selector': [],
- 'metadata': {
- 'level0z': 'foobar0z',
- 'level2': 'foobar2',
- 'level2b': '__NO_VALUE__',
- 'level2a': 'foobar2a',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': 'd3m.container.pandas.DataFrame',
- },
- }, {
- 'selector': ['level3'],
- 'metadata': {'level3': 'foobar3', 'level3a': 'foobar3a'},
- }, {
- 'selector': ['level3', 'level4'],
- 'metadata': {'level4': 'foobar4'},
- }, {
- 'selector': ['level3', 'level4.1'],
- 'metadata': {'level4.1': 'foobar4.1'},
- }, {
- 'selector': ['level3.1'],
- 'metadata': {'level3.1': 'foobar3.1'},
- }])
-
- target_metadata = base.DataMetadata({
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': container.DataFrame,
- })
-
- target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
- target_metadata = target_metadata.update(('zlevel',), {'level1z': 'foobar1z'})
-
- target_metadata = metadata.copy_to(target_metadata, ('level1', 'level2'), ('zlevel',))
-
- self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
- 'selector': [],
- 'metadata': {
- 'level0z': 'foobar0z',
- 'schema': base.CONTAINER_SCHEMA_VERSION,
- 'structural_type': 'd3m.container.pandas.DataFrame',
- },
- }, {
- 'selector': ['zlevel'],
- 'metadata': {'level1z': 'foobar1z', 'level2': 'foobar2', 'level2b': '__NO_VALUE__', 'level2a': 'foobar2a'},
- }, {
- 'selector': ['zlevel', 'level3'],
- 'metadata': {'level3': 'foobar3', 'level3a': 'foobar3a'},
- }, {
- 'selector': ['zlevel', 'level3', 'level4'],
- 'metadata': {'level4': 'foobar4'},
- }, {
- 'selector': ['zlevel', 'level3', 'level4.1'],
- 'metadata': {'level4.1': 'foobar4.1'},
- }, {
- 'selector': ['zlevel', 'level3.1'],
- 'metadata': {'level3.1': 'foobar3.1'},
- }])
-
- def test_get_index_columns(self):
- main = container.DataFrame({'a1': [1, 2, 3], 'b1': [4, 5, 6]}, generate_metadata=True)
-
- main.metadata = main.metadata.update((base.ALL_ELEMENTS, 0), {
- 'name': 'image',
- 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/PrimaryKey'],
- })
- main.metadata = main.metadata.update((base.ALL_ELEMENTS, 1), {
- 'name': 'd3mIndex',
- 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/PrimaryKey'],
- })
-
- self.assertEqual(main.metadata.get_index_columns(), [1, 0])
-
- def test_query_field(self):
- md = base.Metadata()
- md = md.update((1,), {'key': 'value'})
-
- self.assertEqual(md.query_field((1,), 'key', strict_all_elements=False), 'value')
- self.assertEqual(md.query_field((1,), 'key', strict_all_elements=True), 'value')
-
- with self.assertRaises(KeyError):
- self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=False), 'value')
- self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=True), 'value')
-
- with self.assertRaises(KeyError):
- self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key2', strict_all_elements=True), 'value')
-
- md = md.update((2,), {'key': 'value'})
-
- with self.assertRaises(KeyError):
- self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=False), 'value')
- self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=True), 'value')
-
- md = md.update((3,), {'key': 'value2'})
-
- with self.assertRaises(KeyError):
- self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=False), 'value')
- with self.assertRaises(KeyError):
- self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=True), 'value')
-
- md = md.update((base.ALL_ELEMENTS,), {'key': 'value'})
-
- self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=False), 'value')
- self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=True), 'value')
-
- self.assertEqual(md.query_field((1,), 'key', strict_all_elements=False), 'value')
- self.assertEqual(md.query_field((1,), 'key', strict_all_elements=True), 'value')
-
- md = md.update((3,), {'key': 'value2'})
-
- self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=False), 'value')
- with self.assertRaises(KeyError):
- self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=True), 'value')
-
- def test_query_field_with_exceptions(self):
- md = base.Metadata()
- md = md.update((1,), {'key': 'value'})
- md = md.update((2,), {'key': 'value2'})
-
- self.assertEqual(md.query_field_with_exceptions((1,), 'key'), ('value', {}))
- self.assertEqual(md.query_field_with_exceptions((2,), 'key'), ('value2', {}))
- with self.assertRaises(KeyError):
- md.query_field_with_exceptions((3,), 'key')
-
- self.assertEqual(md.query_field_with_exceptions((base.ALL_ELEMENTS,), 'key'), (base.NO_VALUE, {(1,): 'value', (2,): 'value2'}))
-
- # All elements ar require "key" field when there is no explicit ALL_ELEMENTS metadata.
- md = md.update((3,), {'key2': 'value'})
-
- with self.assertRaises(KeyError):
- md.query_field_with_exceptions((base.ALL_ELEMENTS,), 'key')
-
- md = md.update((base.ALL_ELEMENTS,), {'key': 'value'})
-
- self.assertEqual(md.query_field_with_exceptions((1,), 'key'), ('value', {}))
- self.assertEqual(md.query_field_with_exceptions((2,), 'key'), ('value', {}))
-
- self.assertEqual(md.query_field_with_exceptions((base.ALL_ELEMENTS,), 'key'), ('value', {}))
-
- md = md.update((3,), {'key': 'value2'})
-
- self.assertEqual(md.query_field_with_exceptions((base.ALL_ELEMENTS,), 'key'), ('value', {(3,): 'value2'}))
-
- # Setting same value as what ALL_ELEMENTS has should not add additional exception.
- md = md.update((4,), {'key': 'value'})
-
- self.assertEqual(md.query_field_with_exceptions((base.ALL_ELEMENTS,), 'key'), ('value', {(3,): 'value2'}))
-
- # Because ALL_ELEMENTS is set, any additional elements without "key" field are ignored.
- md = md.update((5,), {'key2': 'value'})
-
- self.assertEqual(md.query_field_with_exceptions((base.ALL_ELEMENTS,), 'key'), ('value', {(3,): 'value2'}))
-
- def test_compact_generated_metadata(self):
- ALL_GENERATED_KEYS = ['foo', 'name', 'other', 'structural_type']
-
- compacted_metadata = base.DataMetadata._compact_metadata({}, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {})
-
- # All equal.
- new_metadata = {
- ('a',): {'foo': 'bar', 'other': 1},
- ('b',): {'foo': 'bar', 'other': 2},
- ('c',): {'foo': 'bar', 'other': 3},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS,): {'foo': 'bar'},
- ('a',): {'other': 1},
- ('b',): {'other': 2},
- ('c',): {'other': 3},
- })
-
- # One different.
- new_metadata = {
- ('a',): {'foo': 'bar', 'other': 1},
- ('b',): {'foo': 'bar', 'other': 2},
- ('c',): {'foo': 'bar2', 'other': 3,},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- ('a',): {'foo': 'bar', 'other': 1},
- ('b',): {'foo': 'bar', 'other': 2},
- ('c',): {'foo': 'bar2', 'other': 3,},
- })
-
- # Recursive.
- new_metadata = {
- ('deep', 'a'): {'foo': 'bar', 'other': 1},
- ('deep', 'b'): {'foo': 'bar', 'other': 2},
- ('deep', 'c'): {'foo': 'bar', 'other': 3},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS): {'foo': 'bar'},
- (base.ALL_ELEMENTS, 'a'): {'other': 1},
- (base.ALL_ELEMENTS, 'b'): {'other': 2},
- (base.ALL_ELEMENTS, 'c'): {'other': 3},
- })
-
- new_metadata = {
- ('deep', 'a'): {'foo': 'bar', 'other': 1},
- ('deep', 'b'): {'foo': 'bar', 'other': 2},
- ('deep', 'c'): {'foo': 'bar', 'other': 3},
- ('deep2', 'd'): {'foo': 'bar', 'other': 4},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS): {'foo': 'bar'},
- (base.ALL_ELEMENTS, 'a'): {'other': 1},
- (base.ALL_ELEMENTS, 'b'): {'other': 2},
- (base.ALL_ELEMENTS, 'c'): {'other': 3},
- (base.ALL_ELEMENTS, 'd'): {'other': 4},
- })
-
- new_metadata = {
- ('deep', 'a'): {'foo': 'bar', 'other': 1},
- ('deep', 'b'): {'foo': 'bar', 'other': 2},
- ('deep', 'c'): {'foo': 'bar', 'other': 3},
- ('deep2', 'a'): {'foo': 'bar', 'other': 4},
- ('deep2', 'b'): {'foo': 'bar', 'other': 5},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS): {'foo': 'bar'},
- (base.ALL_ELEMENTS, 'c'): {'other': 3},
- ('deep', 'a'): {'other': 1},
- ('deep', 'b'): {'other': 2},
- ('deep2', 'a'): {'other': 4},
- ('deep2', 'b'): {'other': 5},
- })
-
- new_metadata = {
- ('deep', 'a'): {'foo': 'bar', 'other': 1},
- ('deep', 'b'): {'foo': 'bar', 'other': 2},
- ('deep', 'c'): {'foo': 'bar2', 'other': 3},
- ('deep2', 'a'): {'foo': 'bar', 'other': 4},
- ('deep2', 'b'): {'foo': 'bar', 'other': 5},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, 'a'): {'foo': 'bar'},
- (base.ALL_ELEMENTS, 'b'): {'foo': 'bar'},
- (base.ALL_ELEMENTS, 'c'): {'foo': 'bar2', 'other': 3},
- ('deep', 'a'): {'other': 1},
- ('deep', 'b'): {'other': 2},
- ('deep2', 'a'): {'other': 4},
- ('deep2', 'b'): {'other': 5},
- })
-
- new_metadata = {
- ('a', 'deep'): {'foo': 'bar', 'other': 1},
- ('b', 'deep'): {'foo': 'bar', 'other': 2},
- ('c', 'deep'): {'foo': 'bar2', 'other': 3},
- ('a', 'deep2'): {'foo': 'bar', 'other': 4},
- ('b', 'deep2'): {'foo': 'bar', 'other': 5},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- ('a', base.ALL_ELEMENTS): {'foo': 'bar'},
- ('a', 'deep'): {'other': 1},
- ('a', 'deep2'): {'other': 4},
- ('b', base.ALL_ELEMENTS): {'foo': 'bar'},
- ('b', 'deep'): {'other': 2},
- ('b', 'deep2'): {'other': 5},
- ('c', base.ALL_ELEMENTS): {'foo': 'bar2', 'other': 3},
- })
-
- new_metadata = {
- (base.ALL_ELEMENTS, 'a'): {'foo': 'bar', 'other': 1},
- (base.ALL_ELEMENTS, 'b'): {'foo': 'bar', 'other': 2},
- (base.ALL_ELEMENTS, 'c'): {'foo': 'bar', 'other': 3},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS): {'foo': 'bar'},
- (base.ALL_ELEMENTS, 'a'): {'other': 1},
- (base.ALL_ELEMENTS, 'b'): {'other': 2},
- (base.ALL_ELEMENTS, 'c'): {'other': 3},
- })
-
- new_metadata = {
- (base.ALL_ELEMENTS, 0): {'foo': 'bar1'},
- (0, 1): {'foo': 'bar2'},
- (1, 1): {'foo': 'bar2'},
- (2, 1): {'foo': 'bar2'},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, 0): {'foo': 'bar1'},
- (base.ALL_ELEMENTS, 1): {'foo': 'bar2'},
- })
-
- new_metadata = {
- ('deep1', 'a'): {'foo': 'bar', 'other': 1},
- ('deep1', 'b'): {'foo': 'bar2', 'other': 2},
- ('deep2', 'a'): {'foo': 'bar', 'other': 3},
- ('deep2', 'b'): {'foo': 'bar2', 'other': 4},
- ('deep3', 'a'): {'foo': 'bar', 'other': 5},
- ('deep3', 'b'): {'foo': 'bar2', 'other': 6},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, 'a'): {'foo': 'bar'},
- (base.ALL_ELEMENTS, 'b'): {'foo': 'bar2'},
- ('deep1', 'a'): {'other': 1},
- ('deep1', 'b'): {'other': 2},
- ('deep2', 'a'): {'other': 3},
- ('deep2', 'b'): {'other': 4},
- ('deep3', 'a'): {'other': 5},
- ('deep3', 'b'): {'other': 6},
- })
-
- new_metadata = {
- ('deep1', 'a'): {'foo': 'bar', 'other': 1},
- ('deep1', 'b'): {'foo': 'bar', 'other': 2},
- ('deep2', 'c'): {'foo': 'bar', 'other': 3},
- ('deep2', 'd'): {'foo': 'bar', 'other': 4},
- ('deep3', 'e'): {'foo': 'bar', 'other': 5},
- ('deep3', 'f'): {'foo': 'bar', 'other': 6},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS): {'foo': 'bar'},
- (base.ALL_ELEMENTS, 'a'): {'other': 1},
- (base.ALL_ELEMENTS, 'b'): {'other': 2},
- (base.ALL_ELEMENTS, 'c'): {'other': 3},
- (base.ALL_ELEMENTS, 'd'): {'other': 4},
- (base.ALL_ELEMENTS, 'e'): {'other': 5},
- (base.ALL_ELEMENTS, 'f'): {'other': 6},
- })
-
- new_metadata = {
- ('deep1', 'a', 1): {'foo': 'bar1', 'other': 1},
- ('deep2', 'a', 2): {'foo': 'bar1', 'other': 2},
- ('deep3', 'a', 3): {'foo': 'bar1', 'other': 3},
- ('deep4', 'a', 4): {'foo': 'bar1', 'other': 4},
- ('deep1', 'b', 1): {'foo': 'bar2', 'other': 5},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 2): {'other': 2},
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 3): {'other': 3},
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 4): {'other': 4},
- (base.ALL_ELEMENTS, 'a', base.ALL_ELEMENTS): {'foo': 'bar1'},
- (base.ALL_ELEMENTS, 'a', 1): {'other': 1},
- (base.ALL_ELEMENTS, 'b', base.ALL_ELEMENTS): {'foo': 'bar2', 'other': 5},
- })
-
- new_metadata = {
- ('deep', 'a', 1): {'foo': 'bar1', 'other': 1},
- ('deep', 'a', 2): {'foo': 'bar1', 'other': 2},
- ('deep', 'b', 1): {'foo': 'bar2', 'other': 3},
- ('deep', 'b', 2): {'foo': 'bar2', 'other': 4},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, 'a', base.ALL_ELEMENTS): {'foo': 'bar1'},
- (base.ALL_ELEMENTS, 'a', 1): {'other': 1},
- (base.ALL_ELEMENTS, 'a', 2): {'other': 2},
- (base.ALL_ELEMENTS, 'b', base.ALL_ELEMENTS): {'foo': 'bar2'},
- (base.ALL_ELEMENTS, 'b', 1): {'other': 3},
- (base.ALL_ELEMENTS, 'b', 2): {'other': 4},
- })
-
- new_metadata = {
- ('deep', 'a', 1): {'foo': 'bar1', 'other': 'bar1'},
- ('deep', 'a', 2): {'foo': 'bar1', 'other': 'bar2'},
- ('deep', 'b', 1): {'foo': 'bar2', 'other': 'bar1'},
- ('deep', 'b', 2): {'foo': 'bar2', 'other': 'bar2'},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 1): {'other': 'bar1'},
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 2): {'other': 'bar2'},
- (base.ALL_ELEMENTS, 'a', base.ALL_ELEMENTS): {'foo': 'bar1'},
- (base.ALL_ELEMENTS, 'b', base.ALL_ELEMENTS): {'foo': 'bar2'},
- })
-
- new_metadata = {
- ('deep1', 'a', 1): {'foo': 'bar1', 'other': 1},
- ('deep1', 'a', 2): {'foo': 'bar1', 'other': 2},
- ('deep2', 'a', 3): {'foo': 'bar1', 'other': 3},
- ('deep2', 'a', 4): {'foo': 'bar1', 'other': 4},
- ('deep1', 'b', 1): {'foo': 'bar2', 'other': 1},
- ('deep1', 'b', 2): {'foo': 'bar2', 'other': 2},
- ('deep2', 'b', 3): {'foo': 'bar2', 'other': 3},
- ('deep2', 'b', 4): {'foo': 'bar2', 'other': 4},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 1): {'other': 1},
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 2): {'other': 2},
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 3): {'other': 3},
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 4): {'other': 4},
- (base.ALL_ELEMENTS, 'a', base.ALL_ELEMENTS): {'foo': 'bar1'},
- (base.ALL_ELEMENTS, 'b', base.ALL_ELEMENTS): {'foo': 'bar2'},
- })
-
- new_metadata = {
- ('deep', 'a'): {'foo': 'bar', 'other': 1},
- ('deep', 'b'): {'foo': 'bar', 'other': 2},
- ('deep2', 'b'): {'other': 3},
- ('deep2', 'c'): {'foo': 'bar', 'other': 4},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, 'a'): {'other': 1},
- (base.ALL_ELEMENTS, 'c'): {'foo': 'bar', 'other': 4},
- ('deep',base.ALL_ELEMENTS): {'foo': 'bar'},
- ('deep', 'b'): {'other': 2},
- ('deep2', 'b'): {'other': 3},
- })
-
- new_metadata = {
- ('deep', 'a'): {'foo': 'bar', 'other': 1},
- ('deep', 'b'): {'foo': 'bar', 'other': 2},
- ('deep', 'c'): {'other': 3},
- ('deep2', 'd'): {'foo': 'bar', 'other': 4},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, 'a'): {'foo': 'bar', 'other': 1},
- (base.ALL_ELEMENTS, 'b'): {'foo': 'bar', 'other': 2},
- (base.ALL_ELEMENTS, 'c'): {'other': 3},
- (base.ALL_ELEMENTS, 'd'): {'foo':'bar', 'other': 4},
- })
-
- new_metadata = {
- (base.ALL_ELEMENTS, 0): {'structural_type': 'numpy.int64'},
- (0, 1): {'structural_type': 'str'},
- (1, 1): {'structural_type': 'str'},
- (2, 1): {'structural_type': 'str'},
- (base.ALL_ELEMENTS, 1): {'name': 'B'},
- (0, 0): {'structural_type': 'numpy.int64'},
- (1, 0): {'structural_type': 'numpy.int64'},
- (2, 0): {'structural_type': 'numpy.int64'},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, 0): {'structural_type': 'numpy.int64'},
- (base.ALL_ELEMENTS, 1): {'name': 'B', 'structural_type': 'str'},
- })
-
- new_metadata = {
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 0): {'structural_type': 'numpy.int64'},
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 1): {'structural_type': 'str'},
- ('0', base.ALL_ELEMENTS, 0): {'name': 'A', 'structural_type': 'numpy.int64'},
- ('0', base.ALL_ELEMENTS, 1): {'name': 'B', 'structural_type': 'str'},
- }
-
- compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
-
- self.assertEqual(compacted_metadata, {
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 0): {'structural_type': 'numpy.int64', 'name': 'A'},
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 1): {'structural_type': 'str', 'name': 'B'},
- })
-
- def test_greedy_prune_metadata(self):
- # Warmup test 1.
- selectors_to_compact = [('a',), ('b',),('c',)]
- compacted_selector = [(base.ALL_ELEMENTS, )]
-
- pruned_selectors = base.DataMetadata._greedy_prune_selector(compacted_selector, selectors_to_compact)
-
- self.assertEqual(pruned_selectors, [
- (base.ALL_ELEMENTS, )
- ])
-
- # Warmup test 2.
- selectors_to_compact = [('deep', 'a'), ('deep', 'b'), ('deep', 'c'), ('deep2', 'd')]
- compacted_selector = [(base.ALL_ELEMENTS, base.ALL_ELEMENTS,)]
-
- pruned_selectors = base.DataMetadata._greedy_prune_selector(compacted_selector, selectors_to_compact)
-
- self.assertEqual(pruned_selectors, [
- (base.ALL_ELEMENTS, base.ALL_ELEMENTS,)
- ])
-
- # Check if it can remove unnecessary outputs.
- selectors_to_compact = [('deep', 'a'), ('deep', 'b'), ('deep2', 'a'), ('deep2', 'b')]
- compacted_selector = [(base.ALL_ELEMENTS, 'a'), (base.ALL_ELEMENTS, 'b'), ('deep', 'a'), ('deep2', 'b')]
-
- pruned_selectors = base.DataMetadata._greedy_prune_selector(compacted_selector, selectors_to_compact)
-
- self.assertEqual(pruned_selectors, [
- (base.ALL_ELEMENTS, 'a'), (base.ALL_ELEMENTS, 'b')
- ])
-
- # Case when compacted_selector overlaps.
- selectors_to_compact = [('a', 'deep'), ('b', 'deep'), ('a', 'deep2'), ('b', 'deep2')]
- compacted_selector = [('a', base.ALL_ELEMENTS), ('b', base.ALL_ELEMENTS), (base.ALL_ELEMENTS, 'deep2')]
-
- pruned_selectors = base.DataMetadata._greedy_prune_selector(compacted_selector, selectors_to_compact)
-
- self.assertEqual(pruned_selectors, [
- ('a', base.ALL_ELEMENTS), ('b', base.ALL_ELEMENTS)
- ])
-
- # Check the order.
- selectors_to_compact = [('a', 'deep'), ('b', 'deep'), ('a', 'deep2'), ('b', 'deep2')]
- compacted_selector = [(base.ALL_ELEMENTS, 'deep2'), ('a', base.ALL_ELEMENTS), ('b', base.ALL_ELEMENTS),]
-
- pruned_selectors = base.DataMetadata._greedy_prune_selector(compacted_selector, selectors_to_compact)
-
- self.assertEqual(pruned_selectors, [
- ('a', base.ALL_ELEMENTS), ('b', base.ALL_ELEMENTS)
- ])
-
- # More complex compacted_selectors.
- selectors_to_compact = [('a', 'deep'), ('b', 'deep'), ('a', 'deep2'), ('b', 'deep2')]
- compacted_selector = [(base.ALL_ELEMENTS, 'deep2'), ('a', base.ALL_ELEMENTS),
- (base.ALL_ELEMENTS, 'deep'), ('b', base.ALL_ELEMENTS),]
-
- pruned_selectors = base.DataMetadata._greedy_prune_selector(compacted_selector, selectors_to_compact)
-
- self.assertEqual(pruned_selectors, [
- (base.ALL_ELEMENTS, 'deep2'), (base.ALL_ELEMENTS, 'deep')
- ])
-
- # All-elements in selectors_to_compact.
- selectors_to_compact = [('deep', 'a', 1), ('deep', base.ALL_ELEMENTS, 2)]
- compacted_selector = [(base.ALL_ELEMENTS, 'a', base.ALL_ELEMENTS), ('deep', base.ALL_ELEMENTS, 2)]
-
- pruned_selectors = base.DataMetadata._greedy_prune_selector(compacted_selector, selectors_to_compact)
-
- self.assertEqual(pruned_selectors, [
- (base.ALL_ELEMENTS, 'a', base.ALL_ELEMENTS), ('deep', base.ALL_ELEMENTS, 2)
- ])
-
- def test_semantic_types_merge(self):
- metadata = base.DataMetadata().update(('0',), {
- 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/DatasetEntryPoint'],
- })
-
- metadata_regular = metadata.update((base.ALL_ELEMENTS,), {
- 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/Table'],
- })
-
- self.assertEqual(metadata_regular.query(('0',)).get('semantic_types', None), ('https://metadata.datadrivendiscovery.org/types/Table',))
-
- metadata._update_with_generated_metadata({
- (base.ALL_ELEMENTS,): {
- 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/Table'],
- },
- })
-
- self.assertEqual(metadata.query(('0',)).get('semantic_types', None), ('https://metadata.datadrivendiscovery.org/types/DatasetEntryPoint', 'https://metadata.datadrivendiscovery.org/types/Table',))
-
- def test_compact(self):
- md = base.Metadata().update(('0',), {
- 'key': 'value',
- })
- md = md.update(('1',), {
- 'key': 'value',
- })
-
- md = md.compact(['key'])
-
- self.assertEqual(md.to_internal_json_structure(), [{
- 'selector': ['__ALL_ELEMENTS__'],
- 'metadata': {'key': 'value'},
- }])
-
- md = base.Metadata().update(('0',), {
- 'key': 'value',
- })
- md = md.update(('1',), {
- 'key': 'value',
- })
- md = md.update(('2',), {
- 'key': 'value2',
- })
-
- md = md.compact(['key'])
-
- self.assertEqual(md.to_internal_json_structure(), [{
- 'selector': ['0'],
- 'metadata': {'key': 'value'},
- }, {
- 'selector': ['1'],
- 'metadata': {'key': 'value'},
- }, {
- 'selector': ['2'],
- 'metadata': {'key': 'value2'},
- }])
-
- md = base.Metadata().update(('0',), {
- 'key': 'value',
- 'key2': 'value',
- })
- md = md.update(('1',), {
- 'key': 'value',
- 'key2': 'value',
- })
-
- md = md.compact(['key'])
-
- self.assertEqual(md.to_internal_json_structure(), [{
- 'selector': ['__ALL_ELEMENTS__'],
- 'metadata': {'key': 'value'},
- }, {
- 'selector': ['0'],
- 'metadata': {'key2': 'value'},
- }, {
- 'selector': ['1'],
- 'metadata': {'key2': 'value'},
- }])
-
-
- if __name__ == '__main__':
- unittest.main()
|