src/core/net/sf/basedb/util/listable/AbstractSourceItemTransformer.java

Code
Comments
Other
Rev Date Author Line
6774 17 Mar 15 nicklas 1 /**
6774 17 Mar 15 nicklas 2   $Id$
6774 17 Mar 15 nicklas 3
6774 17 Mar 15 nicklas 4   Copyright (C) 2015 Nicklas Nordborg
6774 17 Mar 15 nicklas 5
6774 17 Mar 15 nicklas 6   This file is part of BASE - BioArray Software Environment.
6774 17 Mar 15 nicklas 7   Available at http://base.thep.lu.se/
6774 17 Mar 15 nicklas 8
6774 17 Mar 15 nicklas 9   BASE is free software; you can redistribute it and/or
6774 17 Mar 15 nicklas 10   modify it under the terms of the GNU General Public License
6774 17 Mar 15 nicklas 11   as published by the Free Software Foundation; either version 3
6774 17 Mar 15 nicklas 12   of the License, or (at your option) any later version.
6774 17 Mar 15 nicklas 13
6774 17 Mar 15 nicklas 14   BASE is distributed in the hope that it will be useful,
6774 17 Mar 15 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
6774 17 Mar 15 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6774 17 Mar 15 nicklas 17   GNU General Public License for more details.
6774 17 Mar 15 nicklas 18
6774 17 Mar 15 nicklas 19   You should have received a copy of the GNU General Public License
6774 17 Mar 15 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
6774 17 Mar 15 nicklas 21 */
6774 17 Mar 15 nicklas 22 package net.sf.basedb.util.listable;
6774 17 Mar 15 nicklas 23
6774 17 Mar 15 nicklas 24
6796 24 Mar 15 nicklas 25 import java.util.ArrayList;
6796 24 Mar 15 nicklas 26 import java.util.HashSet;
6796 24 Mar 15 nicklas 27 import java.util.List;
6796 24 Mar 15 nicklas 28 import java.util.Set;
6796 24 Mar 15 nicklas 29
6796 24 Mar 15 nicklas 30 import net.sf.basedb.core.DbControl;
6796 24 Mar 15 nicklas 31 import net.sf.basedb.core.HibernateUtil;
6774 17 Mar 15 nicklas 32 import net.sf.basedb.core.Item;
6796 24 Mar 15 nicklas 33 import net.sf.basedb.core.ItemQuery;
6796 24 Mar 15 nicklas 34 import net.sf.basedb.core.Type;
6796 24 Mar 15 nicklas 35 import net.sf.basedb.core.dbengine.DbEngine;
6774 17 Mar 15 nicklas 36
6774 17 Mar 15 nicklas 37 /**
6774 17 Mar 15 nicklas 38   Abstract base class for source item transformers that can be useful
6774 17 Mar 15 nicklas 39   for implementing some common functionality.
6774 17 Mar 15 nicklas 40   
6774 17 Mar 15 nicklas 41   @author Nicklas
6774 17 Mar 15 nicklas 42   @since 3.5
6774 17 Mar 15 nicklas 43 */
6774 17 Mar 15 nicklas 44 public abstract class AbstractSourceItemTransformer 
6774 17 Mar 15 nicklas 45   implements SourceItemTransformer 
6774 17 Mar 15 nicklas 46 {
6774 17 Mar 15 nicklas 47
6774 17 Mar 15 nicklas 48   private final Item source;
6774 17 Mar 15 nicklas 49   private final Item target;
6774 17 Mar 15 nicklas 50   
6774 17 Mar 15 nicklas 51   /**
6774 17 Mar 15 nicklas 52     Create a new instance that transforms between the given
6774 17 Mar 15 nicklas 53     source and target item types.
6774 17 Mar 15 nicklas 54   */
6774 17 Mar 15 nicklas 55   protected AbstractSourceItemTransformer(Item source, Item target)
6774 17 Mar 15 nicklas 56   {
6774 17 Mar 15 nicklas 57     this.source = source;
6774 17 Mar 15 nicklas 58     this.target = target;
6774 17 Mar 15 nicklas 59   }
6774 17 Mar 15 nicklas 60     
6774 17 Mar 15 nicklas 61   @Override
6774 17 Mar 15 nicklas 62   public Item getSourceItemType()
6774 17 Mar 15 nicklas 63   {
6774 17 Mar 15 nicklas 64     return source;
6774 17 Mar 15 nicklas 65   }
6774 17 Mar 15 nicklas 66
6774 17 Mar 15 nicklas 67   @Override
6774 17 Mar 15 nicklas 68   public Item getTargetItemType() 
6774 17 Mar 15 nicklas 69   {
6774 17 Mar 15 nicklas 70     return target;
6774 17 Mar 15 nicklas 71   }
6774 17 Mar 15 nicklas 72
6796 24 Mar 15 nicklas 73   /**
6796 24 Mar 15 nicklas 74     Safely execute the query even if the number of values in the 'values' set
6796 24 Mar 15 nicklas 75     is higher than {@link DbEngine#getMaxParametersInQuery()}. In this case, the
6796 24 Mar 15 nicklas 76     values will be divided into subsets and the result of the query is merged
6796 24 Mar 15 nicklas 77     in memory. It is important that the query is such that executing it multiple
6796 24 Mar 15 nicklas 78     times with different subsets return the same result as if it was only executed
6796 24 Mar 15 nicklas 79     a single time with the complete set.
6796 24 Mar 15 nicklas 80     
6796 24 Mar 15 nicklas 81     @param query The query to execut
6796 24 Mar 15 nicklas 82     @param parameterName The name of the parameter to set for the values
6796 24 Mar 15 nicklas 83     @param values The values to use in the query
6796 24 Mar 15 nicklas 84     @return The result of the query.idList() method
6796 24 Mar 15 nicklas 85   */
6796 24 Mar 15 nicklas 86   protected Set<Integer> safeIdList(DbControl dc, ItemQuery<?> query, String parameterName, Set<Integer> values)
6796 24 Mar 15 nicklas 87   {
6796 24 Mar 15 nicklas 88     Set<Integer> allId = new HashSet<Integer>();
6801 25 Mar 15 nicklas 89     int numValues = values.size();
6796 24 Mar 15 nicklas 90     int maxParameters = HibernateUtil.getDbEngine().getMaxParametersInQuery();
6796 24 Mar 15 nicklas 91     
6796 24 Mar 15 nicklas 92     if (numValues > maxParameters)
6796 24 Mar 15 nicklas 93     {
6796 24 Mar 15 nicklas 94       List<Integer> full = new ArrayList<Integer>(values);
6796 24 Mar 15 nicklas 95       int startIndex = 0;
6796 24 Mar 15 nicklas 96       int endIndex = Math.min(maxParameters, numValues);
6796 24 Mar 15 nicklas 97       while (startIndex < numValues)
6796 24 Mar 15 nicklas 98       {
6796 24 Mar 15 nicklas 99         query.setParameter(parameterName, full.subList(startIndex, endIndex), Type.INT);
6796 24 Mar 15 nicklas 100         allId.addAll(query.idList(dc));
6796 24 Mar 15 nicklas 101         startIndex = endIndex;
6796 24 Mar 15 nicklas 102         endIndex = Math.min(startIndex + maxParameters, numValues);
6796 24 Mar 15 nicklas 103       }
6796 24 Mar 15 nicklas 104     }
6801 25 Mar 15 nicklas 105     else if (numValues > 0)
6796 24 Mar 15 nicklas 106     {
6796 24 Mar 15 nicklas 107       query.setParameter(parameterName, values, Type.INT);
6796 24 Mar 15 nicklas 108       allId.addAll(query.idList(dc));
6796 24 Mar 15 nicklas 109     }
6796 24 Mar 15 nicklas 110     return allId;
6796 24 Mar 15 nicklas 111   }
6774 17 Mar 15 nicklas 112
6774 17 Mar 15 nicklas 113 }