From 2b4b3485e66acd045ad1ad5e4149309200045051 Mon Sep 17 00:00:00 2001 From: Markus Scheidgen <markus.scheidgen@gmail.com> Date: Mon, 10 Feb 2020 11:24:35 +0100 Subject: [PATCH] Fixed labels index and search. --- nomad/datamodel/dft.py | 23 ++++++++--- nomad/search.py | 5 +-- tests/app/test_api.py | 4 +- tests/data/proc/examples_template.zip | Bin 1697 -> 1541 bytes .../data/proc/examples_template/template.json | 37 ++++++------------ 5 files changed, 33 insertions(+), 36 deletions(-) diff --git a/nomad/datamodel/dft.py b/nomad/datamodel/dft.py index 4fd6905f8a..d2ca7cb930 100644 --- a/nomad/datamodel/dft.py +++ b/nomad/datamodel/dft.py @@ -18,7 +18,7 @@ DFT specific metadata from typing import List import re -from elasticsearch_dsl import Integer, Object, InnerDoc +from elasticsearch_dsl import Integer, Object, InnerDoc, Keyword import ase.data from nomadcore.local_backend import ParserEvent @@ -82,9 +82,15 @@ class Label(MSection): m_def = Section(a_elastic=dict(type=InnerDoc)) - label = Quantity(type=str) - type = Quantity(type=MEnum('compound_class', 'classification', 'prototype', 'prototype_id')) - source = Quantity(type=MEnum('springer', 'aflow_prototype_library')) + label = Quantity(type=str, a_elastic=dict(type=Keyword)) + + type = Quantity(type=MEnum( + 'compound_class', 'classification', 'prototype', 'prototype_id'), + a_elastic=dict(type=Keyword)) + + source = Quantity( + type=MEnum('springer', 'aflow_prototype_library'), + a_elastic=dict(type=Keyword)) ESLabel = elastic_mapping(Label.m_def, InnerDoc) @@ -253,6 +259,13 @@ def only_atoms(atoms): return ''.join(only_atoms) +def _elastic_label_value(label): + if isinstance(label, str): + return label + else: + return elastic_obj(label, ESLabel) + + Domain( 'DFT', DFTCalcWithMetadata, quantities=dict( @@ -304,7 +317,7 @@ Domain( 'Search based for springer classification and aflow prototypes', elastic_field='labels.label', elastic_mapping=Object(ESLabel), - elastic_value=lambda labels: [elastic_obj(label, ESLabel) for label in labels], + elastic_value=lambda labels: [_elastic_label_value(label) for label in labels], multi=True), optimade=DomainQuantity( 'Search based on optimade\'s filter query language', diff --git a/nomad/search.py b/nomad/search.py index 7e3e608065..859308bceb 100644 --- a/nomad/search.py +++ b/nomad/search.py @@ -158,9 +158,8 @@ class Entry(Document, metaclass=WithDomain): self.external_id = source.external_id for quantity in datamodel.Domain.instance.domain_quantities.values(): - setattr( - self, quantity.name, - quantity.elastic_value(getattr(source, quantity.metadata_field))) + quantity_value = quantity.elastic_value(getattr(source, quantity.metadata_field)) + setattr(self, quantity.name, quantity_value) def delete_upload(upload_id): diff --git a/tests/app/test_api.py b/tests/app/test_api.py index d5b9c6e443..8da6e5e8fe 100644 --- a/tests/app/test_api.py +++ b/tests/app/test_api.py @@ -1078,9 +1078,9 @@ class TestRepo(): data = json.loads(rv.data) assert data['pagination']['total'] > 0 - def test_label(self, api, non_empty_processed, test_user_auth): + def test_labels(self, api, non_empty_processed, test_user_auth): rv = api.get( - '/repo/?%s' % urlencode(dict(owner='all', label=['oxide', 'metal']), doseq=True), + '/repo/?%s' % urlencode(dict(owner='all', labels=['nonmetal', 'semiconductor']), doseq=True), headers=test_user_auth) assert rv.status_code == 200 data = json.loads(rv.data) diff --git a/tests/data/proc/examples_template.zip b/tests/data/proc/examples_template.zip index 4fb6efc6a809584d3caa0ef6a6164d818985b0c9..be5b6bc8c6093ca01f808c71c346746102e9e153 100644 GIT binary patch literal 1541 zcmWIWW@h1H00F_KGXM8Cl;?6VFff3yID-sBYDHphK~8FMd`W6<K~7>xs=lFKVrfNa z2qy#crQg?M1GF6DN-MY-7+JnDGBB`+FfcGA=jWBA=9O@fYOoQl3^t~f!6u{_3<??! zhVBTjfVrG5J0h7F82Gpt804{rF)Xn4vWoNbz+t^i%Q0>RW?0V+^Ul9*z_agpIEUTx zMqTs1z0ud!x;DykZIR#-X<T6CqvkNp#`E1I(ZBB}&pn>wTDikgMet<5$j^ye?z5k$ zW8&SJ7$gwd`GC7BvxQ@Ce*IcT!7U7{Uq$dm|9ZN2#^F;@ExMU2p9Eb@;{Rt^Tf<@V z%RJzg)mq<m?k6?mltui#MVDzzcRiWd8sI7VRL0`hL6@z&_V4}pvvTRI%tZ$UHtWsq zP+iV+LH-xpF5Vldfek-ZpRb*=JM(w&{ie3Q$lXk_q6OU{K^x{|EM9ddgzH~B-@dzc zJI|FZoR@!Mk<i)tQ(KGAAKv}z{c8)!Dh0c5-)`~Mz5n|z&uiYv!`I(8Hvf1rC!KkI z+OvmF>$f&8QWuZDps8mib+)VPGTSWX=kvODrMG;@5PEEJ_JP)?DbHVRv65-+%Xuax z>t^%*^BLP;?KZL-%lq!i6?mLj8nGdDshQ1`1vBQ{zBywvlgnQAn%=zUY<Er^Pf>3U zR^|@!I(ufKNBh>5ulN3c6@M#3MBQ^rYhYKfP2Xh!`Ik%PD)t?EVRd-2T-x4O_op;m z4*#%j%7clrZ#tsB-Q1X#bh5F;^1SBx?Zr3BADrL$dLx%#wUS%jb?(3oJFYacZmrGP z_D7Ii!9n+W%EASH7e85@dz3QCXVIExqK`MGnte^~F`4q-@v(|`!8Dafvw26-9iC{e zDg4OcZs8f!y>)F$HOJ%AnoGYe%$fZE&g09j@qRZPZzOPDlDjhN#H9^QfA4NNaI{nB zjW_d+@2&SmJ7lV!J#5hTTil(!D`)zQ{k}2`)3+ToyZBY?VP8ST$u)epCjI(i_=7#b zn~_P58CSU=0V*yS7#SECmNbHxI7<muNGX9<LJ)6wBm)DMA_!ViP-^%ltcF8N3rY>= xX2j-lXo-Q(a9rgCa+s%JH5{$fU}azil^Pgf&&mdhGFApwhMSBG3}P%G9srtX7}Nj& literal 1697 zcmWIWW@h1H0D;3BHGDxd3=1*HFr-!_<`(3n7RQ&Q<`(26mZa*3hHx@4_vucFUeOsC zQ(D2zz{v8Ik%56lgn@wpw^`y?%`(wTEUkbW2r?9>fd|nXhuuIUxPhIzQ=&l_r-6rv zGSC=qV7Km+Xb{F}-~plxG=v-2t~(_fgs~V13QG<KrDQulLB};;3Yi!fWVsm_<gtb! zEMoMsiu3cpVL72QFlG{F<ZKO#_P=c)QujPOqOwh+aMta64ZJPe*i|mHn1oLA^tblz zn|qUQvGbqrJ9A$MUB4i*ao-lZ<M)4_+goSl^i4Qp1<&NB6=5v%FZ6E}Sh)P%?Kp*| zYYCyvvya>UedKlK!Nq$WRhQgOwl4ZA_UG@HXI39x$U9_amz1Uor6o>Mnli^sODjP2 zb=zTOC*II0#SdOc3%`AQ_2|y?=WMU~2=lhhNZp*4V<Fm5cbWY{?E!BQ(;4%Nu5njN zY_tEuSMnz2b$Y@Iro4$>Tw#K_A<;9#4%)wZ@cHQ4>^H5i-px4^z44##&ayvuzFvL5 zKKaQF=8vKIt7RW-zoxJ6e^Pd*-ESd_j^_s}tDao;vE6#XJ9mNI1~J(eYomBfW?j`? zo}Ixur`qV%JVCF+Hr_>Z5_!}&syhb05VzX2vO076$?Qy)zwCyUt&<H-T{h9~UUaAC z(^P4_#~YscUDDQkmUD5H?>*@NpL1_?&P4DgnSS4QY+EtYI^*>x@2M<zyS8NFteN36 z$|g4-UewX8)A^X0tM9PJ$<IkaermCcYAUPJQ@>Syi9cz-ZvXf8jpiTOP4DgcHs@Y* zc{y8pR=Olxe7URn8SU!#vyzhzHu9t|TD0fYw@VAT3+C@+4tsoiTF1n@yHvTJCG$oE z+&}g#{=F!(f`jg~lywQBk340TrA~SpDL4J&k|Pq!w`p_PAM<ejDVB0QwC%Kx_GuIU zZw)7Mw;WPc>?@omDkeRB;@v`tetpfY{UXwTe$NxutExFzmeI`WQ61o|Bz-vRTl!_D z#mqBryNlfTetEr^3oHAvhYjxShDX-!exqtoKih&qFSj}OMrnJ2x~-J)YWLccufF^d z5AbGWl4HhIwn#vW83Bg3jvywsl7<yh(qQBe+~$fiz|3V}Skmajz<{L$gO)mk4aY2V zkPV-U)o^GD#LB>owe&%_9JBmEHvAn{!=a@SD+4puk_cfqW?6)6xIH7bV1brQtPIRp wOC^xuxXLAn;fxHRFrR?caI{j2m4O*lN?}ASD;p>&uraVP7&0+1M6rN)0FTWVWB>pF diff --git a/tests/data/proc/examples_template/template.json b/tests/data/proc/examples_template/template.json index a53ec20df9..43f367e7c0 100644 --- a/tests/data/proc/examples_template/template.json +++ b/tests/data/proc/examples_template/template.json @@ -27,19 +27,19 @@ "_gIndex": 0, "simulation_cell": [ [ - 5.76372622e-10, - 0.0, + 2.732389e-10, + -2.732389e-10, 0.0 ], [ + -2.732389e-10, 0.0, - 5.76372622e-10, - 0.0 + -2.732389e-10 ], [ - 0.0, - 0.0, - 4.0755698899999997e-10 + 2.732389e-10, + 2.732389e-10, + 0.0 ] ], "configuration_periodic_dimensions": [ @@ -49,29 +49,15 @@ ], "atom_positions": [ [ - 2.88186311e-10, - 0.0, - 2.0377849449999999e-10 + 0.0, 0.0, 0.0 ], [ - 0.0, - 2.88186311e-10, - 2.0377849449999999e-10 - ], - [ - 0.0, - 0.0, - 0.0 - ], - [ - 2.88186311e-10, - 2.88186311e-10, - 0.0 + 1.3661901828253802e-10, + -1.36619021014927e-10, + -1.36619021014927e-10 ] ], "atom_labels": [ - "Br", - "K", "Si", "Si" ] @@ -95,7 +81,6 @@ "sampling_method": "geometry_optimization" } ], -UNPARSABLE "section_frame_sequence": [ { "_name": "section_frame_sequence", -- GitLab