/* * Copyright 2006-2014 University of Dundee. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package ome.services.query; import static ome.parameters.Parameters.CLASS; import static ome.parameters.Parameters.IDS; import java.sql.SQLException; import java.util.Collection; import ome.conditions.ApiUsageException; import ome.model.containers.Dataset; import ome.model.containers.Project; import ome.model.screen.Plate; import ome.model.screen.Screen; import ome.parameters.Parameters; import org.hibernate.HibernateException; import org.hibernate.Session; public class PojosLoadHierarchyQueryDefinition extends Query { static Definitions defs = new Definitions(new CollectionQueryParameterDef( Parameters.IDS, true, Long.class), new ClassQueryParameterDef()); public PojosLoadHierarchyQueryDefinition(Parameters parameters) { super(defs, parameters); } @Override protected void buildQuery(Session session) throws HibernateException, SQLException { Class klass = (Class) value(CLASS); StringBuilder sb = new StringBuilder(); if (Project.class.isAssignableFrom(klass)) { sb.append("select this from Project this "); sb.append("left outer join fetch this.details.creationEvent "); sb.append("left outer join fetch this.datasetLinks pdl "); sb.append("left outer join fetch pdl.child ds "); if (params.isLeaves()) { sb.append("left outer join fetch ds.imageLinks dil "); sb.append("left outer join fetch dil.child img "); } sb.append("left outer join fetch " + "this.annotationLinksCountPerOwner this_a_c "); } else if (Dataset.class.isAssignableFrom(klass)) { sb.append("select this from Dataset this "); sb.append("left outer join fetch this.details.creationEvent "); if (params.isLeaves()) { sb.append("left outer join fetch this.imageLinks dil "); sb.append("left outer join fetch dil.child img "); } sb.append("left outer join fetch " + "this.annotationLinksCountPerOwner this_a_c "); sb.append("left outer join fetch " + "this.imageLinksCountPerOwner this_i_c "); } else if (Screen.class.isAssignableFrom(klass)) { sb.append("select this from Screen this "); sb.append("left outer join fetch this.details.creationEvent "); sb.append("left outer join fetch this.plateLinks pdl "); sb.append("left outer join fetch pdl.child ds "); sb.append("left outer join fetch ds.details.creationEvent "); sb.append("left outer join fetch ds.details.updateEvent "); sb.append("left outer join fetch ds.plateAcquisitions sa "); sb.append("left outer join fetch " + "this.annotationLinksCountPerOwner this_a_c "); sb.append("left outer join fetch sa.annotationLinksCountPerOwner sa_a_c "); } else if (Plate.class.isAssignableFrom(klass)) { sb.append("select this from Plate this "); sb.append("left outer join fetch this.details.creationEvent "); sb.append("left outer join fetch this.plateAcquisitions sa "); sb.append("left outer join fetch " + "this.annotationLinksCountPerOwner this_a_c "); sb.append("left outer join fetch sa.annotationLinksCountPerOwner sa_a_c "); } else { throw new ApiUsageException("Unknown container class: " + klass.getName()); } if (params.isLeaves()) { if (Screen.class.isAssignableFrom(klass) || Plate.class.isAssignableFrom(klass)) { sb.append("left outer join fetch sa.wellSample ws "); sb.append("left outer join fetch ws.image img "); } sb.append("left outer join fetch img.details.creationEvent as cre "); sb.append("left outer join fetch img.details.updateEvent as evt "); sb.append("left outer join fetch img.pixels as pix "); sb.append("left outer join fetch img.format as format "); sb.append("left outer join fetch pix.pixelsType as pt "); if (params.isAcquisitionData()) { sb.append("left outer join fetch img.stageLabel as position "); sb.append("left outer join fetch img.imagingEnvironment" + " as condition "); sb.append("left outer join fetch img.objectiveSettings as os "); sb.append("left outer join fetch os.medium as me "); sb.append("left outer join fetch os.objective as objective "); sb.append("left outer join fetch objective.immersion as im "); sb.append("left outer join fetch objective.correction as co "); } } // optional ids Collection ids = (Collection) value(IDS); if (ids != null && ids.size() > 0) { sb.append("where this.id in (:ids)"); } org.hibernate.Query q = session.createQuery(sb.toString()); if (ids != null && ids.size() > 0) { q.setParameterList("ids", ids); } setQuery(q); } @Override protected void enableFilters(Session session) { ownerOrGroupFilters(session, // TODO this needs to be moved to Hierarchy. new String[] { Project.OWNER_FILTER, Dataset.OWNER_FILTER, Screen.OWNER_FILTER, Plate.OWNER_FILTER }, new String[] { Project.GROUP_FILTER, Dataset.GROUP_FILTER, Screen.GROUP_FILTER, Plate.GROUP_FILTER }); } }