src/core/net/sf/basedb/util/listable/SampleToChildSampleTransformer.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 import java.util.HashSet;
6774 17 Mar 15 nicklas 25 import java.util.Set;
6774 17 Mar 15 nicklas 26
6774 17 Mar 15 nicklas 27 import net.sf.basedb.core.DbControl;
6774 17 Mar 15 nicklas 28 import net.sf.basedb.core.Item;
6774 17 Mar 15 nicklas 29 import net.sf.basedb.core.ItemQuery;
6774 17 Mar 15 nicklas 30 import net.sf.basedb.core.Sample;
6774 17 Mar 15 nicklas 31 import net.sf.basedb.core.query.Expressions;
6774 17 Mar 15 nicklas 32 import net.sf.basedb.core.query.Hql;
6774 17 Mar 15 nicklas 33 import net.sf.basedb.core.query.Restrictions;
6774 17 Mar 15 nicklas 34
6774 17 Mar 15 nicklas 35 /**
6774 17 Mar 15 nicklas 36   Source item transformer implementation that transform sample items to their
6774 17 Mar 15 nicklas 37   child sample items. From the given set of sample ID:s the transformer will
6774 17 Mar 15 nicklas 38   recursively load as many child samples as possible. The source items
6774 17 Mar 15 nicklas 39   may optionally be included in the target set.
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 class SampleToChildSampleTransformer 
6774 17 Mar 15 nicklas 45   extends AbstractSourceItemTransformer
6774 17 Mar 15 nicklas 46 {
6774 17 Mar 15 nicklas 47
6774 17 Mar 15 nicklas 48   private final boolean includeSourcesInTarget;
8094 04 Nov 22 nicklas 49   private final boolean pushOnly;
6774 17 Mar 15 nicklas 50   
6774 17 Mar 15 nicklas 51   /**
6774 17 Mar 15 nicklas 52     Create a new sample to child sample transformer.
6774 17 Mar 15 nicklas 53     @param includeSourcesInTarget TRUE to include the source items in the target
6774 17 Mar 15 nicklas 54   */
6774 17 Mar 15 nicklas 55   public SampleToChildSampleTransformer(boolean includeSourcesInTarget) 
6774 17 Mar 15 nicklas 56   {
8094 04 Nov 22 nicklas 57     this(includeSourcesInTarget, false);
8094 04 Nov 22 nicklas 58   }
8094 04 Nov 22 nicklas 59   /**
8094 04 Nov 22 nicklas 60     Create a new sample to child sample transformer that only load children that
8094 04 Nov 22 nicklas 61     has a subtype with "push annotations" set. 
8094 04 Nov 22 nicklas 62     @since 3.19.5
8094 04 Nov 22 nicklas 63   */
8094 04 Nov 22 nicklas 64   public SampleToChildSampleTransformer(boolean includeSourcesInTarget, boolean childrensThatPushOnly)
8094 04 Nov 22 nicklas 65   {
6774 17 Mar 15 nicklas 66     super(Item.SAMPLE, Item.SAMPLE);
6774 17 Mar 15 nicklas 67     this.includeSourcesInTarget = includeSourcesInTarget;
8094 04 Nov 22 nicklas 68     this.pushOnly = childrensThatPushOnly;
6774 17 Mar 15 nicklas 69   }
8094 04 Nov 22 nicklas 70
6774 17 Mar 15 nicklas 71   @Override
6774 17 Mar 15 nicklas 72   public Set<Integer> transform(TransformContext context, Set<Integer> source) 
6774 17 Mar 15 nicklas 73   {
6774 17 Mar 15 nicklas 74     DbControl dc = context.getDbControl();
6774 17 Mar 15 nicklas 75     
6774 17 Mar 15 nicklas 76     ItemQuery<Sample> query = Sample.getQuery();
6848 13 Apr 15 nicklas 77     query.setIncludes(context.getInclude());
6796 24 Mar 15 nicklas 78     // Samples with a sample as parent
6796 24 Mar 15 nicklas 79     query.restrict(Restrictions.eq(Hql.property("parentType"), Expressions.integer(Item.SAMPLE.getValue())));
6774 17 Mar 15 nicklas 80     query.join(Hql.innerJoin("creationEvent", "ce"));
6774 17 Mar 15 nicklas 81     query.join(Hql.innerJoin("ce", "sources", "sbm"));
6774 17 Mar 15 nicklas 82     query.join(Hql.innerJoin("sbm", "bioMaterial", "bm"));
6774 17 Mar 15 nicklas 83     query.restrict(
6774 17 Mar 15 nicklas 84       Restrictions.in(
6774 17 Mar 15 nicklas 85         Hql.alias("bm"), 
6774 17 Mar 15 nicklas 86         Expressions.parameter("parents")
6774 17 Mar 15 nicklas 87       ));
8094 04 Nov 22 nicklas 88     if (pushOnly)
8094 04 Nov 22 nicklas 89     {
8094 04 Nov 22 nicklas 90       query.join(Hql.innerJoin("itemSubtype", "st"));
8094 04 Nov 22 nicklas 91       query.restrict(Restrictions.eq(Hql.property("st", "pushAnnotations"), Expressions.bool(true)));
8094 04 Nov 22 nicklas 92     }
6774 17 Mar 15 nicklas 93
6774 17 Mar 15 nicklas 94     // Keep track of all seen children and parents
6774 17 Mar 15 nicklas 95     Set<Integer> allParents = new HashSet<Integer>();
6774 17 Mar 15 nicklas 96     Set<Integer> allChildren = new HashSet<Integer>();
6774 17 Mar 15 nicklas 97     if (includeSourcesInTarget) allChildren.addAll(source);
6774 17 Mar 15 nicklas 98
6774 17 Mar 15 nicklas 99     // Parents that we have not yet checked
6774 17 Mar 15 nicklas 100     Set<Integer> parents = source;
6774 17 Mar 15 nicklas 101     while (parents.size() > 0)
6774 17 Mar 15 nicklas 102     {
8094 04 Nov 22 nicklas 103       context.collect(getSourceItemType(), parents);
8094 04 Nov 22 nicklas 104       Set<Integer> children = context.avoid(getTargetItemType(), safeIdList(dc, query, "parents", parents));
6774 17 Mar 15 nicklas 105       
6774 17 Mar 15 nicklas 106       // Store new children and "used" parents
6774 17 Mar 15 nicklas 107       allChildren.addAll(children);
6774 17 Mar 15 nicklas 108       allParents.addAll(parents);
6774 17 Mar 15 nicklas 109       
6774 17 Mar 15 nicklas 110       // Remove parents that we have already seen...
6774 17 Mar 15 nicklas 111       // ...the remaining children become our new parents
6774 17 Mar 15 nicklas 112       children.removeAll(allParents);
6774 17 Mar 15 nicklas 113       parents = children;
6774 17 Mar 15 nicklas 114     }
6774 17 Mar 15 nicklas 115     
6774 17 Mar 15 nicklas 116     return allChildren;
6774 17 Mar 15 nicklas 117   }
6774 17 Mar 15 nicklas 118
6774 17 Mar 15 nicklas 119
6774 17 Mar 15 nicklas 120 }