src/core/net/sf/basedb/util/overview/loader/DerivedBioAssayLoader.java

Code
Comments
Other
Rev Date Author Line
5652 10 Jun 11 nicklas 1 /**
5652 10 Jun 11 nicklas 2   $Id$
5652 10 Jun 11 nicklas 3
5652 10 Jun 11 nicklas 4   Copyright (C) 2011 Nicklas Nordborg
5652 10 Jun 11 nicklas 5
5652 10 Jun 11 nicklas 6   This file is part of BASE - BioArray Software Environment.
5652 10 Jun 11 nicklas 7   Available at http://base.thep.lu.se/
5652 10 Jun 11 nicklas 8
5652 10 Jun 11 nicklas 9   BASE is free software; you can redistribute it and/or
5652 10 Jun 11 nicklas 10   modify it under the terms of the GNU General Public License
5652 10 Jun 11 nicklas 11   as published by the Free Software Foundation; either version 3
5652 10 Jun 11 nicklas 12   of the License, or (at your option) any later version.
5652 10 Jun 11 nicklas 13
5652 10 Jun 11 nicklas 14   BASE is distributed in the hope that it will be useful,
5652 10 Jun 11 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
5652 10 Jun 11 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5652 10 Jun 11 nicklas 17   GNU General Public License for more details.
5652 10 Jun 11 nicklas 18
5652 10 Jun 11 nicklas 19   You should have received a copy of the GNU General Public License
5652 10 Jun 11 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
5652 10 Jun 11 nicklas 21 */
5652 10 Jun 11 nicklas 22 package net.sf.basedb.util.overview.loader;
5652 10 Jun 11 nicklas 23
7303 01 Mar 17 nicklas 24 import java.util.Collections;
6090 22 Aug 12 nicklas 25 import java.util.HashSet;
6090 22 Aug 12 nicklas 26 import java.util.List;
6090 22 Aug 12 nicklas 27 import java.util.Set;
6090 22 Aug 12 nicklas 28
5652 10 Jun 11 nicklas 29 import net.sf.basedb.core.DbControl;
5652 10 Jun 11 nicklas 30 import net.sf.basedb.core.DerivedBioAssay;
5748 19 Sep 11 nicklas 31 import net.sf.basedb.core.Extract;
5652 10 Jun 11 nicklas 32 import net.sf.basedb.core.Item;
5652 10 Jun 11 nicklas 33 import net.sf.basedb.core.ItemQuery;
5652 10 Jun 11 nicklas 34 import net.sf.basedb.core.ItemResultIterator;
5652 10 Jun 11 nicklas 35 import net.sf.basedb.core.PermissionDeniedException;
5652 10 Jun 11 nicklas 36 import net.sf.basedb.core.PhysicalBioAssay;
5748 19 Sep 11 nicklas 37 import net.sf.basedb.core.RawBioAssay;
6959 01 Oct 15 nicklas 38 import net.sf.basedb.core.RootRawBioAssay;
6090 22 Aug 12 nicklas 39 import net.sf.basedb.core.Type;
6090 22 Aug 12 nicklas 40 import net.sf.basedb.core.query.Expressions;
5748 19 Sep 11 nicklas 41 import net.sf.basedb.core.query.Hql;
5748 19 Sep 11 nicklas 42 import net.sf.basedb.core.query.Restrictions;
7302 01 Mar 17 nicklas 43 import net.sf.basedb.util.listable.ExtractToParentExtractTransformer;
7302 01 Mar 17 nicklas 44 import net.sf.basedb.util.listable.SourceItemTransformer;
7302 01 Mar 17 nicklas 45 import net.sf.basedb.util.listable.TransformContext;
6090 22 Aug 12 nicklas 46 import net.sf.basedb.util.overview.Fix;
5652 10 Jun 11 nicklas 47 import net.sf.basedb.util.overview.Node;
5748 19 Sep 11 nicklas 48 import net.sf.basedb.util.overview.NodeAttribute;
5652 10 Jun 11 nicklas 49 import net.sf.basedb.util.overview.OverviewContext;
6090 22 Aug 12 nicklas 50 import net.sf.basedb.util.overview.OverviewUtil;
6090 22 Aug 12 nicklas 51 import net.sf.basedb.util.overview.Validator;
7494 04 Jun 18 nicklas 52 import net.sf.basedb.util.overview.filter.BasicItemFilter;
5653 13 Jun 11 nicklas 53 import net.sf.basedb.util.overview.filter.ItemTypeFilter;
5652 10 Jun 11 nicklas 54 import net.sf.basedb.util.overview.node.ChildNodeDirection;
5652 10 Jun 11 nicklas 55 import net.sf.basedb.util.overview.node.NameableNameGenerator;
5652 10 Jun 11 nicklas 56 import net.sf.basedb.util.overview.node.NodeFactory;
5652 10 Jun 11 nicklas 57
5652 10 Jun 11 nicklas 58 /**
5652 10 Jun 11 nicklas 59
5652 10 Jun 11 nicklas 60   @author Nicklas
5652 10 Jun 11 nicklas 61   @since 3.0
5652 10 Jun 11 nicklas 62   @base.modified $Date$
5652 10 Jun 11 nicklas 63 */
5685 04 Aug 11 nicklas 64 public class DerivedBioAssayLoader
5685 04 Aug 11 nicklas 65   extends BasicItemNodeLoader<DerivedBioAssay>
5652 10 Jun 11 nicklas 66 {
5685 04 Aug 11 nicklas 67   public DerivedBioAssayLoader()
5652 10 Jun 11 nicklas 68   {
5685 04 Aug 11 nicklas 69     super(Item.DERIVEDBIOASSAY, ALLOW_ROOT_NODE, 
5685 04 Aug 11 nicklas 70         new NameableNameGenerator<DerivedBioAssay>("bioassayset", "Bioassay"));
5652 10 Jun 11 nicklas 71   }
5652 10 Jun 11 nicklas 72   
5652 10 Jun 11 nicklas 73   /*
5652 10 Jun 11 nicklas 74     From the NodeLoader interface
5652 10 Jun 11 nicklas 75     ------------------------------
5652 10 Jun 11 nicklas 76   */
5748 19 Sep 11 nicklas 77   @Override
5748 19 Sep 11 nicklas 78   public Node createRootNode(DbControl dc, OverviewContext context, DerivedBioAssay item)
5748 19 Sep 11 nicklas 79   {
5748 19 Sep 11 nicklas 80     Node node = super.createRootNode(dc, context, item);
6090 22 Aug 12 nicklas 81     Extract extract = getExtract(item);
5748 19 Sep 11 nicklas 82     if (extract != null) node.setAttribute(NodeAttribute.EXTRACT, extract);
5748 19 Sep 11 nicklas 83     return node;
5748 19 Sep 11 nicklas 84   }
5748 19 Sep 11 nicklas 85
5652 10 Jun 11 nicklas 86   /**
5652 10 Jun 11 nicklas 87     Create forward-loading bioassay nodes from a given physical bioassay node or a
5652 10 Jun 11 nicklas 88     parent derived bioassay set node. The returned node is a folder-type node containing 
5652 10 Jun 11 nicklas 89     item nodes for each bioassay set.
5652 10 Jun 11 nicklas 90     @return The folder node for the bioassay sets
5652 10 Jun 11 nicklas 91   */
5652 10 Jun 11 nicklas 92   @Override
5652 10 Jun 11 nicklas 93   public Node createForwardNode(DbControl dc, OverviewContext context, Node parentNode)
5652 10 Jun 11 nicklas 94   {
5652 10 Jun 11 nicklas 95     Node returnNode = null;
5652 10 Jun 11 nicklas 96     Item parentType = parentNode.getItemType();
5652 10 Jun 11 nicklas 97     if (parentType == Item.PHYSICALBIOASSAY)
5652 10 Jun 11 nicklas 98     {
5652 10 Jun 11 nicklas 99       returnNode = createForwardNode((PhysicalBioAssay)parentNode.getItem(dc), dc, context, parentNode);
5652 10 Jun 11 nicklas 100     }
5685 04 Aug 11 nicklas 101     else if (parentType == Item.DERIVEDBIOASSAY)
5652 10 Jun 11 nicklas 102     {
5685 04 Aug 11 nicklas 103       returnNode = createForwardNode((DerivedBioAssay)parentNode.getItem(dc), dc, context, parentNode);
5652 10 Jun 11 nicklas 104     }
7301 01 Mar 17 nicklas 105     else if (parentType == Item.EXTRACT)
7301 01 Mar 17 nicklas 106     {
7301 01 Mar 17 nicklas 107       returnNode = createForwardNode((Extract)parentNode.getItem(dc), dc, context, parentNode);
7301 01 Mar 17 nicklas 108     }
6755 20 Feb 15 nicklas 109     else if (parentType == Item.ITEMLIST)
6755 20 Feb 15 nicklas 110     {
6755 20 Feb 15 nicklas 111       ItemListLoader.loadMemberNodes(this, dc, context, parentNode);
6755 20 Feb 15 nicklas 112     }
5653 13 Jun 11 nicklas 113     return returnNode;
5652 10 Jun 11 nicklas 114   }
5652 10 Jun 11 nicklas 115   
5652 10 Jun 11 nicklas 116   /**
5748 19 Sep 11 nicklas 117     Create a reverse-loading bioassay node from a cild bioassay node or
5748 19 Sep 11 nicklas 118     a raw bioassay node.
5748 19 Sep 11 nicklas 119     @return A bioassay node, or null if the raw bioassay doesn't have a parent bioassay
5652 10 Jun 11 nicklas 120   */
5652 10 Jun 11 nicklas 121   @Override
5653 13 Jun 11 nicklas 122   public Node createReverseNode(DbControl dc, OverviewContext context, Node parentNode)
5652 10 Jun 11 nicklas 123   {
5653 13 Jun 11 nicklas 124     Node returnNode = null;
5653 13 Jun 11 nicklas 125     Item parentType = parentNode.getItemType();
5653 13 Jun 11 nicklas 126     if (parentType == Item.DERIVEDBIOASSAY)
5653 13 Jun 11 nicklas 127     {
5653 13 Jun 11 nicklas 128       returnNode = createReverseNode((DerivedBioAssay)parentNode.getItem(dc), dc, context, parentNode);
5653 13 Jun 11 nicklas 129     }
5748 19 Sep 11 nicklas 130     else if (parentType == Item.RAWBIOASSAY)
5652 10 Jun 11 nicklas 131     {
5748 19 Sep 11 nicklas 132       returnNode = createReverseNode((RawBioAssay)parentNode.getItem(dc), dc, context, parentNode);
5652 10 Jun 11 nicklas 133     }
6959 01 Oct 15 nicklas 134     else if (parentType == Item.ROOTRAWBIOASSAY)
6959 01 Oct 15 nicklas 135     {
6959 01 Oct 15 nicklas 136       RootRawBioAssay root = (RootRawBioAssay)parentNode.getItem(dc);
6959 01 Oct 15 nicklas 137       returnNode = createReverseNode(root.getRawBioAssay(), dc, context, parentNode);
6959 01 Oct 15 nicklas 138     }
5653 13 Jun 11 nicklas 139     return returnNode;
5652 10 Jun 11 nicklas 140   }
5652 10 Jun 11 nicklas 141   // --------------------------------
5652 10 Jun 11 nicklas 142   /*
5652 10 Jun 11 nicklas 143     From the AbstractNodeLoader class
5652 10 Jun 11 nicklas 144     ----------------------------------
5652 10 Jun 11 nicklas 145   */
5652 10 Jun 11 nicklas 146   /**
5652 10 Jun 11 nicklas 147     Loads property nodes of a derived bioassay set. 
5652 10 Jun 11 nicklas 148     <ul>
5652 10 Jun 11 nicklas 149     <li>Annotations: {@link AnnotationLoader#createPropertyNode(DbControl, OverviewContext, Node)}
5652 10 Jun 11 nicklas 150     <li>Data files: {@link DataFileLoader#createPropertyNode(DbControl, OverviewContext, Node)}
5652 10 Jun 11 nicklas 151     <li>Protocol: {@link ProtocolLoader#createPropertyNode(DbControl, OverviewContext, Node)}
7004 09 Nov 15 nicklas 152     <li>Kit: {@link KitLoader#createPropertyNode(DbControl, OverviewContext, Node)}
5652 10 Jun 11 nicklas 153     <li>Hardware: {@link HardwareLoader#createPropertyNode(DbControl, OverviewContext, Node)}
5652 10 Jun 11 nicklas 154     <li>Software: {@link SoftwareLoader#createPropertyNode(DbControl, OverviewContext, Node)}
5652 10 Jun 11 nicklas 155     </ul>
5652 10 Jun 11 nicklas 156   */
5652 10 Jun 11 nicklas 157   @Override
5652 10 Jun 11 nicklas 158   protected void loadPropertyChildNodes(DbControl dc, OverviewContext context, Node bioAssayNode)
5652 10 Jun 11 nicklas 159   {
7494 04 Jun 18 nicklas 160     Extract e = getExtract((DerivedBioAssay)bioAssayNode.getItem());
7494 04 Jun 18 nicklas 161     if (e == null || bioAssayNode.getFirstParent(new BasicItemFilter(e)) == null)
7494 04 Jun 18 nicklas 162     {
7494 04 Jun 18 nicklas 163       // Only load the extract if it is not already a parent node
7494 04 Jun 18 nicklas 164       getNodeLoader(context, Item.EXTRACT).createReverseNode(dc, context, bioAssayNode);
7494 04 Jun 18 nicklas 165     }
5652 10 Jun 11 nicklas 166     getNodeLoader(context, Item.ANNOTATION).createPropertyNode(dc, context, bioAssayNode);
5652 10 Jun 11 nicklas 167     getNodeLoader(context, Item.FILESETMEMBER).createPropertyNode(dc, context, bioAssayNode);
5652 10 Jun 11 nicklas 168     getNodeLoader(context, Item.PROTOCOL).createPropertyNode(dc, context, bioAssayNode);
7004 09 Nov 15 nicklas 169     getNodeLoader(context, Item.KIT).createPropertyNode(dc, context, bioAssayNode);
5652 10 Jun 11 nicklas 170     getNodeLoader(context, Item.HARDWARE).createPropertyNode(dc, context, bioAssayNode);
5652 10 Jun 11 nicklas 171     getNodeLoader(context, Item.SOFTWARE).createPropertyNode(dc, context, bioAssayNode);
5652 10 Jun 11 nicklas 172     getNodeLoader(context, Item.ANYTOANY).createPropertyNode(dc, context, bioAssayNode);
5652 10 Jun 11 nicklas 173   }
5652 10 Jun 11 nicklas 174
5652 10 Jun 11 nicklas 175   /**
5685 04 Aug 11 nicklas 176     Loads all child derived bioassay and raw bioassay nodes.
5652 10 Jun 11 nicklas 177     @see DerivedBioAssayLoader#createForwardNode(DbControl, OverviewContext, Node)
5685 04 Aug 11 nicklas 178     @see RawBioAssayLoader#createForwardNode(DbControl, OverviewContext, Node)
5652 10 Jun 11 nicklas 179   */
5652 10 Jun 11 nicklas 180   @Override
5652 10 Jun 11 nicklas 181   protected void loadForwardChildNodes(DbControl dc, OverviewContext context, Node parentNode)
5652 10 Jun 11 nicklas 182   {
5652 10 Jun 11 nicklas 183     getNodeLoader(context, Item.DERIVEDBIOASSAY).createForwardNode(dc, context, parentNode);
5685 04 Aug 11 nicklas 184     getNodeLoader(context, Item.RAWBIOASSAY).createForwardNode(dc, context, parentNode);
5652 10 Jun 11 nicklas 185   }
5652 10 Jun 11 nicklas 186   
5652 10 Jun 11 nicklas 187   /**
5748 19 Sep 11 nicklas 188     Loads the parent bioassay or the parent physical bioassay.
5652 10 Jun 11 nicklas 189     @see PhysicalBioAssayLoader#createReverseNode(DbControl, OverviewContext, Node)
5685 04 Aug 11 nicklas 190     @see DerivedBioAssayLoader#createReverseNode(DbControl, OverviewContext, Node)
5652 10 Jun 11 nicklas 191   */
5652 10 Jun 11 nicklas 192   @Override
5748 19 Sep 11 nicklas 193   protected void loadReverseChildNodes(DbControl dc, OverviewContext context, Node bioAssayNode)
5652 10 Jun 11 nicklas 194   {
5748 19 Sep 11 nicklas 195     DerivedBioAssay dbas = (DerivedBioAssay)bioAssayNode.getItem(dc);
5653 13 Jun 11 nicklas 196     if (dbas.isRoot())
5653 13 Jun 11 nicklas 197     {
5748 19 Sep 11 nicklas 198       getNodeLoader(context, Item.PHYSICALBIOASSAY).createReverseNode(dc, context, bioAssayNode);
5653 13 Jun 11 nicklas 199     }
5653 13 Jun 11 nicklas 200     else
5653 13 Jun 11 nicklas 201     {
5748 19 Sep 11 nicklas 202       getNodeLoader(context, Item.DERIVEDBIOASSAY).createReverseNode(dc, context, bioAssayNode);
5653 13 Jun 11 nicklas 203     }
5652 10 Jun 11 nicklas 204   }
5652 10 Jun 11 nicklas 205   // ---------------------------------------
5652 10 Jun 11 nicklas 206
5652 10 Jun 11 nicklas 207   
5652 10 Jun 11 nicklas 208   /**
5685 04 Aug 11 nicklas 209     Create forward-loading derived bioassay nodes that have the given
5685 04 Aug 11 nicklas 210     physical bioassay as the immediate parent (eg. root bioassays).
5652 10 Jun 11 nicklas 211   */
5748 19 Sep 11 nicklas 212   private Node createForwardNode(PhysicalBioAssay bioAssay, DbControl dc, OverviewContext context, Node bioAssayNode)
5652 10 Jun 11 nicklas 213   {
5685 04 Aug 11 nicklas 214     NodeFactory<DerivedBioAssay> nf = getNodeFactory(dc, context);
5652 10 Jun 11 nicklas 215     Node folderNode = null;
5685 04 Aug 11 nicklas 216     ItemQuery<DerivedBioAssay> query = context.initQuery(bioAssay.getRootDerivedBioAssays(), "name");
5748 19 Sep 11 nicklas 217     
6090 22 Aug 12 nicklas 218     // We should only load derived bioassays that has a null extract or an
6090 22 Aug 12 nicklas 219     // extract that is found in the parent chain
7303 01 Mar 17 nicklas 220     Set<Integer> extractIds = getExtractChain(dc, bioAssayNode);
6090 22 Aug 12 nicklas 221     if (extractIds.size() > 0)
7303 01 Mar 17 nicklas 222     {      
6090 22 Aug 12 nicklas 223       query.restrict(
6090 22 Aug 12 nicklas 224         Restrictions.or(
6090 22 Aug 12 nicklas 225           Restrictions.eq(Hql.property("extract"), null),
6090 22 Aug 12 nicklas 226           Restrictions.in(Hql.property("extract"), Expressions.parameter("extracts"))
6090 22 Aug 12 nicklas 227         ));
7303 01 Mar 17 nicklas 228       query.setParameter("extracts", extractIds, Type.INT);
5748 19 Sep 11 nicklas 229     }
6090 22 Aug 12 nicklas 230
5685 04 Aug 11 nicklas 231     ItemResultIterator<DerivedBioAssay> it = query.iterate(dc);
5652 10 Jun 11 nicklas 232     while (it.hasNext())
5652 10 Jun 11 nicklas 233     {
5748 19 Sep 11 nicklas 234       DerivedBioAssay child = it.next();
5652 10 Jun 11 nicklas 235       if (folderNode == null)
5652 10 Jun 11 nicklas 236       {
5748 19 Sep 11 nicklas 237         folderNode = new Node("bioassays", "Bioassays", bioAssayNode, ChildNodeDirection.FORWARD);
5652 10 Jun 11 nicklas 238       }
6090 22 Aug 12 nicklas 239       Object cacheKey = extractIds.size() > 0 ? null : child;
5748 19 Sep 11 nicklas 240       createItemNode(nf, child, cacheKey, false, folderNode, ChildNodeDirection.FORWARD);
5652 10 Jun 11 nicklas 241     }
5748 19 Sep 11 nicklas 242     postValidateFolder(nf, folderNode, bioAssayNode, false);
5652 10 Jun 11 nicklas 243     return folderNode;
5652 10 Jun 11 nicklas 244   }
5652 10 Jun 11 nicklas 245
5652 10 Jun 11 nicklas 246   /**
5652 10 Jun 11 nicklas 247     Create forward-loading derived bioassay set nodes that have the given
5652 10 Jun 11 nicklas 248     derived bioassay set as the parent
5652 10 Jun 11 nicklas 249   */
5685 04 Aug 11 nicklas 250   private Node createForwardNode(DerivedBioAssay parent, DbControl dc, OverviewContext context, Node parentNode)
5652 10 Jun 11 nicklas 251   {
5685 04 Aug 11 nicklas 252     NodeFactory<DerivedBioAssay> nf = getNodeFactory(dc, context);
5652 10 Jun 11 nicklas 253     Node folderNode = null;
5748 19 Sep 11 nicklas 254
5685 04 Aug 11 nicklas 255     ItemQuery<DerivedBioAssay> query = context.initQuery(parent.getChildren(), "name");
5748 19 Sep 11 nicklas 256     
6090 22 Aug 12 nicklas 257     // We should only load derived bioassays that has a null extract or an
6090 22 Aug 12 nicklas 258     // extract that is found in the parent chain
7303 01 Mar 17 nicklas 259     Set<Integer> extractIds = getExtractChain(dc, parentNode);
6090 22 Aug 12 nicklas 260     if (extractIds.size() > 0)
7303 01 Mar 17 nicklas 261     {      
6090 22 Aug 12 nicklas 262       query.restrict(
6090 22 Aug 12 nicklas 263         Restrictions.or(
6090 22 Aug 12 nicklas 264           Restrictions.eq(Hql.property("extract"), null),
6090 22 Aug 12 nicklas 265           Restrictions.in(Hql.property("extract"), Expressions.parameter("extracts"))
6090 22 Aug 12 nicklas 266         ));
7303 01 Mar 17 nicklas 267       query.setParameter("extracts", extractIds, Type.INT);
5748 19 Sep 11 nicklas 268     }
5748 19 Sep 11 nicklas 269
5685 04 Aug 11 nicklas 270     ItemResultIterator<DerivedBioAssay> it = query.iterate(dc);
5652 10 Jun 11 nicklas 271     while (it.hasNext())
5652 10 Jun 11 nicklas 272     {
5748 19 Sep 11 nicklas 273       DerivedBioAssay child = it.next();
5652 10 Jun 11 nicklas 274       if (folderNode == null)
5652 10 Jun 11 nicklas 275       {
5748 19 Sep 11 nicklas 276         folderNode = new Node("bioassays", "Child bioassays", parentNode, ChildNodeDirection.FORWARD);
5652 10 Jun 11 nicklas 277       }
6090 22 Aug 12 nicklas 278       Object cacheKey = extractIds.size() > 0 ? null : child;
5748 19 Sep 11 nicklas 279       createItemNode(nf, child, cacheKey, false, folderNode, ChildNodeDirection.FORWARD);
5652 10 Jun 11 nicklas 280     }
5652 10 Jun 11 nicklas 281     postValidateFolder(nf, folderNode, parentNode, false);
5652 10 Jun 11 nicklas 282     return folderNode;
5652 10 Jun 11 nicklas 283   }
5652 10 Jun 11 nicklas 284
7301 01 Mar 17 nicklas 285   private Node createForwardNode(Extract extract, DbControl dc, OverviewContext context, Node extractNode)
7301 01 Mar 17 nicklas 286   {
7301 01 Mar 17 nicklas 287     NodeFactory<DerivedBioAssay> nf = getNodeFactory(dc, context);
7301 01 Mar 17 nicklas 288     Node folderNode = null;
7494 04 Jun 18 nicklas 289     // Load derived bioassays linked to the 'extract' if:
7494 04 Jun 18 nicklas 290     // they have no parent bioassay OR
7494 04 Jun 18 nicklas 291     // the parent bioassay has no parent extract OR
7494 04 Jun 18 nicklas 292     // the parent bioassay has a different parent extract
7301 01 Mar 17 nicklas 293     ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery();
7301 01 Mar 17 nicklas 294     query.restrict(Restrictions.eq(Hql.property("extract"), Hql.entity(extract)));
7301 01 Mar 17 nicklas 295     query.join(Hql.leftJoin("parents", "parent"));
7494 04 Jun 18 nicklas 296     query.join(Hql.leftJoin("parent", "extract", "parentExtract", null, false));
7494 04 Jun 18 nicklas 297     query.restrict(
7494 04 Jun 18 nicklas 298       Restrictions.or(
7494 04 Jun 18 nicklas 299         Restrictions.eq(Hql.alias("parent"), null),
7494 04 Jun 18 nicklas 300         Restrictions.eq(Hql.alias("parentExtract"), null),
7494 04 Jun 18 nicklas 301         Restrictions.neq(Hql.alias("parentExtract"), Hql.entity(extract))
7494 04 Jun 18 nicklas 302         ));
7494 04 Jun 18 nicklas 303     query.setDistinct(true); // left joins may create multiple hits for items with more than one parent
7301 01 Mar 17 nicklas 304     context.initQuery(query, "name");
7301 01 Mar 17 nicklas 305     ItemResultIterator<DerivedBioAssay> it = query.iterate(dc);
7301 01 Mar 17 nicklas 306     while (it.hasNext())
7301 01 Mar 17 nicklas 307     {
7301 01 Mar 17 nicklas 308       DerivedBioAssay dba = it.next();
7301 01 Mar 17 nicklas 309       if (folderNode == null)
7301 01 Mar 17 nicklas 310       {
7301 01 Mar 17 nicklas 311         folderNode =  new Node("derivedbioassays", "Derived bioassays", extractNode, ChildNodeDirection.FORWARD);
7301 01 Mar 17 nicklas 312       }
7301 01 Mar 17 nicklas 313       createItemNode(nf, dba, dba, false, folderNode, ChildNodeDirection.FORWARD);
7301 01 Mar 17 nicklas 314     }
7301 01 Mar 17 nicklas 315     postValidateFolder(nf, folderNode, extractNode, false);
7301 01 Mar 17 nicklas 316     return folderNode;
7301 01 Mar 17 nicklas 317   }
7301 01 Mar 17 nicklas 318
7301 01 Mar 17 nicklas 319   
5748 19 Sep 11 nicklas 320   /**
5748 19 Sep 11 nicklas 321     Create a reverse-loading bioassay node for the bioassay that is the parent
5748 19 Sep 11 nicklas 322     to the given raw bioassay.
5748 19 Sep 11 nicklas 323   */
5748 19 Sep 11 nicklas 324   private Node createReverseNode(RawBioAssay raw, DbControl dc, OverviewContext context, Node rawNode)
5653 13 Jun 11 nicklas 325   {
5685 04 Aug 11 nicklas 326     NodeFactory<DerivedBioAssay> nf = getNodeFactory(dc, context);
5748 19 Sep 11 nicklas 327     DerivedBioAssay bioAssay = null;
5748 19 Sep 11 nicklas 328     Extract extract = null;
5653 13 Jun 11 nicklas 329     boolean denied = false;
5653 13 Jun 11 nicklas 330     try
5653 13 Jun 11 nicklas 331     {
5748 19 Sep 11 nicklas 332       bioAssay = raw.getParentBioAssay();
6090 22 Aug 12 nicklas 333       // We must set the EXTRACT attribute so that upstream loaders
5748 19 Sep 11 nicklas 334       // follow the correct path when reaching the biomaterials section
6090 22 Aug 12 nicklas 335       if (bioAssay != null) extract = getExtract(bioAssay);
5653 13 Jun 11 nicklas 336     }
5653 13 Jun 11 nicklas 337     catch (PermissionDeniedException ex)
5653 13 Jun 11 nicklas 338     {
5653 13 Jun 11 nicklas 339       denied = true;
5653 13 Jun 11 nicklas 340     }
6090 22 Aug 12 nicklas 341     Node bioAssayNode = createItemNode(nf, bioAssay, null, denied, 
5748 19 Sep 11 nicklas 342         rawNode, ChildNodeDirection.REVERSE);
5748 19 Sep 11 nicklas 343     if (extract != null && bioAssayNode != null)
5748 19 Sep 11 nicklas 344     {
5748 19 Sep 11 nicklas 345       bioAssayNode.setAttribute(NodeAttribute.EXTRACT, extract);
5748 19 Sep 11 nicklas 346     }
5748 19 Sep 11 nicklas 347     return bioAssayNode;
5653 13 Jun 11 nicklas 348   }
5653 13 Jun 11 nicklas 349
5653 13 Jun 11 nicklas 350   /**
5748 19 Sep 11 nicklas 351     Create a reverse-loading bioassay node for the bioassay that is
5748 19 Sep 11 nicklas 352     the parent to the given child bioassay.
5653 13 Jun 11 nicklas 353   */
5748 19 Sep 11 nicklas 354   private Node createReverseNode(DerivedBioAssay child, DbControl dc, OverviewContext context, Node childNode)
5653 13 Jun 11 nicklas 355   {
5748 19 Sep 11 nicklas 356     NodeFactory<DerivedBioAssay> nf = getNodeFactory(dc, context);
6090 22 Aug 12 nicklas 357     
6090 22 Aug 12 nicklas 358     ItemQuery<DerivedBioAssay> query = context.initQuery(child.getParents(), "name");
6090 22 Aug 12 nicklas 359     List<DerivedBioAssay> parents = query.list(dc);
6090 22 Aug 12 nicklas 360     
6090 22 Aug 12 nicklas 361     Node folderNode = null;
6090 22 Aug 12 nicklas 362     Node bioAssayNode = null;
6090 22 Aug 12 nicklas 363     if (parents.size() > 1)
5748 19 Sep 11 nicklas 364     {
6090 22 Aug 12 nicklas 365       folderNode = new Node("parents", "Parents", childNode, ChildNodeDirection.REVERSE);
5748 19 Sep 11 nicklas 366     }
6090 22 Aug 12 nicklas 367     
6090 22 Aug 12 nicklas 368     for (DerivedBioAssay dba : parents)
5748 19 Sep 11 nicklas 369     {
6090 22 Aug 12 nicklas 370       // We need to handle circular references inline because
6090 22 Aug 12 nicklas 371       // we can never require that a validator implementation handles this
6090 22 Aug 12 nicklas 372       Node circularNode = OverviewUtil.getCircularRef(childNode, dba);
6090 22 Aug 12 nicklas 373       if (circularNode != null)
6090 22 Aug 12 nicklas 374       {
6090 22 Aug 12 nicklas 375         context.createFailure(Validator.CIRCULAR_REFERENCE, childNode, 
6090 22 Aug 12 nicklas 376             "Circular reference to '" + dba.getName() + "'", 
6090 22 Aug 12 nicklas 377             new Fix("Modify parents of '" + child.getName() + "'", child),
6090 22 Aug 12 nicklas 378             new Fix("Modify parents of '" + dba.getName() + "'", dba)
6090 22 Aug 12 nicklas 379           );
6090 22 Aug 12 nicklas 380       }
6090 22 Aug 12 nicklas 381       else
6090 22 Aug 12 nicklas 382       {
6090 22 Aug 12 nicklas 383         Extract extract = getExtract(dba);
6090 22 Aug 12 nicklas 384         bioAssayNode = createItemNode(nf, dba, null, false, folderNode == null ? childNode : folderNode, ChildNodeDirection.REVERSE);
6090 22 Aug 12 nicklas 385         if (extract != null && bioAssayNode != null)
6090 22 Aug 12 nicklas 386         {
6090 22 Aug 12 nicklas 387           bioAssayNode.setAttribute(NodeAttribute.EXTRACT, extract);
6090 22 Aug 12 nicklas 388         }
6090 22 Aug 12 nicklas 389       }
5748 19 Sep 11 nicklas 390     }
6090 22 Aug 12 nicklas 391     postValidateFolder(nf, folderNode, childNode, bioAssayNode == null);
6090 22 Aug 12 nicklas 392     return folderNode == null ? bioAssayNode : folderNode;
5653 13 Jun 11 nicklas 393   }
5748 19 Sep 11 nicklas 394
5748 19 Sep 11 nicklas 395   /**
6090 22 Aug 12 nicklas 396     Get the extract that is associated with the current derived bioassay
5748 19 Sep 11 nicklas 397     @return The extract or null if none was found
5748 19 Sep 11 nicklas 398   */
6090 22 Aug 12 nicklas 399   private Extract getExtract(DerivedBioAssay bioAssay)
5748 19 Sep 11 nicklas 400   {
5748 19 Sep 11 nicklas 401     Extract extract = null;
6090 22 Aug 12 nicklas 402     try
5748 19 Sep 11 nicklas 403     {
6090 22 Aug 12 nicklas 404       extract = bioAssay.getExtract();
5748 19 Sep 11 nicklas 405     }
6090 22 Aug 12 nicklas 406     catch (PermissionDeniedException ex)
6090 22 Aug 12 nicklas 407     {}
6090 22 Aug 12 nicklas 408     return extract;
6090 22 Aug 12 nicklas 409   }
6090 22 Aug 12 nicklas 410   
7303 01 Mar 17 nicklas 411   private Set<Integer> getExtractChain(DbControl dc, Node node)
6090 22 Aug 12 nicklas 412   {
6090 22 Aug 12 nicklas 413     List<Node> extractNodes = node.findAll(new ItemTypeFilter(Item.EXTRACT));
6090 22 Aug 12 nicklas 414     Set<Integer> extractIds = new HashSet<Integer>(extractNodes.size());
6090 22 Aug 12 nicklas 415     for (Node n : extractNodes)
5748 19 Sep 11 nicklas 416     {
6090 22 Aug 12 nicklas 417       extractIds.add(n.getItem().getId());
7303 01 Mar 17 nicklas 418       if (n.getParent() == null)
7303 01 Mar 17 nicklas 419       {
7303 01 Mar 17 nicklas 420         // We have reach the root node, continue to load parent extracts from here
7303 01 Mar 17 nicklas 421         SourceItemTransformer transformer = new ExtractToParentExtractTransformer(true);
7303 01 Mar 17 nicklas 422         extractIds.addAll(transformer.transform(new TransformContext(dc), Collections.singleton(n.getItem().getId())));
7303 01 Mar 17 nicklas 423         
7303 01 Mar 17 nicklas 424       }
5748 19 Sep 11 nicklas 425     }
6090 22 Aug 12 nicklas 426     return extractIds;
5748 19 Sep 11 nicklas 427   }
7302 01 Mar 17 nicklas 428
7302 01 Mar 17 nicklas 429   
5652 10 Jun 11 nicklas 430 }