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