class SearchServiceIterable(SearchService):
    """A SearchService that can be used as an iterator"""
    def __init__(self, service_manager, name, query=None):
        """Constructor for Service."""

        super(SearchServiceIterable, self).__init__(service_manager, name)

        # for iterator
        self.query = query
        self.resultsBuffer = Response()
        # This is an indication about the Response is not a real response, and we need to ask for a real response in Next
        self.resultsBuffer.feed['opensearch_totalresults'] = sys.maxint
        self.next_result = 0

    def set_query(self, query):
        """
      Sets the query

      It is mandatory to set a query, here or in the constractor. 
    """
        self.query = query

    def __iter__(self):
        """
    Iterator member function
    
    Parameters:
    
    * None
    
    Returns:
    
    * An iterarator for the object, in this case, the object itself
    """
        return self

    def next(self):
        """
    Iterator member function
    
    Parameters:
    
    * None
    
    Returns:
    
    * The next item of the iterator, the next entry in the results
    """
        #print " total results  ", self.resultsBuffer.get_totalresults()
        #print " items per page ", self.resultsBuffer.get_itemsperpage()
        if self.query == None:
            print "None to search!!"
            #None to search!! The loop has finished
            raise StopIteration
        if len(self.resultsBuffer.entries) == 0:
            #print self.resultsBuffer.get_totalresults(), " == ", self.next_result
            if (int(self.resultsBuffer.get_totalresults()) <=
                    self.next_result):
                raise StopIteration
            self.resultsBuffer = self.search(self.query, self.next_result)
            self.next_result += int(self.resultsBuffer.get_itemsperpage())

        if len(self.resultsBuffer.entries) == 0:
            raise StopIteration
        else:
            return self.resultsBuffer.entries.pop(0)

    def pull(self, numberItems):
        """
    Iterator member function. It gives a list of results.

    Note: Usually, "pull" returns an iterator. Here it returns a list (that, in turn, is iterable), The reason is
    that the list is easy to store in a variable. It is the only easy way to repear the results, because when
    the exclusion filter change el number of responses, going backwards  
    
    Parameters:
    
    * NumberItems: Number of demanded items
    
    Returns:
    
    * A list with the next numberItems items.
    """
        listItems = []
        for i, item in enumerate(self):
            if i < numberItems:
                listItems.append(item)
            else:
                break
        return listItems
Example #2
0
class SearchServiceIterable(SearchService):
  """A SearchService that can be used as an iterator"""
  
  def __init__(self, service_manager, name, query=None):
    """Constructor for Service."""

    super(SearchServiceIterable,self).__init__(service_manager,name)


    # for iterator
    self.query = query
    self.resultsBuffer = Response()
    # This is an indication about the Response is not a real response, and we need to ask for a real response in Next
    self.resultsBuffer.feed['opensearch_totalresults'] = sys.maxint
    self.next_result = 0    

  def set_query(self,query):
    """
      Sets the query

      It is mandatory to set a query, here or in the constractor. 
    """
    self.query = query

  def __iter__(self):
    """
    Iterator member function
    
    Parameters:
    
    * None
    
    Returns:
    
    * An iterarator for the object, in this case, the object itself
    """
    return self

  def next(self):
    """
    Iterator member function
    
    Parameters:
    
    * None
    
    Returns:
    
    * The next item of the iterator, the next entry in the results
    """
    #print " total results  ", self.resultsBuffer.get_totalresults()
    #print " items per page ", self.resultsBuffer.get_itemsperpage()
    if self.query == None:
      print "None to search!!"
      #None to search!! The loop has finished
      raise StopIteration
    if len(self.resultsBuffer.entries) == 0:
      #print self.resultsBuffer.get_totalresults(), " == ", self.next_result
      if (int(self.resultsBuffer.get_totalresults()) <= self.next_result):
        raise StopIteration
      self.resultsBuffer = self.search(self.query, self.next_result)
      self.next_result += int(self.resultsBuffer.get_itemsperpage())

    if len(self.resultsBuffer.entries) == 0:
      raise StopIteration
    else:
      return self.resultsBuffer.entries.pop(0)
      

  def pull(self, numberItems):
    """
    Iterator member function. It gives a list of results.

    Note: Usually, "pull" returns an iterator. Here it returns a list (that, in turn, is iterable), The reason is
    that the list is easy to store in a variable. It is the only easy way to repear the results, because when
    the exclusion filter change el number of responses, going backwards  
    
    Parameters:
    
    * NumberItems: Number of demanded items
    
    Returns:
    
    * A list with the next numberItems items.
    """        
    listItems = []
    for i,item in enumerate(self):
      if i < numberItems:
        listItems.append(item)
      else:
        break
    return listItems