source: web/IbidasAtomicServices2.py @ 272

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

Added filter to getItemlinks.

File size: 9.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                    "Nr of items left after item 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            print query.fields.name
81            self.logger.debug("Nr of links before link set constraint: "
82                    + str(len(query)))
83            set_ids = [int(x) for x in args['sets']]
84            query = query[_.source_id.within(*set_ids)]
85        self.logger.debug("Nr of links after link set constraint: "
86                + str(len(query)))
87        #if(args.has_key('itemrelationtypes') & (len(args['itemrelationtypes']) > 0)):
88        #    self.logger.debug("Adding link type constraint")
89        #    type_ids = [int(x) for x in args['itemrelationtypes']]
90        #    query = query[_.type_id.within(*type_ids)]
91        self.logger.debug("Returning query")
92        return query
93
94    def getItemChildren(self, args):
95        """Returns all the direct children of the provided items.
96        """
97        self.logger.debug("Called getItemChildren")
98        self.logger.debug("Provided arguments: " + str(args.keys()))
99        assert args.has_key('items'), \
100                'No item_ids provided to search children with.'
101        msg = IbidasSimpleMessage()
102       
103        item_ids = [int(x) for x in args['items']]
104        parents = self.cd.item[_.item_id.within(*item_ids)]
105        self.logger.debug("Number of matched parent items: " + 
106                str(len(parents)))
107
108        links = self.cd.item_child_link.join(parents, 'parent_id', 'item_id').up()
109        links = self.__addItemlinkConstraints(links, args)
110       
111        children = self.cd.item.join(links, 'item_id', 'child_id').up()
112        self.logger.debug("Nr of children before constraints: " + str(len(children)))
113        children = self.__addItemContraints(children, args)
114        self.logger.debug("Nr of children after constraints: " + str(len(children)))
115       
116        links = links.join(children, 'child_id', 'item_id').up()
117
118        msg.addItems(children)
119        msg.addItemLinks(links)
120
121        return msg.finalize()
122
123    def getItemParents(self, args):
124        """Returs all the direct parents of the provided items.
125        """
126        self.logger.debug("getItemParents")
127        self.logger.debug("Provided arguments: " + str(args.keys()))
128        assert args.has_key('items'), \
129                'No item_ids provided to search parents with.'
130        msg = IbidasSimpleMessage()
131        item_ids = [int(x) for x in args['items']]
132        children = self.cd.item[_.item_id.within(*item_ids)]
133        self.logger.debug("Nr of matched child items: " +
134                str(len(children)))
135
136        links = self.cd.item_child_link.join(children, 'child_id', 'item_id').up()
137        links = self.__addItemlinkConstraints(links, args)
138        parents = self.cd.item.join(links, 'item_id', 'parent_id').up()
139        parents = self.__addItemConstraints(parents, args)
140        links = links.join(parents, 'parent_id', 'item_id').up()
141        self.logger.debug("Nr of parents found: " + str(len(parents)))
142       
143        msg.addItemLinks(links)
144        msg.addItems(items)
145
146        return msg.finalize()
147
148    def getItemNeighbours(self, args):
149        """Returns all the direct neighbours of the provided items.
150        """
151        self.logger.debug("getItemNeighbours")
152        self.logger.debug("Provided arguments: " + str(args.keys()))
153        print args
154        items = args['items']
155        msg = IbidasSimpleMessage()
156        ids = [int(x) for x in items]
157        items = self.cd.item[_.item_id.within(*ids)]
158
159        links = self.cd.item_child_link.join(items, 'parent_id', 'item_id').up()
160        msg.addItemLinks(links)
161        items = self.cd.item.join(links, 'item_id', 'child_id').up()
162        msg.addItems(items)
163       
164        links = self.cd.item_child_link.join(items, 'child_id', 'item_id').up()
165        msg.addItemLinks(links)
166        items = self.cd.item.join(links, 'item_id', 'parent_id').up()
167        msg.addItems(items)
168
169        return msg.finalize()
170
171    def getItemLinks(self, args):
172        """Returns all the links between the provided items."""
173        self.logger.debug("Called getItemLinks")
174        self.logger.debug("Provided arguments: " + str(args.keys()))
175        msg = IbidasSimpleMessage()
176        assert args.has_key('items'), \
177                "No items provided to get links for."
178        item_ids = [int(x) for x in args['items']]
179        items = self.cd.item[_.item_id.within(*item_ids)]
180        links = self.cd.item_child_link.join(items, 'parent_id', 'item_id').up()
181        links = links.join(items, 'child_id', 'item_id').up()
182        links = self.__addItemlinkConstraints(links, args)
183        msg.addItemLinks(links)
184
185        return msg.finalize()
186
187    def getItemsByID(self, args):
188        # FIXME: should we still filter on constraints?
189        self.logger.debug("Called getItemsByID")
190        self.logger.debug("Provided arguments: " + str(args.keys()))
191        msg = IbidasSimpleMessage()
192        assert args.has_key('items'), \
193                "No item_ids provided to fetch."
194        item_ids = [int(x) for x in args['items']]
195        items = self.cd.item[_.item_id.within(*item_ids)]
196        msg.addItems(items)
197        return msg.finalize()
198
199    def getItemrelationsByID(self, ids):
200        pass
201       
202    def getSetsByID(self, ids):
203        msg = IbidasSimpleMessage()
204        sets = self.cd.set[_.set_id.within(*ids)]
205        msg.addSets(sets)
206        return msg.finalize()
207
208    def getSetsByName(self, names):
209        msg = IbidasSimpleMessage()
210        sets = self.cd.set[_.name.within(*names)]
211        msg.addSets(sets)
212        return msg.finalize()
213
214    def getSetContentBySourceName(self, name):
215        """Returns all the items and links associated with the
216        provided set_name."""
217        setid = self.cd.set[_.name==name]()
218        return self.getSetContentBySourceID(setid)
219
220    def getSetContentBySourceID(self, sourceID):
221        """Returns all the items and links associated with the
222        provided set_id."""
223        source_ids = sourceID['items']
224        self.logger.debug("Called getSetContentBySourceID")
225        self.logger.debug("source_id: " + str(sourceID))
226        msg = IbidasSimpleMessage()
227        items = self.cd.item[_.source_id.within(*source_ids)]
228        items = items[0:500]
229        msg.addItems(items)
230
231        l1 = self.cd.item_child_link.join(items, 'child_id', 'item_id')
232        l1 = l1.up()
233        l1 = l1.join(items, 'parent_id', 'item_id').up()
234        msg.addItemLinks(l1)
235
236        l2 = self.cd.item_child_link.join(items, 'parent_id', 'item_id')
237        l2 = l2.up()
238        l2 = l2.join(items, 'child_id', 'item_id').up()
239        msg.addItemLinks(l2)
240       
241        return msg.finalize()
242
243    def testConnection(self):
244        return "It works!"
245
246    def testConnectionHash(self):
247        msg = {'message': 'It works!'}
248        return msg
Note: See TracBrowser for help on using the repository browser.