You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_metadata.py 84 kB

first commit Former-commit-id: 08bc23ba02cffbce3cf63962390a65459a132e48 [formerly 0795edd4834b9b7dc66db8d10d4cbaf42bbf82cb] [formerly b5010b42541add7e2ea2578bf2da537efc457757 [formerly a7ca09c2c34c4fc8b3d8e01fcfa08eeeb2cae99d]] [formerly 615058473a2177ca5b89e9edbb797f4c2a59c7e5 [formerly 743d8dfc6843c4c205051a8ab309fbb2116c895e] [formerly bb0ea98b1e14154ef464e2f7a16738705894e54b [formerly 960a69da74b81ef8093820e003f2d6c59a34974c]]] [formerly 2fa3be52c1b44665bc81a7cc7d4cea4bbf0d91d5 [formerly 2054589f0898627e0a17132fd9d4cc78efc91867] [formerly 3b53730e8a895e803dfdd6ca72bc05e17a4164c1 [formerly 8a2fa8ab7baf6686d21af1f322df46fd58c60e69]] [formerly 87d1e3a07a19d03c7d7c94d93ab4fa9f58dada7c [formerly f331916385a5afac1234854ee8d7f160f34b668f] [formerly 69fb3c78a483343f5071da4f7e2891b83a49dd18 [formerly 386086f05aa9487f65bce2ee54438acbdce57650]]]] Former-commit-id: a00aed8c934a6460c4d9ac902b9a74a3d6864697 [formerly 26fdeca29c2f07916d837883983ca2982056c78e] [formerly 0e3170d41a2f99ecf5c918183d361d4399d793bf [formerly 3c12ad4c88ac5192e0f5606ac0d88dd5bf8602dc]] [formerly d5894f84f2fd2e77a6913efdc5ae388cf1be0495 [formerly ad3e7bc670ff92c992730d29c9d3aa1598d844e8] [formerly 69fb3c78a483343f5071da4f7e2891b83a49dd18]] Former-commit-id: 3c19c9fae64f6106415fbc948a4dc613b9ee12f8 [formerly 467ddc0549c74bb007e8f01773bb6dc9103b417d] [formerly 5fa518345d958e2760e443b366883295de6d991c [formerly 3530e130b9fdb7280f638dbc2e785d2165ba82aa]] Former-commit-id: 9f5d473d42a435ec0d60149939d09be1acc25d92 [formerly be0b25c4ec2cde052a041baf0e11f774a158105d] Former-commit-id: 9eca71cb73ba9edccd70ac06a3b636b8d4093b04
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211
  1. import unittest
  2. import jsonschema
  3. import numpy
  4. from d3m import container, utils
  5. from d3m.metadata import base
  6. def copy_elements_metadata(source_metadata, target_metadata, from_selector, to_selector=(), *, ignore_all_elements=False):
  7. return source_metadata._copy_elements_metadata(target_metadata, list(from_selector), list(to_selector), [], ignore_all_elements)
  8. class TestMetadata(unittest.TestCase):
  9. def test_basic(self):
  10. md1 = base.Metadata({'value': 'test'})
  11. self.assertEqual(md1.query(()), {'value': 'test'})
  12. self.assertEqual(md1.query(('foo',)), {})
  13. self.assertEqual(md1.query(('bar',)), {})
  14. md2 = md1.update((), {'value2': 'test2'})
  15. self.assertEqual(md1.query(()), {'value': 'test'})
  16. self.assertEqual(md1.query(('foo',)), {})
  17. self.assertEqual(md1.query(('bar',)), {})
  18. self.assertEqual(md2.query(()), {'value': 'test', 'value2': 'test2'})
  19. md3 = md2.update(('foo',), {'element': 'one'})
  20. self.assertEqual(md1.query(()), {'value': 'test'})
  21. self.assertEqual(md1.query(('foo',)), {})
  22. self.assertEqual(md1.query(('bar',)), {})
  23. self.assertEqual(md2.query(()), {'value': 'test', 'value2': 'test2'})
  24. self.assertEqual(md3.query(()), {'value': 'test', 'value2': 'test2'})
  25. self.assertEqual(md3.query(('foo',)), {'element': 'one'})
  26. md4 = md3.update((base.ALL_ELEMENTS,), {'element': 'two'})
  27. self.assertEqual(md1.query(()), {'value': 'test'})
  28. self.assertEqual(md1.query(('foo',)), {})
  29. self.assertEqual(md1.query(('bar',)), {})
  30. self.assertEqual(md2.query(()), {'value': 'test', 'value2': 'test2'})
  31. self.assertEqual(md3.query(()), {'value': 'test', 'value2': 'test2'})
  32. self.assertEqual(md3.query(('foo',)), {'element': 'one'})
  33. self.assertEqual(md4.query(()), {'value': 'test', 'value2': 'test2'})
  34. self.assertEqual(md4.query((base.ALL_ELEMENTS,)), {'element': 'two'})
  35. self.assertEqual(md4.query(('foo',)), {'element': 'two'})
  36. md5 = md4.update(('foo',), {'element': 'three'})
  37. self.assertEqual(md1.query(()), {'value': 'test'})
  38. self.assertEqual(md1.query(('foo',)), {})
  39. self.assertEqual(md1.query(('bar',)), {})
  40. self.assertEqual(md2.query(()), {'value': 'test', 'value2': 'test2'})
  41. self.assertEqual(md3.query(()), {'value': 'test', 'value2': 'test2'})
  42. self.assertEqual(md3.query(('foo',)), {'element': 'one'})
  43. self.assertEqual(md4.query(()), {'value': 'test', 'value2': 'test2'})
  44. self.assertEqual(md4.query((base.ALL_ELEMENTS,)), {'element': 'two'})
  45. self.assertEqual(md4.query(('foo',)), {'element': 'two'})
  46. self.assertEqual(md5.query(()), {'value': 'test', 'value2': 'test2'})
  47. self.assertEqual(md5.query((base.ALL_ELEMENTS,)), {'element': 'two'})
  48. self.assertEqual(md5.query(('foo',)), {'element': 'three'})
  49. def test_all_elements(self):
  50. md1 = base.Metadata()
  51. md2 = md1.update((base.ALL_ELEMENTS, 'bar'), {'value': 'test1'})
  52. self.assertEqual(md2.query(('foo', 'bar')), {'value': 'test1'})
  53. md3 = md2.update(('foo', 'bar'), {'value': 'test2'})
  54. self.assertEqual(md2.query(('foo', 'bar')), {'value': 'test1'})
  55. self.assertEqual(md3.query(('foo', 'bar')), {'value': 'test2'})
  56. md4 = md3.update((base.ALL_ELEMENTS, 'bar'), {'value': 'test3'})
  57. self.assertEqual(md2.query(('foo', 'bar')), {'value': 'test1'})
  58. self.assertEqual(md3.query(('foo', 'bar')), {'value': 'test2'})
  59. self.assertEqual(md4.query(('foo', 'bar')), {'value': 'test3'})
  60. md5 = md4.update(('foo', base.ALL_ELEMENTS), {'value': 'test4'})
  61. self.assertEqual(md2.query(('foo', 'bar')), {'value': 'test1'})
  62. self.assertEqual(md3.query(('foo', 'bar')), {'value': 'test2'})
  63. self.assertEqual(md4.query(('foo', 'bar')), {'value': 'test3'})
  64. self.assertEqual(md5.query(('foo', 'bar')), {'value': 'test4'})
  65. md6 = md5.update(('foo', 'bar'), {'value': 'test5'})
  66. self.assertEqual(md2.query(('foo', 'bar')), {'value': 'test1'})
  67. self.assertEqual(md3.query(('foo', 'bar')), {'value': 'test2'})
  68. self.assertEqual(md4.query(('foo', 'bar')), {'value': 'test3'})
  69. self.assertEqual(md5.query(('foo', 'bar')), {'value': 'test4'})
  70. self.assertEqual(md6.query(('foo', 'bar')), {'value': 'test5'})
  71. md7 = md6.update((base.ALL_ELEMENTS, base.ALL_ELEMENTS), {'value': 'test6'})
  72. self.assertEqual(md2.query(('foo', 'bar')), {'value': 'test1'})
  73. self.assertEqual(md3.query(('foo', 'bar')), {'value': 'test2'})
  74. self.assertEqual(md4.query(('foo', 'bar')), {'value': 'test3'})
  75. self.assertEqual(md5.query(('foo', 'bar')), {'value': 'test4'})
  76. self.assertEqual(md6.query(('foo', 'bar')), {'value': 'test5'})
  77. self.assertEqual(md7.query(('foo', 'bar')), {'value': 'test6'})
  78. md8 = md7.update(('foo', 'bar'), {'value': 'test7'})
  79. self.assertEqual(md2.query(('foo', 'bar')), {'value': 'test1'})
  80. self.assertEqual(md3.query(('foo', 'bar')), {'value': 'test2'})
  81. self.assertEqual(md4.query(('foo', 'bar')), {'value': 'test3'})
  82. self.assertEqual(md5.query(('foo', 'bar')), {'value': 'test4'})
  83. self.assertEqual(md6.query(('foo', 'bar')), {'value': 'test5'})
  84. self.assertEqual(md7.query(('foo', 'bar')), {'value': 'test6'})
  85. self.assertEqual(md8.query(('foo', 'bar')), {'value': 'test7'})
  86. self.assertEqual(md8.to_internal_json_structure(), [{
  87. 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
  88. 'metadata': {
  89. 'value': 'test6'
  90. }
  91. }, {
  92. 'selector': ['foo', 'bar'],
  93. 'metadata': {
  94. 'value': 'test7'
  95. }
  96. }])
  97. def test_removal(self):
  98. md1 = base.Metadata().update((), {'value': 'test1'})
  99. self.assertEqual(md1.query(()), {'value': 'test1'})
  100. md2 = md1.update((), {'value': base.NO_VALUE})
  101. self.assertEqual(md1.query(()), {'value': 'test1'})
  102. self.assertEqual(md2.query(()), {})
  103. self.assertEqual(md2.query((), ignore_all_elements=True), {})
  104. md3 = md2.update((), {'value': {'value2': 'test2'}})
  105. self.assertEqual(md1.query(()), {'value': 'test1'})
  106. self.assertEqual(md2.query(()), {})
  107. self.assertEqual(md3.query(()), {'value': {'value2': 'test2'}})
  108. md4 = md3.update((), {'value': {'value2': base.NO_VALUE}})
  109. self.assertEqual(md1.query(()), {'value': 'test1'})
  110. self.assertEqual(md2.query(()), {})
  111. self.assertEqual(md3.query(()), {'value': {'value2': 'test2'}})
  112. self.assertEqual(md4.query(()), {})
  113. md5 = md4.update((), {'value': base.NO_VALUE})
  114. self.assertEqual(md1.query(()), {'value': 'test1'})
  115. self.assertEqual(md2.query(()), {})
  116. self.assertEqual(md3.query(()), {'value': {'value2': 'test2'}})
  117. self.assertEqual(md4.query(()), {})
  118. self.assertEqual(md5.query(()), {})
  119. def test_empty_dict(self):
  120. md = base.Metadata().update((), {'value': {}})
  121. self.assertEqual(md.query(()), {'value': {}})
  122. md = md.update((), {'value': {'a': '1', 'b': 2}})
  123. self.assertEqual(md.query(()), {'value': {'a': '1', 'b': 2}})
  124. md = md.update((), {'value': {'a': base.NO_VALUE, 'b': base.NO_VALUE}})
  125. self.assertEqual(md.query(()), {})
  126. md = md.update((), {'value': {'a': '1', 'b': 2}})
  127. self.assertEqual(md.query(()), {'value': {'a': '1', 'b': 2}})
  128. md = md.update((), {'value': {'a': base.NO_VALUE}})
  129. self.assertEqual(md.query(()), {'value': {'b': 2}})
  130. def test_remove(self):
  131. metadata = base.Metadata().update((), {'value': 'test1'})
  132. metadata = metadata.update(('a',), {'value': 'test2'})
  133. metadata = metadata.update(('a', 'b'), {'value': 'test3'})
  134. metadata = metadata.update(('a', 'b', 'c'), {'value': 'test4'})
  135. metadata = metadata.update((base.ALL_ELEMENTS, 'b', 'd'), {'value': 'test5'})
  136. metadata = metadata.update((base.ALL_ELEMENTS, 'b', 'e', base.ALL_ELEMENTS), {'value': 'test6'})
  137. self.assertEqual(utils.to_json_structure(metadata.to_internal_simple_structure()), [
  138. {
  139. 'selector': [],
  140. 'metadata': {
  141. 'value': 'test1',
  142. }
  143. },
  144. {
  145. 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
  146. 'metadata': {
  147. 'value': 'test5',
  148. },
  149. },
  150. {
  151. 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
  152. 'metadata': {
  153. 'value': 'test6',
  154. },
  155. },
  156. {
  157. 'selector': ['a'],
  158. 'metadata': {
  159. 'value': 'test2',
  160. },
  161. },
  162. {
  163. 'selector': ['a', 'b'],
  164. 'metadata': {
  165. 'value': 'test3',
  166. },
  167. },
  168. {
  169. 'selector': ['a', 'b', 'c'],
  170. 'metadata': {
  171. 'value': 'test4',
  172. },
  173. },
  174. ])
  175. new_metadata = metadata.remove(('a', 'b'))
  176. self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
  177. {
  178. 'selector': [],
  179. 'metadata': {
  180. 'value': 'test1',
  181. },
  182. },
  183. {
  184. 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
  185. 'metadata': {
  186. 'value': 'test5',
  187. },
  188. },
  189. {
  190. 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
  191. 'metadata': {
  192. 'value': 'test6',
  193. },
  194. },
  195. {
  196. 'selector': ['a'],
  197. 'metadata': {
  198. 'value': 'test2',
  199. },
  200. },
  201. {
  202. 'selector': ['a', 'b', 'c'],
  203. 'metadata': {
  204. 'value': 'test4',
  205. },
  206. },
  207. ])
  208. new_metadata = metadata.remove(('a', 'b'), recursive=True)
  209. self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
  210. {
  211. 'selector': [],
  212. 'metadata': {
  213. 'value': 'test1',
  214. },
  215. },
  216. {
  217. 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
  218. 'metadata': {
  219. 'value': 'test5',
  220. },
  221. },
  222. {
  223. 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
  224. 'metadata': {
  225. 'value': 'test6',
  226. },
  227. },
  228. {
  229. 'selector': ['a'],
  230. 'metadata': {
  231. 'value': 'test2',
  232. },
  233. },
  234. ])
  235. new_metadata = metadata.remove((), recursive=True)
  236. self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [])
  237. new_metadata = metadata.remove((base.ALL_ELEMENTS, 'b'))
  238. self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
  239. {
  240. 'selector': [],
  241. 'metadata': {
  242. 'value': 'test1',
  243. }
  244. },
  245. {
  246. 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
  247. 'metadata': {
  248. 'value': 'test5',
  249. },
  250. },
  251. {
  252. 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
  253. 'metadata': {
  254. 'value': 'test6',
  255. },
  256. },
  257. {
  258. 'selector': ['a'],
  259. 'metadata': {
  260. 'value': 'test2',
  261. },
  262. },
  263. {
  264. 'selector': ['a', 'b', 'c'],
  265. 'metadata': {
  266. 'value': 'test4',
  267. },
  268. },
  269. ])
  270. new_metadata = metadata.remove((base.ALL_ELEMENTS, 'b'), recursive=True)
  271. self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
  272. {
  273. 'selector': [],
  274. 'metadata': {
  275. 'value': 'test1',
  276. }
  277. },
  278. {
  279. 'selector': ['a'],
  280. 'metadata': {
  281. 'value': 'test2',
  282. },
  283. },
  284. ])
  285. new_metadata = metadata.remove((base.ALL_ELEMENTS, 'b'), strict_all_elements=True)
  286. self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
  287. {
  288. 'selector': [],
  289. 'metadata': {
  290. 'value': 'test1',
  291. }
  292. },
  293. {
  294. 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
  295. 'metadata': {
  296. 'value': 'test5',
  297. },
  298. },
  299. {
  300. 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
  301. 'metadata': {
  302. 'value': 'test6',
  303. },
  304. },
  305. {
  306. 'selector': ['a'],
  307. 'metadata': {
  308. 'value': 'test2',
  309. },
  310. },
  311. {
  312. 'selector': ['a', 'b'],
  313. 'metadata': {
  314. 'value': 'test3',
  315. },
  316. },
  317. {
  318. 'selector': ['a', 'b', 'c'],
  319. 'metadata': {
  320. 'value': 'test4',
  321. },
  322. },
  323. ])
  324. new_metadata = metadata.remove((base.ALL_ELEMENTS, 'b'), recursive=True, strict_all_elements=True)
  325. self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
  326. {
  327. 'selector': [],
  328. 'metadata': {
  329. 'value': 'test1',
  330. }
  331. },
  332. {
  333. 'selector': ['a'],
  334. 'metadata': {
  335. 'value': 'test2',
  336. },
  337. },
  338. {
  339. 'selector': ['a', 'b'],
  340. 'metadata': {
  341. 'value': 'test3',
  342. },
  343. },
  344. {
  345. 'selector': ['a', 'b', 'c'],
  346. 'metadata': {
  347. 'value': 'test4',
  348. },
  349. },
  350. ])
  351. new_metadata = metadata.remove(('a', base.ALL_ELEMENTS))
  352. self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
  353. {
  354. 'selector': [],
  355. 'metadata': {
  356. 'value': 'test1',
  357. }
  358. },
  359. {
  360. 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
  361. 'metadata': {
  362. 'value': 'test5',
  363. },
  364. },
  365. {
  366. 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
  367. 'metadata': {
  368. 'value': 'test6',
  369. },
  370. },
  371. {
  372. 'selector': ['a'],
  373. 'metadata': {
  374. 'value': 'test2',
  375. },
  376. },
  377. {
  378. 'selector': ['a', 'b', 'c'],
  379. 'metadata': {
  380. 'value': 'test4',
  381. },
  382. },
  383. ])
  384. new_metadata = metadata.remove(('a', base.ALL_ELEMENTS), strict_all_elements=True)
  385. self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
  386. {
  387. 'selector': [],
  388. 'metadata': {
  389. 'value': 'test1',
  390. }
  391. },
  392. {
  393. 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
  394. 'metadata': {
  395. 'value': 'test5',
  396. },
  397. },
  398. {
  399. 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
  400. 'metadata': {
  401. 'value': 'test6',
  402. },
  403. },
  404. {
  405. 'selector': ['a'],
  406. 'metadata': {
  407. 'value': 'test2',
  408. },
  409. },
  410. {
  411. 'selector': ['a', 'b'],
  412. 'metadata': {
  413. 'value': 'test3',
  414. },
  415. },
  416. {
  417. 'selector': ['a', 'b', 'c'],
  418. 'metadata': {
  419. 'value': 'test4',
  420. },
  421. },
  422. ])
  423. new_metadata = metadata.remove(('a', base.ALL_ELEMENTS), recursive=True)
  424. self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
  425. {
  426. 'selector': [],
  427. 'metadata': {
  428. 'value': 'test1',
  429. }
  430. },
  431. {
  432. 'selector': ['__ALL_ELEMENTS__', 'b', 'd'],
  433. 'metadata': {
  434. 'value': 'test5',
  435. },
  436. },
  437. {
  438. 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
  439. 'metadata': {
  440. 'value': 'test6',
  441. },
  442. },
  443. {
  444. 'selector': ['a'],
  445. 'metadata': {
  446. 'value': 'test2',
  447. },
  448. },
  449. ])
  450. new_metadata = metadata.remove((base.ALL_ELEMENTS, 'b', base.ALL_ELEMENTS))
  451. self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
  452. {
  453. 'selector': [],
  454. 'metadata': {
  455. 'value': 'test1',
  456. }
  457. },
  458. {
  459. 'selector': ['__ALL_ELEMENTS__', 'b', 'e', '__ALL_ELEMENTS__'],
  460. 'metadata': {
  461. 'value': 'test6',
  462. },
  463. },
  464. {
  465. 'selector': ['a'],
  466. 'metadata': {
  467. 'value': 'test2',
  468. },
  469. },
  470. {
  471. 'selector': ['a', 'b'],
  472. 'metadata': {
  473. 'value': 'test3',
  474. },
  475. },
  476. ])
  477. new_metadata = metadata.remove((base.ALL_ELEMENTS, 'b', base.ALL_ELEMENTS), recursive=True)
  478. self.assertEqual(utils.to_json_structure(new_metadata.to_internal_simple_structure()), [
  479. {
  480. 'selector': [],
  481. 'metadata': {
  482. 'value': 'test1',
  483. }
  484. },
  485. {
  486. 'selector': ['a'],
  487. 'metadata': {
  488. 'value': 'test2',
  489. },
  490. },
  491. {
  492. 'selector': ['a', 'b'],
  493. 'metadata': {
  494. 'value': 'test3',
  495. },
  496. },
  497. ])
  498. def test_remove_column(self):
  499. metadata = base.DataMetadata().update((base.ALL_ELEMENTS, 0), {'name': 'column1'})
  500. metadata = metadata.update((base.ALL_ELEMENTS, 1), {'name': 'column2'})
  501. metadata = metadata.update((10, 0), {'value': 'row10.0'})
  502. metadata = metadata.update((10, 1), {'value': 'row10.1'})
  503. self.assertEqual(utils.to_json_structure(metadata.to_internal_simple_structure()), [{
  504. 'selector': ['__ALL_ELEMENTS__', 0],
  505. 'metadata': {'name': 'column1'},
  506. }, {
  507. 'selector': ['__ALL_ELEMENTS__', 1],
  508. 'metadata': {'name': 'column2'},
  509. }, {
  510. 'selector': [10, 0],
  511. 'metadata': {'value': 'row10.0'},
  512. }, {
  513. 'selector': [10, 1],
  514. 'metadata': {'value': 'row10.1'},
  515. }])
  516. metadata = metadata.remove_column(0)
  517. self.assertEqual(utils.to_json_structure(metadata.to_internal_simple_structure()), [{
  518. 'selector': ['__ALL_ELEMENTS__', 1],
  519. 'metadata': {'name': 'column2'},
  520. }, {
  521. 'selector': [10, 1],
  522. 'metadata': {'value': 'row10.1'},
  523. }])
  524. def test_check(self):
  525. data = container.Dataset({
  526. '0': container.ndarray(numpy.array([
  527. [1, 2, 3],
  528. [4, 5, 6],
  529. ])),
  530. })
  531. md1 = base.DataMetadata().update((), {
  532. 'schema': base.CONTAINER_SCHEMA_VERSION,
  533. 'structural_type': type(data),
  534. 'value': 'test'
  535. })
  536. md1.check(data)
  537. md2 = md1.update(('missing',), {'value': 'test'})
  538. with self.assertRaisesRegex(ValueError, 'cannot be resolved'):
  539. md2.check(data)
  540. md3 = md1.update(('0', 1), {'value': 'test'})
  541. md4 = md3.update(('0', 2), {'value': 'test'})
  542. with self.assertRaisesRegex(ValueError, 'cannot be resolved'):
  543. md4.check(data)
  544. md5 = md3.update(('0', 1, 3), {'value': 'test'})
  545. with self.assertRaisesRegex(ValueError, 'cannot be resolved'):
  546. md5.check(data)
  547. md6 = md3.update(('0', 1, 2, base.ALL_ELEMENTS), {'value': 'test'})
  548. with self.assertRaisesRegex(ValueError, 'ALL_ELEMENTS set but dimension missing at'):
  549. md6.check(data)
  550. def test_errors(self):
  551. with self.assertRaisesRegex(TypeError, 'Metadata should be a dict'):
  552. base.Metadata().update((), None)
  553. class Custom:
  554. pass
  555. with self.assertRaisesRegex(TypeError, 'is not known to be immutable'):
  556. base.Metadata().update((), {'foo': Custom()})
  557. with self.assertRaisesRegex(TypeError, 'Selector is not a tuple or a list'):
  558. base.Metadata().update({}, {'value': 'test'})
  559. with self.assertRaisesRegex(TypeError, 'is not a str, int, or ALL_ELEMENTS'):
  560. base.Metadata().update((1.0,), {'value': 'test'})
  561. with self.assertRaisesRegex(TypeError, 'is not a str, int, or ALL_ELEMENTS'):
  562. base.Metadata().update((None,), {'value': 'test'})
  563. def test_data(self):
  564. data = container.Dataset({
  565. '0': container.ndarray(numpy.array([
  566. [1, 2, 3],
  567. [4, 5, 6],
  568. ])),
  569. })
  570. md1 = base.DataMetadata()
  571. md1.update((), {'value': 'test'})
  572. with self.assertRaisesRegex(jsonschema.exceptions.ValidationError, 'is a required property'):
  573. md1.check(md1)
  574. md1 = base.DataMetadata().generate(data, compact=True)
  575. md2 = md1.update((), {
  576. 'id': 'test-dataset',
  577. 'schema': base.CONTAINER_SCHEMA_VERSION,
  578. 'structural_type': type(data),
  579. 'dimension': {
  580. 'length': 1
  581. }
  582. })
  583. md3 = md2.update(('0',), {
  584. 'structural_type': type(data['0']),
  585. 'dimension': {
  586. 'length': 2
  587. }
  588. })
  589. self.assertEqual(utils.to_json_structure(md3.to_internal_simple_structure()), [{
  590. 'selector': [],
  591. 'metadata': {
  592. 'id': 'test-dataset',
  593. 'schema': base.CONTAINER_SCHEMA_VERSION,
  594. 'structural_type': 'd3m.container.dataset.Dataset',
  595. 'dimension': {
  596. 'name': 'resources',
  597. 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/DatasetResource'],
  598. 'length': 1
  599. },
  600. },
  601. }, {
  602. 'selector': ['__ALL_ELEMENTS__'],
  603. 'metadata': {
  604. 'dimension': {
  605. 'length': 2,
  606. 'name': 'rows',
  607. 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/TabularRow'],
  608. },
  609. 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/Table'],
  610. 'structural_type': 'd3m.container.numpy.ndarray',
  611. },
  612. }, {
  613. 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
  614. 'metadata': {
  615. 'dimension': {
  616. 'length': 3,
  617. 'name': 'columns',
  618. 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/TabularColumn'],
  619. },
  620. },
  621. }, {
  622. 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
  623. 'metadata': {
  624. 'structural_type': 'numpy.int64',
  625. },
  626. }, {
  627. 'selector': ['0'],
  628. 'metadata': {
  629. 'structural_type': 'd3m.container.numpy.ndarray',
  630. 'dimension': {
  631. 'length': 2,
  632. },
  633. },
  634. }])
  635. md1 = base.DataMetadata().generate(data, compact=False)
  636. md2 = md1.update((), {
  637. 'id': 'test-dataset',
  638. 'schema': base.CONTAINER_SCHEMA_VERSION,
  639. 'structural_type': type(data),
  640. 'dimension': {
  641. 'length': 1
  642. }
  643. })
  644. md3 = md2.update(('0',), {
  645. 'structural_type': type(data['0']),
  646. 'dimension': {
  647. 'length': 2
  648. }
  649. })
  650. self.assertEqual(utils.to_json_structure(md3.to_internal_simple_structure()), [{
  651. 'selector': [],
  652. 'metadata': {
  653. 'id': 'test-dataset',
  654. 'schema': base.CONTAINER_SCHEMA_VERSION,
  655. 'structural_type': 'd3m.container.dataset.Dataset',
  656. 'dimension': {
  657. 'name': 'resources',
  658. 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/DatasetResource'],
  659. 'length': 1
  660. },
  661. },
  662. }, {
  663. 'selector': ['0'],
  664. 'metadata': {
  665. 'dimension': {
  666. 'length': 2,
  667. 'name': 'rows',
  668. 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/TabularRow'],
  669. },
  670. 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/Table'],
  671. 'structural_type': 'd3m.container.numpy.ndarray',
  672. },
  673. }, {
  674. 'selector': ['0', '__ALL_ELEMENTS__'],
  675. 'metadata': {
  676. 'dimension': {
  677. 'length': 3,
  678. 'name': 'columns',
  679. 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/TabularColumn'],
  680. },
  681. },
  682. }, {
  683. 'selector': ['0', '__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
  684. 'metadata': {
  685. 'structural_type': 'numpy.int64',
  686. },
  687. }])
  688. def test_prune_bug(self):
  689. metadata = base.Metadata().update((base.ALL_ELEMENTS, 0), {'foo': 'bar1'})
  690. metadata = metadata.update((0, 1), {'foo': 'bar2'})
  691. metadata = metadata.update((1, 1), {'foo': 'bar2'})
  692. metadata = metadata.update((2, 1), {'foo': 'bar2'})
  693. metadata = metadata.update((base.ALL_ELEMENTS, base.ALL_ELEMENTS), {'foo': 'bar3'})
  694. self.assertEqual(utils.to_json_structure(metadata.to_internal_simple_structure()), [{
  695. 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
  696. 'metadata': {'foo': 'bar3'},
  697. }])
  698. def test_remove_empty_metadata(self):
  699. metadata = base.Metadata().update((base.ALL_ELEMENTS,), {
  700. 'foo': {
  701. 'bar': 42,
  702. },
  703. 'other': 1,
  704. })
  705. metadata = metadata.update((base.ALL_ELEMENTS,), {
  706. 'foo': {
  707. 'bar': base.NO_VALUE,
  708. },
  709. })
  710. self.assertEqual(metadata.query((base.ALL_ELEMENTS,)), {
  711. 'other': 1,
  712. })
  713. metadata = base.Metadata({
  714. 'foo': {
  715. 'bar': 42,
  716. },
  717. 'other': 1,
  718. })
  719. metadata = metadata.update((), {
  720. 'foo': {
  721. 'bar': base.NO_VALUE,
  722. },
  723. })
  724. self.assertEqual(metadata.query(()), {
  725. 'other': 1,
  726. })
  727. metadata = base.Metadata({
  728. 'foo': {
  729. 'bar': 42,
  730. },
  731. })
  732. metadata = metadata.update((), {
  733. 'foo': {
  734. 'bar': base.NO_VALUE,
  735. },
  736. })
  737. self.assertEqual(metadata.query(()), {})
  738. metadata = base.Metadata().update(('a',), {
  739. 'foo': {
  740. 'bar': 42,
  741. },
  742. })
  743. metadata = metadata.update((base.ALL_ELEMENTS,), {
  744. 'foo': {
  745. 'bar': base.NO_VALUE,
  746. },
  747. })
  748. self.assertEqual(metadata.query(('a',)), {})
  749. self.assertEqual(utils.to_json_structure(metadata.to_internal_simple_structure()), [{
  750. 'selector': ['__ALL_ELEMENTS__'],
  751. 'metadata': {
  752. 'foo': {
  753. 'bar': '__NO_VALUE__',
  754. },
  755. },
  756. }])
  757. def test_ignore_all_elements(self):
  758. metadata = base.Metadata().update((base.ALL_ELEMENTS,), {
  759. 'foo': 'bar',
  760. 'other': 42,
  761. })
  762. metadata = metadata.update((0,), {
  763. 'foo': base.NO_VALUE,
  764. })
  765. metadata = metadata.update((2,), {
  766. 'other2': 43,
  767. })
  768. self.assertEqual(metadata.query((0,)), {'other': 42})
  769. self.assertEqual(metadata.query((1,)), {'foo': 'bar', 'other': 42})
  770. self.assertEqual(metadata.query((2,)), {'foo': 'bar', 'other': 42, 'other2': 43})
  771. self.assertEqual(metadata.query((0,), ignore_all_elements=True), {})
  772. self.assertEqual(metadata.query((1,), ignore_all_elements=True), {})
  773. self.assertEqual(metadata.query((2,), ignore_all_elements=True), {'other2': 43})
  774. metadata = metadata.update((base.ALL_ELEMENTS,), {
  775. 'foo': 'bar2',
  776. })
  777. self.assertEqual(metadata.query((0,)), {'foo': 'bar2', 'other': 42})
  778. self.assertEqual(metadata.query((1,)), {'foo': 'bar2', 'other': 42})
  779. self.assertEqual(metadata.query((2,)), {'foo': 'bar2', 'other': 42, 'other2': 43})
  780. self.assertEqual(metadata.query((0,), ignore_all_elements=True), {})
  781. self.assertEqual(metadata.query((1,), ignore_all_elements=True), {})
  782. self.assertEqual(metadata.query((2,), ignore_all_elements=True), {'other2': 43})
  783. def test_query_with_exceptions(self):
  784. metadata = base.Metadata().update((base.ALL_ELEMENTS,), {
  785. 'foo': 'bar',
  786. 'other': 42,
  787. })
  788. metadata = metadata.update((0,), {
  789. 'foo': base.NO_VALUE,
  790. })
  791. metadata = metadata.update((2,), {
  792. 'other2': 43,
  793. })
  794. self.assertEqual(metadata.query((0,)), {'other': 42})
  795. self.assertEqual(metadata.query((1,)), {'foo': 'bar', 'other': 42})
  796. self.assertEqual(metadata.query((2,)), {'foo': 'bar', 'other': 42, 'other2': 43})
  797. self.assertEqual(metadata.query_with_exceptions((0,)), ({'other': 42}, {}))
  798. self.assertEqual(metadata.query_with_exceptions((1,)), ({'foo': 'bar', 'other': 42}, {}))
  799. self.assertEqual(metadata.query_with_exceptions((2,)), ({'foo': 'bar', 'other': 42, 'other2': 43}, {}))
  800. self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS,)), ({
  801. 'foo': 'bar',
  802. 'other': 42,
  803. }, {
  804. (0,): {'other': 42},
  805. (2,): {'foo': 'bar', 'other': 42, 'other2': 43},
  806. }))
  807. metadata = metadata.update((base.ALL_ELEMENTS,), {
  808. 'foo': 'bar2',
  809. })
  810. self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS,)), ({
  811. 'foo': 'bar2',
  812. 'other': 42,
  813. }, {
  814. (2,): {'foo': 'bar2', 'other': 42, 'other2': 43},
  815. }))
  816. metadata = base.Metadata().update((base.ALL_ELEMENTS, 0), {
  817. 'name': 'bar',
  818. })
  819. metadata = metadata.update((base.ALL_ELEMENTS, 1), {
  820. 'name': 'foo',
  821. })
  822. metadata = metadata.update((2, 0), {
  823. 'name': 'bar2',
  824. })
  825. metadata = metadata.update((2, 2), {
  826. 'name': 'foo2',
  827. })
  828. self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS, 0)), ({
  829. 'name': 'bar',
  830. }, {
  831. (2, 0): {'name': 'bar2'},
  832. }))
  833. self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS, 1)), ({
  834. 'name': 'foo',
  835. }, {}))
  836. self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS, 2)), ({}, {
  837. (2, 2): {'name': 'foo2'},
  838. }))
  839. self.assertEqual(metadata.query_with_exceptions((2, base.ALL_ELEMENTS)), ({}, {
  840. (2, 0): {'name': 'bar2'},
  841. (2, 2): {'name': 'foo2'},
  842. }))
  843. metadata = base.Metadata().update((base.ALL_ELEMENTS, base.ALL_ELEMENTS), {
  844. 'foo': 'bar',
  845. 'other': 42,
  846. })
  847. metadata = metadata.update((base.ALL_ELEMENTS, 0), {
  848. 'foo': base.NO_VALUE,
  849. })
  850. metadata = metadata.update((base.ALL_ELEMENTS, 2), {
  851. 'other2': 43,
  852. })
  853. self.assertEqual(metadata.query((base.ALL_ELEMENTS, 0)), {'other': 42})
  854. self.assertEqual(metadata.query((base.ALL_ELEMENTS, 1)), {'foo': 'bar', 'other': 42})
  855. self.assertEqual(metadata.query((base.ALL_ELEMENTS, 2)), {'foo': 'bar', 'other': 42, 'other2': 43})
  856. self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS, 0)), ({'other': 42}, {}))
  857. self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS, 1)), ({'foo': 'bar', 'other': 42}, {}))
  858. self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS, 2)), ({'foo': 'bar', 'other': 42, 'other2': 43}, {}))
  859. self.assertEqual(metadata.query_with_exceptions((base.ALL_ELEMENTS, base.ALL_ELEMENTS)), ({
  860. 'foo': 'bar',
  861. 'other': 42,
  862. }, {
  863. (base.ALL_ELEMENTS, 0): {'other': 42},
  864. (base.ALL_ELEMENTS, 2): {'foo': 'bar', 'other': 42, 'other2': 43},
  865. }))
  866. def test_semantic_types(self):
  867. metadata = base.DataMetadata({
  868. 'structural_type': container.DataFrame,
  869. 'schema': base.CONTAINER_SCHEMA_VERSION,
  870. })
  871. self.assertFalse(metadata.has_semantic_type((), 'https://metadata.datadrivendiscovery.org/types/DatasetResource'))
  872. metadata = metadata.add_semantic_type((), 'https://metadata.datadrivendiscovery.org/types/DatasetResource')
  873. self.assertTrue(metadata.has_semantic_type((), 'https://metadata.datadrivendiscovery.org/types/DatasetResource'))
  874. metadata = metadata.remove_semantic_type((), 'https://metadata.datadrivendiscovery.org/types/DatasetResource')
  875. self.assertFalse(metadata.has_semantic_type((), 'https://metadata.datadrivendiscovery.org/types/DatasetResource'))
  876. metadata = metadata.add_semantic_type((base.ALL_ELEMENTS, 0), 'https://metadata.datadrivendiscovery.org/types/Attribute')
  877. metadata = metadata.add_semantic_type((base.ALL_ELEMENTS, 1), 'https://metadata.datadrivendiscovery.org/types/PrimaryKey')
  878. metadata = metadata.add_semantic_type((base.ALL_ELEMENTS, 2), 'https://metadata.datadrivendiscovery.org/types/Attribute')
  879. self.assertEqual(metadata.get_elements_with_semantic_type((), 'https://metadata.datadrivendiscovery.org/types/Attribute'), [])
  880. self.assertEqual(metadata.get_elements_with_semantic_type((base.ALL_ELEMENTS,), 'https://metadata.datadrivendiscovery.org/types/Attribute'), [0, 2])
  881. def test_copy_elements_metadata(self):
  882. metadata = base.Metadata()
  883. metadata = metadata.update((), {'level0': 'foobar0'})
  884. metadata = metadata.update(('level1',), {'level1': 'foobar1'})
  885. metadata = metadata.update((base.ALL_ELEMENTS,), {'level1a': 'foobar1a', 'level1b': 'foobar1b'})
  886. metadata = metadata.update(('level1',), {'level1b': base.NO_VALUE})
  887. metadata = metadata.update(('level1', 'level2'), {'level2': 'foobar2'})
  888. metadata = metadata.update((base.ALL_ELEMENTS, base.ALL_ELEMENTS), {'level2a': 'foobar2a', 'level2b': 'foobar2b'})
  889. metadata = metadata.update(('level1', 'level2'), {'level2b': base.NO_VALUE})
  890. metadata = metadata.update(('level1', 'level2', 'level3'), {'level3': 'foobar3'})
  891. metadata = metadata.update((base.ALL_ELEMENTS, base.ALL_ELEMENTS, 'level3'), {'level3a': 'foobar3a'})
  892. metadata = metadata.update(('level1', 'level2', 'level3.1'), {'level3.1': 'foobar3.1'})
  893. metadata = metadata.update(('level1', 'level2', 'level3', 'level4'), {'level4': 'foobar4'})
  894. metadata = metadata.update(('level1', 'level2', 'level3', 'level4.1'), {'level4.1': 'foobar4.1'})
  895. self.assertEqual(utils.to_json_structure(metadata.to_internal_simple_structure()), [{
  896. 'selector': [],
  897. 'metadata': {'level0': 'foobar0'},
  898. }, {
  899. 'selector': ['__ALL_ELEMENTS__'],
  900. 'metadata': {'level1a': 'foobar1a', 'level1b': 'foobar1b'},
  901. }, {
  902. 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
  903. 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
  904. }, {
  905. 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__', 'level3'],
  906. 'metadata': {'level3a': 'foobar3a'},
  907. }, {
  908. 'selector': ['level1'],
  909. 'metadata': {'level1': 'foobar1', 'level1b': '__NO_VALUE__'},
  910. }, {
  911. 'selector': ['level1', 'level2'],
  912. 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
  913. }, {
  914. 'selector': ['level1', 'level2', 'level3'],
  915. 'metadata': {'level3': 'foobar3'},
  916. }, {
  917. 'selector': ['level1', 'level2', 'level3', 'level4'],
  918. 'metadata': {'level4': 'foobar4'},
  919. }, {
  920. 'selector': ['level1', 'level2', 'level3', 'level4.1'],
  921. 'metadata': {'level4.1': 'foobar4.1'},
  922. }, {
  923. 'selector': ['level1', 'level2', 'level3.1'],
  924. 'metadata': {'level3.1': 'foobar3.1'},
  925. }])
  926. self.assertEqual(metadata.query(('level1', 'level2')), {
  927. 'level2a': 'foobar2a',
  928. 'level2': 'foobar2',
  929. })
  930. target_metadata = base.DataMetadata({
  931. 'schema': base.CONTAINER_SCHEMA_VERSION,
  932. 'structural_type': container.DataFrame,
  933. })
  934. target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
  935. target_metadata = copy_elements_metadata(metadata, target_metadata, ())
  936. self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
  937. 'selector': [],
  938. 'metadata': {
  939. 'level0z': 'foobar0z',
  940. 'schema': base.CONTAINER_SCHEMA_VERSION,
  941. 'structural_type': 'd3m.container.pandas.DataFrame',
  942. },
  943. }, {
  944. 'selector': ['__ALL_ELEMENTS__'],
  945. 'metadata': {'level1a': 'foobar1a', 'level1b': 'foobar1b'},
  946. }, {
  947. 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
  948. 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
  949. }, {
  950. 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__', 'level3'],
  951. 'metadata': {'level3a': 'foobar3a'},
  952. }, {
  953. 'selector': ['level1'],
  954. 'metadata': {'level1': 'foobar1', 'level1b': '__NO_VALUE__'},
  955. }, {
  956. 'selector': ['level1', 'level2'],
  957. 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
  958. }, {
  959. 'selector': ['level1', 'level2', 'level3'],
  960. 'metadata': {'level3': 'foobar3'},
  961. }, {
  962. 'selector': ['level1', 'level2', 'level3', 'level4'],
  963. 'metadata': {'level4': 'foobar4'},
  964. }, {
  965. 'selector': ['level1', 'level2', 'level3', 'level4.1'],
  966. 'metadata': {'level4.1': 'foobar4.1'},
  967. }, {
  968. 'selector': ['level1', 'level2', 'level3.1'],
  969. 'metadata': {'level3.1': 'foobar3.1'},
  970. }])
  971. self.assertEqual(target_metadata.to_json_structure(), [{
  972. 'selector': [],
  973. 'metadata': {
  974. 'level0z': 'foobar0z',
  975. 'schema': base.CONTAINER_SCHEMA_VERSION,
  976. 'structural_type': 'd3m.container.pandas.DataFrame',
  977. },
  978. }, {
  979. 'selector': ['__ALL_ELEMENTS__'],
  980. 'metadata': {'level1a': 'foobar1a', 'level1b': 'foobar1b'},
  981. }, {
  982. 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
  983. 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
  984. }, {
  985. 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__', 'level3'],
  986. 'metadata': {'level3a': 'foobar3a'},
  987. }, {
  988. 'selector': ['level1'],
  989. 'metadata': {'level1': 'foobar1', 'level1a': 'foobar1a'},
  990. }, {
  991. 'selector': ['level1', '__ALL_ELEMENTS__'],
  992. 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
  993. }, {
  994. 'selector': ['level1', '__ALL_ELEMENTS__', 'level3'],
  995. 'metadata': {'level3a': 'foobar3a'},
  996. }, {
  997. 'selector': ['level1', 'level2'],
  998. 'metadata': {'level2': 'foobar2', 'level2a': 'foobar2a'},
  999. }, {
  1000. 'selector': ['level1', 'level2', 'level3'],
  1001. 'metadata': {'level3': 'foobar3', 'level3a': 'foobar3a'},
  1002. }, {
  1003. 'selector': ['level1', 'level2', 'level3', 'level4'],
  1004. 'metadata': {'level4': 'foobar4'},
  1005. }, {
  1006. 'selector': ['level1', 'level2', 'level3', 'level4.1'],
  1007. 'metadata': {'level4.1': 'foobar4.1'},
  1008. }, {
  1009. 'selector': ['level1', 'level2', 'level3.1'],
  1010. 'metadata': {'level3.1': 'foobar3.1'},
  1011. }])
  1012. target_metadata = base.DataMetadata({
  1013. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1014. 'structural_type': container.DataFrame,
  1015. })
  1016. target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
  1017. target_metadata = copy_elements_metadata(metadata, target_metadata, ('level1',))
  1018. self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
  1019. 'selector': [],
  1020. 'metadata': {
  1021. 'level0z': 'foobar0z',
  1022. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1023. 'structural_type': 'd3m.container.pandas.DataFrame',
  1024. },
  1025. }, {
  1026. 'selector': ['__ALL_ELEMENTS__'],
  1027. 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
  1028. }, {
  1029. 'selector': ['__ALL_ELEMENTS__', 'level3'],
  1030. 'metadata': {'level3a': 'foobar3a'},
  1031. }, {
  1032. 'selector': ['level2'],
  1033. 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
  1034. }, {
  1035. 'selector': ['level2', 'level3'],
  1036. 'metadata': {'level3': 'foobar3'},
  1037. }, {
  1038. 'selector': ['level2', 'level3', 'level4'],
  1039. 'metadata': {'level4': 'foobar4'},
  1040. }, {
  1041. 'selector': ['level2', 'level3', 'level4.1'],
  1042. 'metadata': {'level4.1': 'foobar4.1'},
  1043. }, {
  1044. 'selector': ['level2', 'level3.1'],
  1045. 'metadata': {'level3.1': 'foobar3.1'},
  1046. }])
  1047. self.assertEqual(target_metadata.query(('level2',)), {
  1048. 'level2a': 'foobar2a',
  1049. 'level2': 'foobar2',
  1050. })
  1051. target_metadata = base.DataMetadata({
  1052. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1053. 'structural_type': container.DataFrame,
  1054. })
  1055. target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
  1056. target_metadata = target_metadata.update(('zlevel',), {'level1z': 'foobar1z'})
  1057. target_metadata = copy_elements_metadata(metadata, target_metadata, ('level1',), ('zlevel',))
  1058. self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
  1059. 'selector': [],
  1060. 'metadata': {
  1061. 'level0z': 'foobar0z',
  1062. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1063. 'structural_type': 'd3m.container.pandas.DataFrame',
  1064. },
  1065. }, {
  1066. 'selector': ['zlevel'],
  1067. 'metadata': {'level1z': 'foobar1z'},
  1068. }, {
  1069. 'selector': ['zlevel', '__ALL_ELEMENTS__'],
  1070. 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
  1071. }, {
  1072. 'selector': ['zlevel', '__ALL_ELEMENTS__', 'level3'],
  1073. 'metadata': {'level3a': 'foobar3a'},
  1074. }, {
  1075. 'selector': ['zlevel', 'level2'],
  1076. 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
  1077. }, {
  1078. 'selector': ['zlevel', 'level2', 'level3'],
  1079. 'metadata': {'level3': 'foobar3'},
  1080. }, {
  1081. 'selector': ['zlevel', 'level2', 'level3', 'level4'],
  1082. 'metadata': {'level4': 'foobar4'},
  1083. }, {
  1084. 'selector': ['zlevel', 'level2', 'level3', 'level4.1'],
  1085. 'metadata': {'level4.1': 'foobar4.1'},
  1086. }, {
  1087. 'selector': ['zlevel', 'level2', 'level3.1'],
  1088. 'metadata': {'level3.1': 'foobar3.1'},
  1089. }])
  1090. self.assertEqual(target_metadata.query(('zlevel', 'level2',)), {
  1091. 'level2a': 'foobar2a',
  1092. 'level2': 'foobar2',
  1093. })
  1094. target_metadata = base.DataMetadata({
  1095. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1096. 'structural_type': container.DataFrame,
  1097. })
  1098. target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
  1099. target_metadata = copy_elements_metadata(metadata, target_metadata, ('level1', 'level2'))
  1100. self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
  1101. 'selector': [],
  1102. 'metadata': {
  1103. 'level0z': 'foobar0z',
  1104. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1105. 'structural_type': 'd3m.container.pandas.DataFrame',
  1106. },
  1107. }, {
  1108. 'selector': ['level3'],
  1109. 'metadata': {'level3': 'foobar3', 'level3a': 'foobar3a'},
  1110. }, {
  1111. 'selector': ['level3', 'level4'],
  1112. 'metadata': {'level4': 'foobar4'},
  1113. }, {
  1114. 'selector': ['level3', 'level4.1'],
  1115. 'metadata': {'level4.1': 'foobar4.1'},
  1116. }, {
  1117. 'selector': ['level3.1'],
  1118. 'metadata': {'level3.1': 'foobar3.1'},
  1119. }])
  1120. target_metadata = base.DataMetadata({
  1121. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1122. 'structural_type': container.DataFrame,
  1123. })
  1124. target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
  1125. target_metadata = target_metadata.update(('zlevel',), {'level1z': 'foobar1z'})
  1126. target_metadata = copy_elements_metadata(metadata, target_metadata, ('level1', 'level2'), ('zlevel',))
  1127. self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
  1128. 'selector': [],
  1129. 'metadata': {
  1130. 'level0z': 'foobar0z',
  1131. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1132. 'structural_type': 'd3m.container.pandas.DataFrame',
  1133. },
  1134. }, {
  1135. 'selector': ['zlevel'],
  1136. 'metadata': {'level1z': 'foobar1z'},
  1137. }, {
  1138. 'selector': ['zlevel', 'level3'],
  1139. 'metadata': {'level3': 'foobar3', 'level3a': 'foobar3a'},
  1140. }, {
  1141. 'selector': ['zlevel', 'level3', 'level4'],
  1142. 'metadata': {'level4': 'foobar4'},
  1143. }, {
  1144. 'selector': ['zlevel', 'level3', 'level4.1'],
  1145. 'metadata': {'level4.1': 'foobar4.1'},
  1146. }, {
  1147. 'selector': ['zlevel', 'level3.1'],
  1148. 'metadata': {'level3.1': 'foobar3.1'},
  1149. }])
  1150. def test_copy_metadata(self):
  1151. metadata = base.Metadata()
  1152. metadata = metadata.update((), {'level0': 'foobar0'})
  1153. metadata = metadata.update(('level1',), {'level1': 'foobar1'})
  1154. metadata = metadata.update((base.ALL_ELEMENTS,), {'level1a': 'foobar1a', 'level1b': 'foobar1b'})
  1155. metadata = metadata.update(('level1',), {'level1b': base.NO_VALUE})
  1156. metadata = metadata.update(('level1', 'level2'), {'level2': 'foobar2'})
  1157. metadata = metadata.update((base.ALL_ELEMENTS, base.ALL_ELEMENTS), {'level2a': 'foobar2a', 'level2b': 'foobar2b'})
  1158. metadata = metadata.update(('level1', 'level2'), {'level2b': base.NO_VALUE})
  1159. metadata = metadata.update(('level1', 'level2', 'level3'), {'level3': 'foobar3'})
  1160. metadata = metadata.update((base.ALL_ELEMENTS, base.ALL_ELEMENTS, 'level3'), {'level3a': 'foobar3a'})
  1161. metadata = metadata.update(('level1', 'level2', 'level3.1'), {'level3.1': 'foobar3.1'})
  1162. metadata = metadata.update(('level1', 'level2', 'level3', 'level4'), {'level4': 'foobar4'})
  1163. metadata = metadata.update(('level1', 'level2', 'level3', 'level4.1'), {'level4.1': 'foobar4.1'})
  1164. self.assertEqual(utils.to_json_structure(metadata.to_internal_simple_structure()), [{
  1165. 'selector': [],
  1166. 'metadata': {'level0': 'foobar0'},
  1167. }, {
  1168. 'selector': ['__ALL_ELEMENTS__'],
  1169. 'metadata': {'level1a': 'foobar1a', 'level1b': 'foobar1b'},
  1170. }, {
  1171. 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
  1172. 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
  1173. }, {
  1174. 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__', 'level3'],
  1175. 'metadata': {'level3a': 'foobar3a'},
  1176. }, {
  1177. 'selector': ['level1'],
  1178. 'metadata': {'level1': 'foobar1', 'level1b': '__NO_VALUE__'},
  1179. }, {
  1180. 'selector': ['level1', 'level2'],
  1181. 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
  1182. }, {
  1183. 'selector': ['level1', 'level2', 'level3'],
  1184. 'metadata': {'level3': 'foobar3'},
  1185. }, {
  1186. 'selector': ['level1', 'level2', 'level3', 'level4'],
  1187. 'metadata': {'level4': 'foobar4'},
  1188. }, {
  1189. 'selector': ['level1', 'level2', 'level3', 'level4.1'],
  1190. 'metadata': {'level4.1': 'foobar4.1'},
  1191. }, {
  1192. 'selector': ['level1', 'level2', 'level3.1'],
  1193. 'metadata': {'level3.1': 'foobar3.1'},
  1194. }])
  1195. self.assertEqual(metadata.query(('level1', 'level2')), {
  1196. 'level2a': 'foobar2a',
  1197. 'level2': 'foobar2',
  1198. })
  1199. target_metadata = base.DataMetadata({
  1200. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1201. 'structural_type': container.DataFrame,
  1202. })
  1203. target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
  1204. target_metadata = metadata.copy_to(target_metadata, ())
  1205. self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
  1206. 'selector': [],
  1207. 'metadata': {
  1208. 'level0': 'foobar0',
  1209. 'level0z': 'foobar0z',
  1210. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1211. 'structural_type': 'd3m.container.pandas.DataFrame',
  1212. },
  1213. }, {
  1214. 'selector': ['__ALL_ELEMENTS__'],
  1215. 'metadata': {'level1a': 'foobar1a', 'level1b': 'foobar1b'},
  1216. }, {
  1217. 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__'],
  1218. 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
  1219. }, {
  1220. 'selector': ['__ALL_ELEMENTS__', '__ALL_ELEMENTS__', 'level3'],
  1221. 'metadata': {'level3a': 'foobar3a'},
  1222. }, {
  1223. 'selector': ['level1'],
  1224. 'metadata': {'level1': 'foobar1', 'level1b': '__NO_VALUE__'},
  1225. }, {
  1226. 'selector': ['level1', 'level2'],
  1227. 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
  1228. }, {
  1229. 'selector': ['level1', 'level2', 'level3'],
  1230. 'metadata': {'level3': 'foobar3'},
  1231. }, {
  1232. 'selector': ['level1', 'level2', 'level3', 'level4'],
  1233. 'metadata': {'level4': 'foobar4'},
  1234. }, {
  1235. 'selector': ['level1', 'level2', 'level3', 'level4.1'],
  1236. 'metadata': {'level4.1': 'foobar4.1'},
  1237. }, {
  1238. 'selector': ['level1', 'level2', 'level3.1'],
  1239. 'metadata': {'level3.1': 'foobar3.1'},
  1240. }])
  1241. target_metadata = base.DataMetadata({
  1242. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1243. 'structural_type': container.DataFrame,
  1244. })
  1245. target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
  1246. target_metadata = metadata.copy_to(target_metadata, ('level1',))
  1247. self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
  1248. 'selector': [],
  1249. 'metadata': {
  1250. 'level0z': 'foobar0z',
  1251. 'level1': 'foobar1',
  1252. 'level1b': '__NO_VALUE__',
  1253. 'level1a': 'foobar1a',
  1254. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1255. 'structural_type': 'd3m.container.pandas.DataFrame',
  1256. },
  1257. }, {
  1258. 'selector': ['__ALL_ELEMENTS__'],
  1259. 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
  1260. }, {
  1261. 'selector': ['__ALL_ELEMENTS__', 'level3'],
  1262. 'metadata': {'level3a': 'foobar3a'},
  1263. }, {
  1264. 'selector': ['level2'],
  1265. 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
  1266. }, {
  1267. 'selector': ['level2', 'level3'],
  1268. 'metadata': {'level3': 'foobar3'},
  1269. }, {
  1270. 'selector': ['level2', 'level3', 'level4'],
  1271. 'metadata': {'level4': 'foobar4'},
  1272. }, {
  1273. 'selector': ['level2', 'level3', 'level4.1'],
  1274. 'metadata': {'level4.1': 'foobar4.1'},
  1275. }, {
  1276. 'selector': ['level2', 'level3.1'],
  1277. 'metadata': {'level3.1': 'foobar3.1'},
  1278. }])
  1279. self.assertEqual(target_metadata.query(('level2',)), {
  1280. 'level2a': 'foobar2a',
  1281. 'level2': 'foobar2',
  1282. })
  1283. target_metadata = base.DataMetadata({
  1284. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1285. 'structural_type': container.DataFrame,
  1286. })
  1287. target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
  1288. target_metadata = target_metadata.update(('zlevel',), {'level1z': 'foobar1z'})
  1289. target_metadata = metadata.copy_to(target_metadata, ('level1',), ('zlevel',))
  1290. self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
  1291. 'selector': [],
  1292. 'metadata': {
  1293. 'level0z': 'foobar0z',
  1294. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1295. 'structural_type': 'd3m.container.pandas.DataFrame',
  1296. },
  1297. }, {
  1298. 'selector': ['zlevel'],
  1299. 'metadata': {'level1z': 'foobar1z', 'level1': 'foobar1', 'level1b': '__NO_VALUE__', 'level1a': 'foobar1a'},
  1300. }, {
  1301. 'selector': ['zlevel', '__ALL_ELEMENTS__'],
  1302. 'metadata': {'level2a': 'foobar2a', 'level2b': 'foobar2b'},
  1303. }, {
  1304. 'selector': ['zlevel', '__ALL_ELEMENTS__', 'level3'],
  1305. 'metadata': {'level3a': 'foobar3a'},
  1306. }, {
  1307. 'selector': ['zlevel', 'level2'],
  1308. 'metadata': {'level2': 'foobar2', 'level2b': '__NO_VALUE__'},
  1309. }, {
  1310. 'selector': ['zlevel', 'level2', 'level3'],
  1311. 'metadata': {'level3': 'foobar3'},
  1312. }, {
  1313. 'selector': ['zlevel', 'level2', 'level3', 'level4'],
  1314. 'metadata': {'level4': 'foobar4'},
  1315. }, {
  1316. 'selector': ['zlevel', 'level2', 'level3', 'level4.1'],
  1317. 'metadata': {'level4.1': 'foobar4.1'},
  1318. }, {
  1319. 'selector': ['zlevel', 'level2', 'level3.1'],
  1320. 'metadata': {'level3.1': 'foobar3.1'},
  1321. }])
  1322. self.assertEqual(target_metadata.query(('zlevel', 'level2',)), {
  1323. 'level2a': 'foobar2a',
  1324. 'level2': 'foobar2',
  1325. })
  1326. target_metadata = base.DataMetadata({
  1327. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1328. 'structural_type': container.DataFrame,
  1329. })
  1330. target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
  1331. target_metadata = metadata.copy_to(target_metadata, ('level1', 'level2'))
  1332. self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
  1333. 'selector': [],
  1334. 'metadata': {
  1335. 'level0z': 'foobar0z',
  1336. 'level2': 'foobar2',
  1337. 'level2b': '__NO_VALUE__',
  1338. 'level2a': 'foobar2a',
  1339. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1340. 'structural_type': 'd3m.container.pandas.DataFrame',
  1341. },
  1342. }, {
  1343. 'selector': ['level3'],
  1344. 'metadata': {'level3': 'foobar3', 'level3a': 'foobar3a'},
  1345. }, {
  1346. 'selector': ['level3', 'level4'],
  1347. 'metadata': {'level4': 'foobar4'},
  1348. }, {
  1349. 'selector': ['level3', 'level4.1'],
  1350. 'metadata': {'level4.1': 'foobar4.1'},
  1351. }, {
  1352. 'selector': ['level3.1'],
  1353. 'metadata': {'level3.1': 'foobar3.1'},
  1354. }])
  1355. target_metadata = base.DataMetadata({
  1356. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1357. 'structural_type': container.DataFrame,
  1358. })
  1359. target_metadata = target_metadata.update((), {'level0z': 'foobar0z'})
  1360. target_metadata = target_metadata.update(('zlevel',), {'level1z': 'foobar1z'})
  1361. target_metadata = metadata.copy_to(target_metadata, ('level1', 'level2'), ('zlevel',))
  1362. self.assertEqual(utils.to_json_structure(target_metadata.to_internal_simple_structure()), [{
  1363. 'selector': [],
  1364. 'metadata': {
  1365. 'level0z': 'foobar0z',
  1366. 'schema': base.CONTAINER_SCHEMA_VERSION,
  1367. 'structural_type': 'd3m.container.pandas.DataFrame',
  1368. },
  1369. }, {
  1370. 'selector': ['zlevel'],
  1371. 'metadata': {'level1z': 'foobar1z', 'level2': 'foobar2', 'level2b': '__NO_VALUE__', 'level2a': 'foobar2a'},
  1372. }, {
  1373. 'selector': ['zlevel', 'level3'],
  1374. 'metadata': {'level3': 'foobar3', 'level3a': 'foobar3a'},
  1375. }, {
  1376. 'selector': ['zlevel', 'level3', 'level4'],
  1377. 'metadata': {'level4': 'foobar4'},
  1378. }, {
  1379. 'selector': ['zlevel', 'level3', 'level4.1'],
  1380. 'metadata': {'level4.1': 'foobar4.1'},
  1381. }, {
  1382. 'selector': ['zlevel', 'level3.1'],
  1383. 'metadata': {'level3.1': 'foobar3.1'},
  1384. }])
  1385. def test_get_index_columns(self):
  1386. main = container.DataFrame({'a1': [1, 2, 3], 'b1': [4, 5, 6]}, generate_metadata=True)
  1387. main.metadata = main.metadata.update((base.ALL_ELEMENTS, 0), {
  1388. 'name': 'image',
  1389. 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/PrimaryKey'],
  1390. })
  1391. main.metadata = main.metadata.update((base.ALL_ELEMENTS, 1), {
  1392. 'name': 'd3mIndex',
  1393. 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/PrimaryKey'],
  1394. })
  1395. self.assertEqual(main.metadata.get_index_columns(), [1, 0])
  1396. def test_query_field(self):
  1397. md = base.Metadata()
  1398. md = md.update((1,), {'key': 'value'})
  1399. self.assertEqual(md.query_field((1,), 'key', strict_all_elements=False), 'value')
  1400. self.assertEqual(md.query_field((1,), 'key', strict_all_elements=True), 'value')
  1401. with self.assertRaises(KeyError):
  1402. self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=False), 'value')
  1403. self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=True), 'value')
  1404. with self.assertRaises(KeyError):
  1405. self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key2', strict_all_elements=True), 'value')
  1406. md = md.update((2,), {'key': 'value'})
  1407. with self.assertRaises(KeyError):
  1408. self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=False), 'value')
  1409. self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=True), 'value')
  1410. md = md.update((3,), {'key': 'value2'})
  1411. with self.assertRaises(KeyError):
  1412. self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=False), 'value')
  1413. with self.assertRaises(KeyError):
  1414. self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=True), 'value')
  1415. md = md.update((base.ALL_ELEMENTS,), {'key': 'value'})
  1416. self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=False), 'value')
  1417. self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=True), 'value')
  1418. self.assertEqual(md.query_field((1,), 'key', strict_all_elements=False), 'value')
  1419. self.assertEqual(md.query_field((1,), 'key', strict_all_elements=True), 'value')
  1420. md = md.update((3,), {'key': 'value2'})
  1421. self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=False), 'value')
  1422. with self.assertRaises(KeyError):
  1423. self.assertEqual(md.query_field((base.ALL_ELEMENTS,), 'key', strict_all_elements=True), 'value')
  1424. def test_query_field_with_exceptions(self):
  1425. md = base.Metadata()
  1426. md = md.update((1,), {'key': 'value'})
  1427. md = md.update((2,), {'key': 'value2'})
  1428. self.assertEqual(md.query_field_with_exceptions((1,), 'key'), ('value', {}))
  1429. self.assertEqual(md.query_field_with_exceptions((2,), 'key'), ('value2', {}))
  1430. with self.assertRaises(KeyError):
  1431. md.query_field_with_exceptions((3,), 'key')
  1432. self.assertEqual(md.query_field_with_exceptions((base.ALL_ELEMENTS,), 'key'), (base.NO_VALUE, {(1,): 'value', (2,): 'value2'}))
  1433. # All elements ar require "key" field when there is no explicit ALL_ELEMENTS metadata.
  1434. md = md.update((3,), {'key2': 'value'})
  1435. with self.assertRaises(KeyError):
  1436. md.query_field_with_exceptions((base.ALL_ELEMENTS,), 'key')
  1437. md = md.update((base.ALL_ELEMENTS,), {'key': 'value'})
  1438. self.assertEqual(md.query_field_with_exceptions((1,), 'key'), ('value', {}))
  1439. self.assertEqual(md.query_field_with_exceptions((2,), 'key'), ('value', {}))
  1440. self.assertEqual(md.query_field_with_exceptions((base.ALL_ELEMENTS,), 'key'), ('value', {}))
  1441. md = md.update((3,), {'key': 'value2'})
  1442. self.assertEqual(md.query_field_with_exceptions((base.ALL_ELEMENTS,), 'key'), ('value', {(3,): 'value2'}))
  1443. # Setting same value as what ALL_ELEMENTS has should not add additional exception.
  1444. md = md.update((4,), {'key': 'value'})
  1445. self.assertEqual(md.query_field_with_exceptions((base.ALL_ELEMENTS,), 'key'), ('value', {(3,): 'value2'}))
  1446. # Because ALL_ELEMENTS is set, any additional elements without "key" field are ignored.
  1447. md = md.update((5,), {'key2': 'value'})
  1448. self.assertEqual(md.query_field_with_exceptions((base.ALL_ELEMENTS,), 'key'), ('value', {(3,): 'value2'}))
  1449. def test_compact_generated_metadata(self):
  1450. ALL_GENERATED_KEYS = ['foo', 'name', 'other', 'structural_type']
  1451. compacted_metadata = base.DataMetadata._compact_metadata({}, ALL_GENERATED_KEYS)
  1452. self.assertEqual(compacted_metadata, {})
  1453. # All equal.
  1454. new_metadata = {
  1455. ('a',): {'foo': 'bar', 'other': 1},
  1456. ('b',): {'foo': 'bar', 'other': 2},
  1457. ('c',): {'foo': 'bar', 'other': 3},
  1458. }
  1459. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1460. self.assertEqual(compacted_metadata, {
  1461. (base.ALL_ELEMENTS,): {'foo': 'bar'},
  1462. ('a',): {'other': 1},
  1463. ('b',): {'other': 2},
  1464. ('c',): {'other': 3},
  1465. })
  1466. # One different.
  1467. new_metadata = {
  1468. ('a',): {'foo': 'bar', 'other': 1},
  1469. ('b',): {'foo': 'bar', 'other': 2},
  1470. ('c',): {'foo': 'bar2', 'other': 3,},
  1471. }
  1472. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1473. self.assertEqual(compacted_metadata, {
  1474. ('a',): {'foo': 'bar', 'other': 1},
  1475. ('b',): {'foo': 'bar', 'other': 2},
  1476. ('c',): {'foo': 'bar2', 'other': 3,},
  1477. })
  1478. # Recursive.
  1479. new_metadata = {
  1480. ('deep', 'a'): {'foo': 'bar', 'other': 1},
  1481. ('deep', 'b'): {'foo': 'bar', 'other': 2},
  1482. ('deep', 'c'): {'foo': 'bar', 'other': 3},
  1483. }
  1484. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1485. self.assertEqual(compacted_metadata, {
  1486. (base.ALL_ELEMENTS, base.ALL_ELEMENTS): {'foo': 'bar'},
  1487. (base.ALL_ELEMENTS, 'a'): {'other': 1},
  1488. (base.ALL_ELEMENTS, 'b'): {'other': 2},
  1489. (base.ALL_ELEMENTS, 'c'): {'other': 3},
  1490. })
  1491. new_metadata = {
  1492. ('deep', 'a'): {'foo': 'bar', 'other': 1},
  1493. ('deep', 'b'): {'foo': 'bar', 'other': 2},
  1494. ('deep', 'c'): {'foo': 'bar', 'other': 3},
  1495. ('deep2', 'd'): {'foo': 'bar', 'other': 4},
  1496. }
  1497. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1498. self.assertEqual(compacted_metadata, {
  1499. (base.ALL_ELEMENTS, base.ALL_ELEMENTS): {'foo': 'bar'},
  1500. (base.ALL_ELEMENTS, 'a'): {'other': 1},
  1501. (base.ALL_ELEMENTS, 'b'): {'other': 2},
  1502. (base.ALL_ELEMENTS, 'c'): {'other': 3},
  1503. (base.ALL_ELEMENTS, 'd'): {'other': 4},
  1504. })
  1505. new_metadata = {
  1506. ('deep', 'a'): {'foo': 'bar', 'other': 1},
  1507. ('deep', 'b'): {'foo': 'bar', 'other': 2},
  1508. ('deep', 'c'): {'foo': 'bar', 'other': 3},
  1509. ('deep2', 'a'): {'foo': 'bar', 'other': 4},
  1510. ('deep2', 'b'): {'foo': 'bar', 'other': 5},
  1511. }
  1512. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1513. self.assertEqual(compacted_metadata, {
  1514. (base.ALL_ELEMENTS, base.ALL_ELEMENTS): {'foo': 'bar'},
  1515. (base.ALL_ELEMENTS, 'c'): {'other': 3},
  1516. ('deep', 'a'): {'other': 1},
  1517. ('deep', 'b'): {'other': 2},
  1518. ('deep2', 'a'): {'other': 4},
  1519. ('deep2', 'b'): {'other': 5},
  1520. })
  1521. new_metadata = {
  1522. ('deep', 'a'): {'foo': 'bar', 'other': 1},
  1523. ('deep', 'b'): {'foo': 'bar', 'other': 2},
  1524. ('deep', 'c'): {'foo': 'bar2', 'other': 3},
  1525. ('deep2', 'a'): {'foo': 'bar', 'other': 4},
  1526. ('deep2', 'b'): {'foo': 'bar', 'other': 5},
  1527. }
  1528. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1529. self.assertEqual(compacted_metadata, {
  1530. (base.ALL_ELEMENTS, 'a'): {'foo': 'bar'},
  1531. (base.ALL_ELEMENTS, 'b'): {'foo': 'bar'},
  1532. (base.ALL_ELEMENTS, 'c'): {'foo': 'bar2', 'other': 3},
  1533. ('deep', 'a'): {'other': 1},
  1534. ('deep', 'b'): {'other': 2},
  1535. ('deep2', 'a'): {'other': 4},
  1536. ('deep2', 'b'): {'other': 5},
  1537. })
  1538. new_metadata = {
  1539. ('a', 'deep'): {'foo': 'bar', 'other': 1},
  1540. ('b', 'deep'): {'foo': 'bar', 'other': 2},
  1541. ('c', 'deep'): {'foo': 'bar2', 'other': 3},
  1542. ('a', 'deep2'): {'foo': 'bar', 'other': 4},
  1543. ('b', 'deep2'): {'foo': 'bar', 'other': 5},
  1544. }
  1545. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1546. self.assertEqual(compacted_metadata, {
  1547. ('a', base.ALL_ELEMENTS): {'foo': 'bar'},
  1548. ('a', 'deep'): {'other': 1},
  1549. ('a', 'deep2'): {'other': 4},
  1550. ('b', base.ALL_ELEMENTS): {'foo': 'bar'},
  1551. ('b', 'deep'): {'other': 2},
  1552. ('b', 'deep2'): {'other': 5},
  1553. ('c', base.ALL_ELEMENTS): {'foo': 'bar2', 'other': 3},
  1554. })
  1555. new_metadata = {
  1556. (base.ALL_ELEMENTS, 'a'): {'foo': 'bar', 'other': 1},
  1557. (base.ALL_ELEMENTS, 'b'): {'foo': 'bar', 'other': 2},
  1558. (base.ALL_ELEMENTS, 'c'): {'foo': 'bar', 'other': 3},
  1559. }
  1560. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1561. self.assertEqual(compacted_metadata, {
  1562. (base.ALL_ELEMENTS, base.ALL_ELEMENTS): {'foo': 'bar'},
  1563. (base.ALL_ELEMENTS, 'a'): {'other': 1},
  1564. (base.ALL_ELEMENTS, 'b'): {'other': 2},
  1565. (base.ALL_ELEMENTS, 'c'): {'other': 3},
  1566. })
  1567. new_metadata = {
  1568. (base.ALL_ELEMENTS, 0): {'foo': 'bar1'},
  1569. (0, 1): {'foo': 'bar2'},
  1570. (1, 1): {'foo': 'bar2'},
  1571. (2, 1): {'foo': 'bar2'},
  1572. }
  1573. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1574. self.assertEqual(compacted_metadata, {
  1575. (base.ALL_ELEMENTS, 0): {'foo': 'bar1'},
  1576. (base.ALL_ELEMENTS, 1): {'foo': 'bar2'},
  1577. })
  1578. new_metadata = {
  1579. ('deep1', 'a'): {'foo': 'bar', 'other': 1},
  1580. ('deep1', 'b'): {'foo': 'bar2', 'other': 2},
  1581. ('deep2', 'a'): {'foo': 'bar', 'other': 3},
  1582. ('deep2', 'b'): {'foo': 'bar2', 'other': 4},
  1583. ('deep3', 'a'): {'foo': 'bar', 'other': 5},
  1584. ('deep3', 'b'): {'foo': 'bar2', 'other': 6},
  1585. }
  1586. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1587. self.assertEqual(compacted_metadata, {
  1588. (base.ALL_ELEMENTS, 'a'): {'foo': 'bar'},
  1589. (base.ALL_ELEMENTS, 'b'): {'foo': 'bar2'},
  1590. ('deep1', 'a'): {'other': 1},
  1591. ('deep1', 'b'): {'other': 2},
  1592. ('deep2', 'a'): {'other': 3},
  1593. ('deep2', 'b'): {'other': 4},
  1594. ('deep3', 'a'): {'other': 5},
  1595. ('deep3', 'b'): {'other': 6},
  1596. })
  1597. new_metadata = {
  1598. ('deep1', 'a'): {'foo': 'bar', 'other': 1},
  1599. ('deep1', 'b'): {'foo': 'bar', 'other': 2},
  1600. ('deep2', 'c'): {'foo': 'bar', 'other': 3},
  1601. ('deep2', 'd'): {'foo': 'bar', 'other': 4},
  1602. ('deep3', 'e'): {'foo': 'bar', 'other': 5},
  1603. ('deep3', 'f'): {'foo': 'bar', 'other': 6},
  1604. }
  1605. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1606. self.assertEqual(compacted_metadata, {
  1607. (base.ALL_ELEMENTS, base.ALL_ELEMENTS): {'foo': 'bar'},
  1608. (base.ALL_ELEMENTS, 'a'): {'other': 1},
  1609. (base.ALL_ELEMENTS, 'b'): {'other': 2},
  1610. (base.ALL_ELEMENTS, 'c'): {'other': 3},
  1611. (base.ALL_ELEMENTS, 'd'): {'other': 4},
  1612. (base.ALL_ELEMENTS, 'e'): {'other': 5},
  1613. (base.ALL_ELEMENTS, 'f'): {'other': 6},
  1614. })
  1615. new_metadata = {
  1616. ('deep1', 'a', 1): {'foo': 'bar1', 'other': 1},
  1617. ('deep2', 'a', 2): {'foo': 'bar1', 'other': 2},
  1618. ('deep3', 'a', 3): {'foo': 'bar1', 'other': 3},
  1619. ('deep4', 'a', 4): {'foo': 'bar1', 'other': 4},
  1620. ('deep1', 'b', 1): {'foo': 'bar2', 'other': 5},
  1621. }
  1622. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1623. self.assertEqual(compacted_metadata, {
  1624. (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 2): {'other': 2},
  1625. (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 3): {'other': 3},
  1626. (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 4): {'other': 4},
  1627. (base.ALL_ELEMENTS, 'a', base.ALL_ELEMENTS): {'foo': 'bar1'},
  1628. (base.ALL_ELEMENTS, 'a', 1): {'other': 1},
  1629. (base.ALL_ELEMENTS, 'b', base.ALL_ELEMENTS): {'foo': 'bar2', 'other': 5},
  1630. })
  1631. new_metadata = {
  1632. ('deep', 'a', 1): {'foo': 'bar1', 'other': 1},
  1633. ('deep', 'a', 2): {'foo': 'bar1', 'other': 2},
  1634. ('deep', 'b', 1): {'foo': 'bar2', 'other': 3},
  1635. ('deep', 'b', 2): {'foo': 'bar2', 'other': 4},
  1636. }
  1637. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1638. self.assertEqual(compacted_metadata, {
  1639. (base.ALL_ELEMENTS, 'a', base.ALL_ELEMENTS): {'foo': 'bar1'},
  1640. (base.ALL_ELEMENTS, 'a', 1): {'other': 1},
  1641. (base.ALL_ELEMENTS, 'a', 2): {'other': 2},
  1642. (base.ALL_ELEMENTS, 'b', base.ALL_ELEMENTS): {'foo': 'bar2'},
  1643. (base.ALL_ELEMENTS, 'b', 1): {'other': 3},
  1644. (base.ALL_ELEMENTS, 'b', 2): {'other': 4},
  1645. })
  1646. new_metadata = {
  1647. ('deep', 'a', 1): {'foo': 'bar1', 'other': 'bar1'},
  1648. ('deep', 'a', 2): {'foo': 'bar1', 'other': 'bar2'},
  1649. ('deep', 'b', 1): {'foo': 'bar2', 'other': 'bar1'},
  1650. ('deep', 'b', 2): {'foo': 'bar2', 'other': 'bar2'},
  1651. }
  1652. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1653. self.assertEqual(compacted_metadata, {
  1654. (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 1): {'other': 'bar1'},
  1655. (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 2): {'other': 'bar2'},
  1656. (base.ALL_ELEMENTS, 'a', base.ALL_ELEMENTS): {'foo': 'bar1'},
  1657. (base.ALL_ELEMENTS, 'b', base.ALL_ELEMENTS): {'foo': 'bar2'},
  1658. })
  1659. new_metadata = {
  1660. ('deep1', 'a', 1): {'foo': 'bar1', 'other': 1},
  1661. ('deep1', 'a', 2): {'foo': 'bar1', 'other': 2},
  1662. ('deep2', 'a', 3): {'foo': 'bar1', 'other': 3},
  1663. ('deep2', 'a', 4): {'foo': 'bar1', 'other': 4},
  1664. ('deep1', 'b', 1): {'foo': 'bar2', 'other': 1},
  1665. ('deep1', 'b', 2): {'foo': 'bar2', 'other': 2},
  1666. ('deep2', 'b', 3): {'foo': 'bar2', 'other': 3},
  1667. ('deep2', 'b', 4): {'foo': 'bar2', 'other': 4},
  1668. }
  1669. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1670. self.assertEqual(compacted_metadata, {
  1671. (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 1): {'other': 1},
  1672. (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 2): {'other': 2},
  1673. (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 3): {'other': 3},
  1674. (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 4): {'other': 4},
  1675. (base.ALL_ELEMENTS, 'a', base.ALL_ELEMENTS): {'foo': 'bar1'},
  1676. (base.ALL_ELEMENTS, 'b', base.ALL_ELEMENTS): {'foo': 'bar2'},
  1677. })
  1678. new_metadata = {
  1679. ('deep', 'a'): {'foo': 'bar', 'other': 1},
  1680. ('deep', 'b'): {'foo': 'bar', 'other': 2},
  1681. ('deep2', 'b'): {'other': 3},
  1682. ('deep2', 'c'): {'foo': 'bar', 'other': 4},
  1683. }
  1684. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1685. self.assertEqual(compacted_metadata, {
  1686. (base.ALL_ELEMENTS, 'a'): {'other': 1},
  1687. (base.ALL_ELEMENTS, 'c'): {'foo': 'bar', 'other': 4},
  1688. ('deep',base.ALL_ELEMENTS): {'foo': 'bar'},
  1689. ('deep', 'b'): {'other': 2},
  1690. ('deep2', 'b'): {'other': 3},
  1691. })
  1692. new_metadata = {
  1693. ('deep', 'a'): {'foo': 'bar', 'other': 1},
  1694. ('deep', 'b'): {'foo': 'bar', 'other': 2},
  1695. ('deep', 'c'): {'other': 3},
  1696. ('deep2', 'd'): {'foo': 'bar', 'other': 4},
  1697. }
  1698. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1699. self.assertEqual(compacted_metadata, {
  1700. (base.ALL_ELEMENTS, 'a'): {'foo': 'bar', 'other': 1},
  1701. (base.ALL_ELEMENTS, 'b'): {'foo': 'bar', 'other': 2},
  1702. (base.ALL_ELEMENTS, 'c'): {'other': 3},
  1703. (base.ALL_ELEMENTS, 'd'): {'foo':'bar', 'other': 4},
  1704. })
  1705. new_metadata = {
  1706. (base.ALL_ELEMENTS, 0): {'structural_type': 'numpy.int64'},
  1707. (0, 1): {'structural_type': 'str'},
  1708. (1, 1): {'structural_type': 'str'},
  1709. (2, 1): {'structural_type': 'str'},
  1710. (base.ALL_ELEMENTS, 1): {'name': 'B'},
  1711. (0, 0): {'structural_type': 'numpy.int64'},
  1712. (1, 0): {'structural_type': 'numpy.int64'},
  1713. (2, 0): {'structural_type': 'numpy.int64'},
  1714. }
  1715. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1716. self.assertEqual(compacted_metadata, {
  1717. (base.ALL_ELEMENTS, 0): {'structural_type': 'numpy.int64'},
  1718. (base.ALL_ELEMENTS, 1): {'name': 'B', 'structural_type': 'str'},
  1719. })
  1720. new_metadata = {
  1721. (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 0): {'structural_type': 'numpy.int64'},
  1722. (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 1): {'structural_type': 'str'},
  1723. ('0', base.ALL_ELEMENTS, 0): {'name': 'A', 'structural_type': 'numpy.int64'},
  1724. ('0', base.ALL_ELEMENTS, 1): {'name': 'B', 'structural_type': 'str'},
  1725. }
  1726. compacted_metadata = base.DataMetadata._compact_metadata(new_metadata, ALL_GENERATED_KEYS)
  1727. self.assertEqual(compacted_metadata, {
  1728. (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 0): {'structural_type': 'numpy.int64', 'name': 'A'},
  1729. (base.ALL_ELEMENTS, base.ALL_ELEMENTS, 1): {'structural_type': 'str', 'name': 'B'},
  1730. })
  1731. def test_greedy_prune_metadata(self):
  1732. # Warmup test 1.
  1733. selectors_to_compact = [('a',), ('b',),('c',)]
  1734. compacted_selector = [(base.ALL_ELEMENTS, )]
  1735. pruned_selectors = base.DataMetadata._greedy_prune_selector(compacted_selector, selectors_to_compact)
  1736. self.assertEqual(pruned_selectors, [
  1737. (base.ALL_ELEMENTS, )
  1738. ])
  1739. # Warmup test 2.
  1740. selectors_to_compact = [('deep', 'a'), ('deep', 'b'), ('deep', 'c'), ('deep2', 'd')]
  1741. compacted_selector = [(base.ALL_ELEMENTS, base.ALL_ELEMENTS,)]
  1742. pruned_selectors = base.DataMetadata._greedy_prune_selector(compacted_selector, selectors_to_compact)
  1743. self.assertEqual(pruned_selectors, [
  1744. (base.ALL_ELEMENTS, base.ALL_ELEMENTS,)
  1745. ])
  1746. # Check if it can remove unnecessary outputs.
  1747. selectors_to_compact = [('deep', 'a'), ('deep', 'b'), ('deep2', 'a'), ('deep2', 'b')]
  1748. compacted_selector = [(base.ALL_ELEMENTS, 'a'), (base.ALL_ELEMENTS, 'b'), ('deep', 'a'), ('deep2', 'b')]
  1749. pruned_selectors = base.DataMetadata._greedy_prune_selector(compacted_selector, selectors_to_compact)
  1750. self.assertEqual(pruned_selectors, [
  1751. (base.ALL_ELEMENTS, 'a'), (base.ALL_ELEMENTS, 'b')
  1752. ])
  1753. # Case when compacted_selector overlaps.
  1754. selectors_to_compact = [('a', 'deep'), ('b', 'deep'), ('a', 'deep2'), ('b', 'deep2')]
  1755. compacted_selector = [('a', base.ALL_ELEMENTS), ('b', base.ALL_ELEMENTS), (base.ALL_ELEMENTS, 'deep2')]
  1756. pruned_selectors = base.DataMetadata._greedy_prune_selector(compacted_selector, selectors_to_compact)
  1757. self.assertEqual(pruned_selectors, [
  1758. ('a', base.ALL_ELEMENTS), ('b', base.ALL_ELEMENTS)
  1759. ])
  1760. # Check the order.
  1761. selectors_to_compact = [('a', 'deep'), ('b', 'deep'), ('a', 'deep2'), ('b', 'deep2')]
  1762. compacted_selector = [(base.ALL_ELEMENTS, 'deep2'), ('a', base.ALL_ELEMENTS), ('b', base.ALL_ELEMENTS),]
  1763. pruned_selectors = base.DataMetadata._greedy_prune_selector(compacted_selector, selectors_to_compact)
  1764. self.assertEqual(pruned_selectors, [
  1765. ('a', base.ALL_ELEMENTS), ('b', base.ALL_ELEMENTS)
  1766. ])
  1767. # More complex compacted_selectors.
  1768. selectors_to_compact = [('a', 'deep'), ('b', 'deep'), ('a', 'deep2'), ('b', 'deep2')]
  1769. compacted_selector = [(base.ALL_ELEMENTS, 'deep2'), ('a', base.ALL_ELEMENTS),
  1770. (base.ALL_ELEMENTS, 'deep'), ('b', base.ALL_ELEMENTS),]
  1771. pruned_selectors = base.DataMetadata._greedy_prune_selector(compacted_selector, selectors_to_compact)
  1772. self.assertEqual(pruned_selectors, [
  1773. (base.ALL_ELEMENTS, 'deep2'), (base.ALL_ELEMENTS, 'deep')
  1774. ])
  1775. # All-elements in selectors_to_compact.
  1776. selectors_to_compact = [('deep', 'a', 1), ('deep', base.ALL_ELEMENTS, 2)]
  1777. compacted_selector = [(base.ALL_ELEMENTS, 'a', base.ALL_ELEMENTS), ('deep', base.ALL_ELEMENTS, 2)]
  1778. pruned_selectors = base.DataMetadata._greedy_prune_selector(compacted_selector, selectors_to_compact)
  1779. self.assertEqual(pruned_selectors, [
  1780. (base.ALL_ELEMENTS, 'a', base.ALL_ELEMENTS), ('deep', base.ALL_ELEMENTS, 2)
  1781. ])
  1782. def test_semantic_types_merge(self):
  1783. metadata = base.DataMetadata().update(('0',), {
  1784. 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/DatasetEntryPoint'],
  1785. })
  1786. metadata_regular = metadata.update((base.ALL_ELEMENTS,), {
  1787. 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/Table'],
  1788. })
  1789. self.assertEqual(metadata_regular.query(('0',)).get('semantic_types', None), ('https://metadata.datadrivendiscovery.org/types/Table',))
  1790. metadata._update_with_generated_metadata({
  1791. (base.ALL_ELEMENTS,): {
  1792. 'semantic_types': ['https://metadata.datadrivendiscovery.org/types/Table'],
  1793. },
  1794. })
  1795. self.assertEqual(metadata.query(('0',)).get('semantic_types', None), ('https://metadata.datadrivendiscovery.org/types/DatasetEntryPoint', 'https://metadata.datadrivendiscovery.org/types/Table',))
  1796. def test_compact(self):
  1797. md = base.Metadata().update(('0',), {
  1798. 'key': 'value',
  1799. })
  1800. md = md.update(('1',), {
  1801. 'key': 'value',
  1802. })
  1803. md = md.compact(['key'])
  1804. self.assertEqual(md.to_internal_json_structure(), [{
  1805. 'selector': ['__ALL_ELEMENTS__'],
  1806. 'metadata': {'key': 'value'},
  1807. }])
  1808. md = base.Metadata().update(('0',), {
  1809. 'key': 'value',
  1810. })
  1811. md = md.update(('1',), {
  1812. 'key': 'value',
  1813. })
  1814. md = md.update(('2',), {
  1815. 'key': 'value2',
  1816. })
  1817. md = md.compact(['key'])
  1818. self.assertEqual(md.to_internal_json_structure(), [{
  1819. 'selector': ['0'],
  1820. 'metadata': {'key': 'value'},
  1821. }, {
  1822. 'selector': ['1'],
  1823. 'metadata': {'key': 'value'},
  1824. }, {
  1825. 'selector': ['2'],
  1826. 'metadata': {'key': 'value2'},
  1827. }])
  1828. md = base.Metadata().update(('0',), {
  1829. 'key': 'value',
  1830. 'key2': 'value',
  1831. })
  1832. md = md.update(('1',), {
  1833. 'key': 'value',
  1834. 'key2': 'value',
  1835. })
  1836. md = md.compact(['key'])
  1837. self.assertEqual(md.to_internal_json_structure(), [{
  1838. 'selector': ['__ALL_ELEMENTS__'],
  1839. 'metadata': {'key': 'value'},
  1840. }, {
  1841. 'selector': ['0'],
  1842. 'metadata': {'key2': 'value'},
  1843. }, {
  1844. 'selector': ['1'],
  1845. 'metadata': {'key2': 'value'},
  1846. }])
  1847. if __name__ == '__main__':
  1848. unittest.main()

全栈的自动化机器学习系统,主要针对多变量时间序列数据的异常检测。TODS提供了详尽的用于构建基于机器学习的异常检测系统的模块,它们包括:数据处理(data processing),时间序列处理( time series processing),特征分析(feature analysis),检测算法(detection algorithms),和强化模块( reinforcement module)。这些模块所提供的功能包括常见的数据预处理、时间序列数据的平滑或变换,从时域或频域中抽取特征、多种多样的检测算