source: web/IbidasAtomicServices2.py @ 269

Last change on this file since 269 was 269, checked in by jjbot, 11 years ago

Added constraint handling and logging to AtomicServices2 and IbidasSimpleMessage?.

File size: 8.5 KB
Line 
1import logging
2
3from IbidasSimpleMessage import IbidasSimpleMessage
4
5class AtomicServices:
6
7    LOG_FILENAME = "./ibidas_services.log"
8
9    def __init__(self, cd):
10        self.cd = cd
11        self.logger = None
12        self.__setupLogger()
13        self.logger.debug('Started AtomicServices')
14
15    def __setupLogger(self):
16        """Setup logger for this class."""
17        logging.basicConfig(
18                format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
19                filename=self.LOG_FILENAME,
20                filemode='w'
21        )
22        logger = logging.getLogger('IbidasAtomicServices')
23        logger.setLevel(logging.DEBUG)
24        self.logger = logger
25
26    def getAvailableSets(self, msg=None):
27        """Returns all the available datasets."""
28        self.logger.debug("Called getAvailableSets")
29        if msg is None:
30            msg = IbidasSimpleMessage()
31        sets = self.cd.set[:, ('set_id', 'name')]
32        msg.addSets(sets)
33        print msg.finalize()
34        return msg.finalize()
35
36    def getAvailableItemRelationTypes(self, msg=None):
37        """Returns all the types associated with item_child_links.
38        """
39        self.logger.debug("Called getAvailableItemRelationTypes")
40        if msg is None:
41            msg = IbidasSimpleMessage()
42        types = self.cd.term.join(self.cd.item_child_link, 'term_id', 'type_id').up()
43        types = types.union(types)
44        msg.addTerms(types)
45        return msg.finalize()
46
47    def getAvailableItemTypes(self):
48        """Returns all the types associated with items.
49        """
50        self.logger.debug("Called getAvailableItemTypes")
51        msg = IbidasSimpleMessage()
52        types = self.cd.term.join(self.cd.item, 'term_id', 'type_id').up()
53        types = types.union(types)
54        msg.addTerms(types)
55        return msg.finalize()
56
57    def __addItemContraints(self, query, args):
58        """Adds the set and type constaints to items."""
59        self.logger.debug("__addItemConstraints")
60        if(args.has_key('sets') & (len(args['sets']) > 0)):
61            self.logger.debug("Adding item set contraint")
62            set_ids = [int(x) for x in args['sets']]
63            query = query[_.source_id.within(*set_ids)]
64            self.logger.debug(
65                    "Number of items left after set constraint: "
66                    + str(len(query)))
67        if(args.has_key('itemtypes') & (len(args['itemtypes']) > 0)):
68            self.logger.debug("Adding item type contraint")
69            item_types = args['itemtypes']
70            item_type_ids = [int(x) for x in args['itemtypes']]
71            query = query[_.type_id.within(*item_type_ids)]
72        self.logger.debug("Returning query")
73        return query
74
75    def __addItemlinkConstraints(self, query, args):
76        """Adds the set and type constraints to itemlinks."""
77        self.logger.debug("__addItemlinkConstraints")
78        if(args.has_key('sets') & (len(args['sets']) > 0)):
79            self.logger.debug("Adding link set constraint")
80            set_ids = [int(x) for x in args['sets']]
81            query = query[_.source_id.within(*set_ids)]
82        if(args.has_key('itemrelationtypes') & (len(args['itemrelationtypes']) > 0)):
83            self.logger.debug("Adding link type constraint")
84            type_ids = [int(x) for x in args['itemrelationtypes']]
85            query = query[_.type_id.within(*type_ids)]
86        logger.debug("Returning query")
87        return query
88
89    def getItemChildren(self, args):
90        """Returns all the direct children of the provided items.
91        """
92        self.logger.debug("getItemChildren")
93        assert args.has_key('items'), \
94                'No item_ids provided to search children with.'
95        msg = IbidasSimpleMessage()
96       
97        item_ids = [int(x) for x in args['items']]
98        parents = self.cd.item[_.item_id.within(*item_ids)]
99        self.logger.debug("Number of matched parent items: " + 
100                str(len(parents)))
101
102        links = self.cd.item_child_link.join(parents, 'parent_id', 'item_id')
103        links = self.__addItemlinkConstraints(links, args)
104       
105        children = self.cd.item.join(links, 'item_id', 'child_id').up()
106        self.logger.debug("Nr of children before constraints: " + str(len(children)))
107        children = self.__addItemContraints(children, args)
108        self.logger.debug("Nr of children after constraints: " + str(len(children)))
109       
110        links = links.join(children, 'child_id', 'item_id').up()
111
112        msg.addItems(children)
113        msg.addItemLinks(links)
114
115        return msg.finalize()
116
117    def getItemParents(self, args):
118        """Returs all the direct parents of the provided items.
119        """
120        self.logger.debug("getItemParents")
121        assert args.has_key('items'), \
122                'No item_ids provided to search parents with.'
123        msg = IbidasSimpleMessage()
124        item_ids = [int(x) for x in args['items']]
125        children = self.cd.item[_.item_id.within(*item_ids)]
126        self.logger.debug("Nr of matched child items: " +
127                str(len(children)))
128
129        links = self.cd.item_child_link.join(children, 'child_id', 'item_id')
130        links = self.__addItemlinkConstraints(links, args)
131        parents = self.cd.item.join(links, 'item_id', 'parent_id').up()
132        parents = self.__addItemConstraints(parents, args)
133        links = links.join(parents, 'parent_id', 'item_id')
134        self.logger.debug("Nr of parents found: " + str(len(parents)))
135       
136        msg.addItemLinks(links)
137        msg.addItems(items)
138
139        return msg.finalize()
140
141    def getItemNeighbours(self, args):
142        """Returns all the direct neighbours of the provided items.
143        """
144        self.logger.debug("getItemNeighbours")
145        print args
146        items = args['items']
147        msg = IbidasSimpleMessage()
148        ids = [int(x) for x in items]
149        items = self.cd.item[_.item_id.within(*ids)]
150
151        links = self.cd.item_child_link.join(items, 'parent_id', 'item_id')
152        msg.addItemLinks(links)
153        items = self.cd.item.join(links, 'item_id', 'child_id')
154        msg.addItems(items)
155       
156        links = self.cd.item_child_link.join(items, 'child_id', 'item_id')
157        msg.addItemLinks(links)
158        items = self.cd.item.join(links, 'item_id', 'parent_id')
159        msg.addItems(items)
160
161        return msg.finalize()
162
163    def getItemLinks(self, args):
164        """Returns all the links between the provided items."""
165        # FIXME: add constraints
166        self.logger.debug("Called getItemLinks")
167        msg = IbidasSimpleMessage()
168        assert args.has_key('items'), \
169                "No items provided to get links for."
170        item_ids = [int(x) for x in args['items']]
171        items = self.cd.item[_.item_id.within(*item_ids)]
172        links = self.cd.item_child_link.join(items, 'parent_id', 'item_id').up()
173        links = links.join(items, 'child_id', 'item_id').up()
174        msg.addItemLinks(links)
175
176        return msg.finalize()
177
178    def getItemsByID(self, ids):
179        pass
180
181    def getItemrelationsByID(self, ids):
182        pass
183       
184    def getSetsByID(self, ids):
185        msg = IbidasSimpleMessage()
186        sets = self.cd.set[_.set_id.within(*ids)]
187        msg.addSets(sets)
188        return msg.finalize()
189
190    def getSetsByName(self, names):
191        msg = IbidasSimpleMessage()
192        sets = self.cd.set[_.name.within(*names)]
193        msg.addSets(sets)
194        return msg.finalize()
195
196    def getSetContentBySourceName(self, name):
197        """Returns all the items and links associated with the
198        provided set_name."""
199        setid = self.cd.set[_.name==name]()
200        return self.getSetContentBySourceID(setid)
201
202    def getSetContentBySourceID(self, sourceID):
203        """Returns all the items and links associated with the
204        provided set_id."""
205        source_ids = sourceID['items']
206        self.logger.debug("Called getSetContentBySourceID")
207        self.logger.debug("source_id: " + str(sourceID))
208        msg = IbidasSimpleMessage()
209        items = self.cd.item[_.source_id.within(*source_ids)]
210        items = items[0:500]
211        msg.addItems(items)
212
213        l1 = self.cd.item_child_link.join(items, 'child_id', 'item_id')
214        l1 = l1.up()
215        l1 = l1.join(items, 'parent_id', 'item_id').up()
216        msg.addItemLinks(l1)
217
218        l2 = self.cd.item_child_link.join(items, 'parent_id', 'item_id')
219        l2 = l2.up()
220        l2 = l2.join(items, 'child_id', 'item_id').up()
221        msg.addItemLinks(l2)
222       
223        return msg.finalize()
224
225    def testConnection(self):
226        return "It works!"
227
228    def testConnectionHash(self):
229        msg = {'message': 'It works!'}
230        return msg
Note: See TracBrowser for help on using the repository browser.