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

Code
Comments
Other
Rev Date Author Line
6775 17 Mar 15 nicklas 1 /**
6775 17 Mar 15 nicklas 2   $Id$
6775 17 Mar 15 nicklas 3
6775 17 Mar 15 nicklas 4   Copyright (C) 2015 Nicklas Nordborg
6775 17 Mar 15 nicklas 5
6775 17 Mar 15 nicklas 6   This file is part of BASE - BioArray Software Environment.
6775 17 Mar 15 nicklas 7   Available at http://base.thep.lu.se/
6775 17 Mar 15 nicklas 8
6775 17 Mar 15 nicklas 9   BASE is free software; you can redistribute it and/or
6775 17 Mar 15 nicklas 10   modify it under the terms of the GNU General Public License
6775 17 Mar 15 nicklas 11   as published by the Free Software Foundation; either version 3
6775 17 Mar 15 nicklas 12   of the License, or (at your option) any later version.
6775 17 Mar 15 nicklas 13
6775 17 Mar 15 nicklas 14   BASE is distributed in the hope that it will be useful,
6775 17 Mar 15 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
6775 17 Mar 15 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6775 17 Mar 15 nicklas 17   GNU General Public License for more details.
6775 17 Mar 15 nicklas 18
6775 17 Mar 15 nicklas 19   You should have received a copy of the GNU General Public License
6775 17 Mar 15 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
6775 17 Mar 15 nicklas 21 */
6775 17 Mar 15 nicklas 22 package net.sf.basedb.util.listable;
6775 17 Mar 15 nicklas 23
6775 17 Mar 15 nicklas 24 import java.util.HashSet;
6775 17 Mar 15 nicklas 25 import java.util.Set;
6775 17 Mar 15 nicklas 26
6775 17 Mar 15 nicklas 27 import net.sf.basedb.core.DbControl;
6775 17 Mar 15 nicklas 28 import net.sf.basedb.core.Extract;
6775 17 Mar 15 nicklas 29 import net.sf.basedb.core.Item;
6775 17 Mar 15 nicklas 30 import net.sf.basedb.core.ItemQuery;
6775 17 Mar 15 nicklas 31 import net.sf.basedb.core.query.Expressions;
6775 17 Mar 15 nicklas 32 import net.sf.basedb.core.query.Hql;
6775 17 Mar 15 nicklas 33 import net.sf.basedb.core.query.Restrictions;
6775 17 Mar 15 nicklas 34
6775 17 Mar 15 nicklas 35 /**
6775 17 Mar 15 nicklas 36   Source item transformer implementation that transform extract items to their
6775 17 Mar 15 nicklas 37   child extract items. From the given set of extract ID:s the transformer will
6775 17 Mar 15 nicklas 38   recursively load as many child extracts as possible. The source items
6775 17 Mar 15 nicklas 39   may optionally be included in the target set.
6775 17 Mar 15 nicklas 40
6775 17 Mar 15 nicklas 41   @author Nicklas
6775 17 Mar 15 nicklas 42   @since 3.5
6775 17 Mar 15 nicklas 43 */
6775 17 Mar 15 nicklas 44 public class ExtractToChildExtractTransformer 
6775 17 Mar 15 nicklas 45   extends AbstractSourceItemTransformer
6775 17 Mar 15 nicklas 46 {
6775 17 Mar 15 nicklas 47
6775 17 Mar 15 nicklas 48   private final boolean includeSourcesInTarget;
8094 04 Nov 22 nicklas 49   private final boolean pushOnly;
6775 17 Mar 15 nicklas 50   
6775 17 Mar 15 nicklas 51   /**
6775 17 Mar 15 nicklas 52     Create a new extract to child extract transformer.
6775 17 Mar 15 nicklas 53     @param includeSourcesInTarget TRUE to include the source items in the target
6775 17 Mar 15 nicklas 54   */
6775 17 Mar 15 nicklas 55   public ExtractToChildExtractTransformer(boolean includeSourcesInTarget) 
6775 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 extract to child extract transformer that only load children
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 ExtractToChildExtractTransformer(boolean includeSourcesInTarget, boolean childrensThatPushOnly)
8094 04 Nov 22 nicklas 65   {
6775 17 Mar 15 nicklas 66     super(Item.EXTRACT, Item.EXTRACT);
6775 17 Mar 15 nicklas 67     this.includeSourcesInTarget = includeSourcesInTarget;
8094 04 Nov 22 nicklas 68     this.pushOnly = childrensThatPushOnly;
6775 17 Mar 15 nicklas 69   }
8094 04 Nov 22 nicklas 70
6775 17 Mar 15 nicklas 71   @Override
6775 17 Mar 15 nicklas 72   public Set<Integer> transform(TransformContext context, Set<Integer> source) 
6775 17 Mar 15 nicklas 73   {
6775 17 Mar 15 nicklas 74     DbControl dc = context.getDbControl();
6775 17 Mar 15 nicklas 75     
6775 17 Mar 15 nicklas 76     ItemQuery<Extract> query = Extract.getQuery();
6848 13 Apr 15 nicklas 77     query.setIncludes(context.getInclude());
6796 24 Mar 15 nicklas 78     // Extracts with an extract as parent
6796 24 Mar 15 nicklas 79     query.restrict(Restrictions.eq(Hql.property("parentType"), Expressions.integer(Item.EXTRACT.getValue())));
6775 17 Mar 15 nicklas 80     query.join(Hql.innerJoin("creationEvent", "ce"));
6775 17 Mar 15 nicklas 81     query.join(Hql.innerJoin("ce", "sources", "sbm"));
6775 17 Mar 15 nicklas 82     query.join(Hql.innerJoin("sbm", "bioMaterial", "bm"));
6775 17 Mar 15 nicklas 83     query.restrict(
6775 17 Mar 15 nicklas 84       Restrictions.in(
6775 17 Mar 15 nicklas 85         Hql.alias("bm"), 
6775 17 Mar 15 nicklas 86         Expressions.parameter("parents")
6775 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     }
6775 17 Mar 15 nicklas 93
6775 17 Mar 15 nicklas 94     // Keep track of all seen children and parents
6775 17 Mar 15 nicklas 95     Set<Integer> allParents = new HashSet<Integer>();
6775 17 Mar 15 nicklas 96     Set<Integer> allChildren = new HashSet<Integer>();
6775 17 Mar 15 nicklas 97     if (includeSourcesInTarget) allChildren.addAll(source);
6775 17 Mar 15 nicklas 98
6775 17 Mar 15 nicklas 99     // Parents that we have not yet checked
6775 17 Mar 15 nicklas 100     Set<Integer> parents = source;
6775 17 Mar 15 nicklas 101     while (parents.size() > 0)
6775 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));
6775 17 Mar 15 nicklas 105       
6775 17 Mar 15 nicklas 106       // Store new children and "used" parents
6775 17 Mar 15 nicklas 107       allChildren.addAll(children);
6775 17 Mar 15 nicklas 108       allParents.addAll(parents);
6775 17 Mar 15 nicklas 109       
6775 17 Mar 15 nicklas 110       // Remove parents that we have already seen...
6775 17 Mar 15 nicklas 111       // ...the remaining children become our new parents
6775 17 Mar 15 nicklas 112       children.removeAll(allParents);
6775 17 Mar 15 nicklas 113       parents = children;
6775 17 Mar 15 nicklas 114     }
6775 17 Mar 15 nicklas 115     
6775 17 Mar 15 nicklas 116     return allChildren;
6775 17 Mar 15 nicklas 117   }
6775 17 Mar 15 nicklas 118
6775 17 Mar 15 nicklas 119
6775 17 Mar 15 nicklas 120 }