src/core/net/sf/basedb/util/query/MultiQueryIterator.java

Code
Comments
Other
Rev Date Author Line
6091 24 Aug 12 nicklas 1 /**
6091 24 Aug 12 nicklas 2   $Id $
6091 24 Aug 12 nicklas 3
6091 24 Aug 12 nicklas 4   Copyright (C) 2012 Nicklas Nordborg
6091 24 Aug 12 nicklas 5
6091 24 Aug 12 nicklas 6   This file is part of BASE - BioArray Software Environment.
6091 24 Aug 12 nicklas 7   Available at http://base.thep.lu.se/
6091 24 Aug 12 nicklas 8
6091 24 Aug 12 nicklas 9   BASE is free software; you can redistribute it and/or
6091 24 Aug 12 nicklas 10   modify it under the terms of the GNU General Public License
6091 24 Aug 12 nicklas 11   as published by the Free Software Foundation; either version 3
6091 24 Aug 12 nicklas 12   of the License, or (at your option) any later version.
6091 24 Aug 12 nicklas 13
6091 24 Aug 12 nicklas 14   BASE is distributed in the hope that it will be useful,
6091 24 Aug 12 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
6091 24 Aug 12 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6091 24 Aug 12 nicklas 17   GNU General Public License for more details.
6091 24 Aug 12 nicklas 18
6091 24 Aug 12 nicklas 19   You should have received a copy of the GNU General Public License
6091 24 Aug 12 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
6091 24 Aug 12 nicklas 21 */
6091 24 Aug 12 nicklas 22 package net.sf.basedb.util.query;
6091 24 Aug 12 nicklas 23
6091 24 Aug 12 nicklas 24 import java.util.Iterator;
6091 24 Aug 12 nicklas 25
6091 24 Aug 12 nicklas 26 import net.sf.basedb.core.BasicItem;
6091 24 Aug 12 nicklas 27 import net.sf.basedb.core.DbControl;
6091 24 Aug 12 nicklas 28 import net.sf.basedb.core.ItemQuery;
6091 24 Aug 12 nicklas 29
6091 24 Aug 12 nicklas 30
6091 24 Aug 12 nicklas 31 /**
6091 24 Aug 12 nicklas 32   Helper class for executing multiple queries and return the result as 
6091 24 Aug 12 nicklas 33   a single iterator. The queries are executed in the order that they 
6091 24 Aug 12 nicklas 34   are given, if a query doesn't return any result, the iterator continues
6091 24 Aug 12 nicklas 35   with the next query. As soon as a query returns at least one
6091 24 Aug 12 nicklas 36   result, no more queries are executed.
6091 24 Aug 12 nicklas 37   
6091 24 Aug 12 nicklas 38   @author nicklas
6091 24 Aug 12 nicklas 39   @since 3.2
6091 24 Aug 12 nicklas 40 */
6091 24 Aug 12 nicklas 41 public class MultiQueryIterator<E extends BasicItem> 
6091 24 Aug 12 nicklas 42   implements Iterator<E>
6091 24 Aug 12 nicklas 43 {
6091 24 Aug 12 nicklas 44
6091 24 Aug 12 nicklas 45   /**
6091 24 Aug 12 nicklas 46     Create a new iterator for the given list of queries. There must
6091 24 Aug 12 nicklas 47     be at least one query.
6091 24 Aug 12 nicklas 48     @param dc The DbControl to use when executing the queries
6091 24 Aug 12 nicklas 49     @param queries An array of queries to execute
6091 24 Aug 12 nicklas 50   */
6125 14 Sep 12 nicklas 51   @SafeVarargs
6091 24 Aug 12 nicklas 52   public static <E extends BasicItem> Iterator<E> get(DbControl dc, ItemQuery<? extends E>... queries)
6091 24 Aug 12 nicklas 53   {
6091 24 Aug 12 nicklas 54     if (queries == null || queries.length == 0)
6091 24 Aug 12 nicklas 55     {
6091 24 Aug 12 nicklas 56       throw new NullPointerException("queries");
6091 24 Aug 12 nicklas 57     }
6091 24 Aug 12 nicklas 58     return new MultiQueryIterator<E>(dc, queries);
6091 24 Aug 12 nicklas 59   }
6091 24 Aug 12 nicklas 60   
6091 24 Aug 12 nicklas 61   private final DbControl dc;
6091 24 Aug 12 nicklas 62   private final ItemQuery<? extends E>[] queries;
6091 24 Aug 12 nicklas 63   
6091 24 Aug 12 nicklas 64   private Iterator<? extends E> current;
6091 24 Aug 12 nicklas 65   private int nextQuery;
6091 24 Aug 12 nicklas 66   private int numReturned;
6091 24 Aug 12 nicklas 67   
6873 16 Apr 15 nicklas 68   private MultiQueryIterator(DbControl dc, ItemQuery<? extends E>[] queries)
6091 24 Aug 12 nicklas 69   {
6091 24 Aug 12 nicklas 70     this.dc = dc;
6091 24 Aug 12 nicklas 71     this.queries = queries;
6091 24 Aug 12 nicklas 72     this.current = queries[0].iterate(dc);
6091 24 Aug 12 nicklas 73     nextQuery = 1;
6091 24 Aug 12 nicklas 74   }
6091 24 Aug 12 nicklas 75   
6091 24 Aug 12 nicklas 76   /*
6091 24 Aug 12 nicklas 77     From the Iterator interface
6091 24 Aug 12 nicklas 78     ---------------------------
6091 24 Aug 12 nicklas 79   */
6091 24 Aug 12 nicklas 80   @Override
6091 24 Aug 12 nicklas 81   public boolean hasNext() 
6091 24 Aug 12 nicklas 82   {
6091 24 Aug 12 nicklas 83     while (!current.hasNext() && nextQuery < queries.length)
6091 24 Aug 12 nicklas 84     {
6091 24 Aug 12 nicklas 85       if (numReturned > 0) return false;
6091 24 Aug 12 nicklas 86       if (queries[nextQuery] != null) 
6091 24 Aug 12 nicklas 87       {
6091 24 Aug 12 nicklas 88         current = queries[nextQuery].iterate(dc);
6091 24 Aug 12 nicklas 89       }
6091 24 Aug 12 nicklas 90       nextQuery++;
6091 24 Aug 12 nicklas 91     }
6091 24 Aug 12 nicklas 92     return current.hasNext();
6091 24 Aug 12 nicklas 93   }
6091 24 Aug 12 nicklas 94
6091 24 Aug 12 nicklas 95   @Override
6091 24 Aug 12 nicklas 96   public E next() 
6091 24 Aug 12 nicklas 97   {
6091 24 Aug 12 nicklas 98     if (hasNext()) numReturned++;
6091 24 Aug 12 nicklas 99     return current.next();
6091 24 Aug 12 nicklas 100   }
6091 24 Aug 12 nicklas 101
6091 24 Aug 12 nicklas 102   @Override
6091 24 Aug 12 nicklas 103   public void remove() 
6091 24 Aug 12 nicklas 104   {
6091 24 Aug 12 nicklas 105     throw new UnsupportedOperationException();
6091 24 Aug 12 nicklas 106   }
6091 24 Aug 12 nicklas 107   // ------------------------------
6091 24 Aug 12 nicklas 108   
6091 24 Aug 12 nicklas 109 }