code: def _query_names(self, names):
          
  
          def chunks(l, n):
              """Yield successive n-sized chunks from l."""
              for i in range(0, len(l), n):
                  yield l[i:i + n]
  
          products = {}
          # 40 names per query fits reasonably well inside the query limit
          for chunk in chunks(names, 40):
              query = " OR ".join(chunk)
              products.update(self.query(raw=query))
  
          # Group the products
          output = OrderedDict((name, dict()) for name in names)
          for id, metadata in products.items():
              name = metadata['identifier']
              output[name][id] = metadata
  
          return output
docs: Find products by their names, e.g.
          S1A_EW_GRDH_1SDH_20141003T003840_20141003T003920_002658_002F54_4DD1.
  
          Note that duplicates exist on server, so multiple products can be returned for each name.
  
          Parameters
          ----------
          names : list[string]
              List of product names.
  
          Returns
          -------
          dict[string, dict[str, dict]]
              A dictionary mapping each name to a dictionary which contains the products with
              that name (with ID as the key).