def _build(self): """ This function does not yield anything only when the new state is 'streaming' :return: """ timestamp = calendar.timegm(dt.now().timetuple()) lock = r.lock('fragments:{}:lock'.format(self.sink.fragment_id), lock_class=Lock) lock.acquire() fragment = None try: fragment, stream = self.fragment(stream=True, timestamp=timestamp) if stream: self.sink.stream = True if fragment: self.sink.delivery = 'mixing' else: self.sink.delivery = 'streaming' else: if fragment: self.sink.delivery = 'pushing' log.debug('Fragment retrieved from cache for request number {}'.format(self._request_id)) else: self.sink.delivery = 'sent' log.debug('Sending end stream signal since there is no fragment and stream is disabled') yield (), {'state': 'end'} self.sink.stream = False except Exception as e: log.warning(e.message) self.sink.stream = True self.sink.delivery = 'streaming' finally: lock.release() if fragment: log.info('Building a stream result from cache for request number {}...'.format(self._request_id)) for ch in chunks(fragment, 1000): if ch: yield [(map_variables(c, self.sink.mapping), s.n3(), p.n3(), o.n3()) for (c, s, p, o) in ch], {'source': 'store'} lock.acquire() try: if self.sink.delivery == 'pushing' or (self.sink.delivery == 'mixing' and not self.sink.stream): self.sink.delivery = 'sent' log.info( 'The response stream of request {} is completed. Notifying...'.format(self.sink.request_id)) yield (), {'state': 'end'} elif self.sink.delivery == 'mixing' and self.sink.stream: self.sink.delivery = 'streaming' finally: lock.release()
def _build(self): fragment, _ = self.fragment(result_set=True) log.debug('Building a query result for request number {}'.format(self._request_id)) try: variables = filter(lambda x: not x.startswith('_'), map(lambda v: v.lstrip('?'), filter(lambda x: x.startswith('?'), self.sink.preferred_labels))) for ch in chunks(fragment, 100): result_rows = [] for t in ch: if any(t): result_row = {v: t[v] for v in variables} result_rows.append(result_row) if result_rows: yield json.dumps(result_rows), {'state': 'streaming', 'source': 'store', 'response_to': self.sink.message_id, 'submitted_on': calendar.timegm(datetime.now().timetuple()), 'submitted_by': self.sink.submitted_by} except Exception, e: log.error(e.message) raise