def test_with_subclasses(self, computer): extra_name = self.__class__.__name__ + "/test_with_subclasses" calc_params = { 'computer': computer, 'resources': { 'num_machines': 1, 'num_mpiprocs_per_machine': 1 } } TemplateReplacerCalc = CalculationFactory( 'simpleplugins.templatereplacer') ParameterData = DataFactory('parameter') a1 = JobCalculation(**calc_params).store() # To query only these nodes later a1.set_extra(extra_name, True) a2 = TemplateReplacerCalc(**calc_params).store() # To query only these nodes later a2.set_extra(extra_name, True) a3 = Data().store() a3.set_extra(extra_name, True) a4 = ParameterData(dict={'a': 'b'}).store() a4.set_extra(extra_name, True) a5 = Node().store() a5.set_extra(extra_name, True) # I don't set the extras, just to be sure that the filtering works # The filtering is needed because other tests will put stuff int he DB a6 = JobCalculation(**calc_params) a6.store() a7 = Node() a7.store() # Query by calculation results = list(JobCalculation.query(dbextras__key=extra_name)) # a3, a4, a5 should not be found because they are not JobCalculations. # a6, a7 should not be found because they have not the attribute set. self.assertEquals(set([i.pk for i in results]), set([a1.pk, a2.pk])) # Same query, but by the generic Node class results = list(Node.query(dbextras__key=extra_name)) self.assertEquals(set([i.pk for i in results]), set([a1.pk, a2.pk, a3.pk, a4.pk, a5.pk])) # Same query, but by the Data class results = list(Data.query(dbextras__key=extra_name)) self.assertEquals(set([i.pk for i in results]), set([a3.pk, a4.pk])) # Same query, but by the ParameterData subclass results = list(ParameterData.query(dbextras__key=extra_name)) self.assertEquals(set([i.pk for i in results]), set([a4.pk])) # Same query, but by the TemplateReplacerCalc subclass results = list(TemplateReplacerCalc.query(dbextras__key=extra_name)) self.assertEquals(set([i.pk for i in results]), set([a2.pk]))
def run_listislands(self, *args): """ List all AiiDA nodes, that have no parents and children. """ load_dbenv() from django.db.models import Q from aiida.orm.node import Node from aiida.backends.utils import get_automatic_user q_object = Q(user=get_automatic_user()) q_object.add(Q(parents__isnull=True), Q.AND) q_object.add(Q(children__isnull=True), Q.AND) node_list = Node.query(q_object).distinct().order_by('ctime') print "ID\tclass" for node in node_list: print "{}\t{}".format(node.pk, node.__class__.__name__)
def test_links_and_queries(self): from aiida.backends.djsite.db.models import DbNode, DbLink a = Node() a._set_attr('myvalue', 123) a.store() a2 = Node().store() a3 = Node() a3._set_attr('myvalue', 145) a3.store() a4 = Node().store() a2.add_link_from(a) a3.add_link_from(a2) a4.add_link_from(a2) a4.add_link_from(a3) b = Node.query(pk=a2) self.assertEquals(len(b), 1) # It is a aiida.orm.Node instance self.assertTrue(isinstance(b[0], Node)) self.assertEquals(b[0].uuid, a2.uuid) going_out_from_a2 = Node.query(inputs__in=b) # Two nodes going out from a2 self.assertEquals(len(going_out_from_a2), 2) self.assertTrue(isinstance(going_out_from_a2[0], Node)) self.assertTrue(isinstance(going_out_from_a2[1], Node)) uuid_set = set([going_out_from_a2[0].uuid, going_out_from_a2[1].uuid]) # I check that I can query also directly the django DbNode # class passing a aiida.orm.Node entity going_out_from_a2_db = DbNode.objects.filter(inputs__in=b) self.assertEquals(len(going_out_from_a2_db), 2) self.assertTrue(isinstance(going_out_from_a2_db[0], DbNode)) self.assertTrue(isinstance(going_out_from_a2_db[1], DbNode)) uuid_set_db = set( [going_out_from_a2_db[0].uuid, going_out_from_a2_db[1].uuid]) # I check that doing the query with a Node or DbNode instance, # I get the same nodes self.assertEquals(uuid_set, uuid_set_db) # This time I don't use the __in filter, but I still pass a Node instance going_out_from_a2_bis = Node.query(inputs=b[0]) self.assertEquals(len(going_out_from_a2_bis), 2) self.assertTrue(isinstance(going_out_from_a2_bis[0], Node)) self.assertTrue(isinstance(going_out_from_a2_bis[1], Node)) # Query for links starting from b[0]==a2 using again the Node class output_links_b = DbLink.objects.filter(input=b[0]) self.assertEquals(len(output_links_b), 2) self.assertTrue(isinstance(output_links_b[0], DbLink)) self.assertTrue(isinstance(output_links_b[1], DbLink)) uuid_set_db_link = set( [output_links_b[0].output.uuid, output_links_b[1].output.uuid]) self.assertEquals(uuid_set, uuid_set_db_link) # Query for related fields using django syntax # Note that being myvalue an attribute, it is internally stored starting # with an underscore nodes_with_given_attribute = Node.query(dbattributes__key='myvalue', dbattributes__ival=145) # should be entry a3 self.assertEquals(len(nodes_with_given_attribute), 1) self.assertTrue(isinstance(nodes_with_given_attribute[0], Node)) self.assertEquals(nodes_with_given_attribute[0].uuid, a3.uuid)
def test_links_and_queries(self): a = Node() a._set_attr('myvalue', 123) a.store() a2 = Node().store() a3 = Node() a3._set_attr('myvalue', 145) a3.store() a4 = Node().store() a2.add_link_from(a) a3.add_link_from(a2) a4.add_link_from(a2) a4.add_link_from(a3) b = Node.query(id=a2.id).all() self.assertEquals(len(b), 1) # It is a aiida.orm.Node instance self.assertTrue(isinstance(b[0], Node)) self.assertEquals(b[0].uuid, a2.uuid) going_out_from_a2 = Node.query(inputs__id__in=[_.id for _ in b]).all() # Two nodes going out from a2 self.assertEquals(len(going_out_from_a2), 2) self.assertTrue(isinstance(going_out_from_a2[0], Node)) self.assertTrue(isinstance(going_out_from_a2[1], Node)) uuid_set = set([going_out_from_a2[0].uuid, going_out_from_a2[1].uuid]) # I check that I can query also directly the django DbNode # class passing a aiida.orm.Node entity # # XXX SP: we can't do this using SqlAlchemy => pass a Node instance and # # expect a filter on the DbNode id # going_out_from_a2_db = DbNode.query.filter(DbNode.inputs.in_(b)).all() # self.assertEquals(len(going_out_from_a2_db), 2) # self.assertTrue(isinstance(going_out_from_a2_db[0], DbNode)) # self.assertTrue(isinstance(going_out_from_a2_db[1], DbNode)) # uuid_set_db = set([going_out_from_a2_db[0].uuid, # going_out_from_a2_db[1].uuid]) # # # I check that doing the query with a Node or DbNode instance, # # I get the same nodes # self.assertEquals(uuid_set, uuid_set_db) # # # This time I don't use the __in filter, but I still pass a Node instance # going_out_from_a2_bis = Node.query(inputs=b[0]).all() # self.assertEquals(len(going_out_from_a2_bis), 2) # self.assertTrue(isinstance(going_out_from_a2_bis[0], Node)) # self.assertTrue(isinstance(going_out_from_a2_bis[1], Node)) # # # Query for links starting from b[0]==a2 using again the Node class # output_links_b = DbLink.query.filter_by(input=b[0]) # self.assertEquals(len(output_links_b), 2) # self.assertTrue(isinstance(output_links_b[0], DbLink)) # self.assertTrue(isinstance(output_links_b[1], DbLink)) # uuid_set_db_link = set([output_links_b[0].output.uuid, # output_links_b[1].output.uuid]) # self.assertEquals(uuid_set, uuid_set_db_link) # Query for related fields using django syntax # Note that being myvalue an attribute, it is internally stored starting # with an underscore nodes_with_given_attribute = Node.query(dbattributes__key='myvalue', dbattributes__ival=145).all() # should be entry a3 self.assertEquals(len(nodes_with_given_attribute), 1) self.assertTrue(isinstance(nodes_with_given_attribute[0], Node)) self.assertEquals(nodes_with_given_attribute[0].uuid, a3.uuid)