extensions/net.sf.basedb.relax/trunk/src/net/sf/basedb/relax/dao/Subtype.java

Code
Comments
Other
Rev Date Author Line
4353 13 Feb 17 nicklas 1 package net.sf.basedb.relax.dao;
4353 13 Feb 17 nicklas 2
4353 13 Feb 17 nicklas 3 import java.lang.reflect.Field;
4353 13 Feb 17 nicklas 4 import java.util.List;
4353 13 Feb 17 nicklas 5
4353 13 Feb 17 nicklas 6 import org.json.simple.JSONObject;
4353 13 Feb 17 nicklas 7
5079 08 Nov 18 nicklas 8 import net.sf.basedb.core.AnnotationTypeCategory;
4353 13 Feb 17 nicklas 9 import net.sf.basedb.core.DbControl;
4353 13 Feb 17 nicklas 10 import net.sf.basedb.core.Include;
4353 13 Feb 17 nicklas 11 import net.sf.basedb.core.InvalidDataException;
4353 13 Feb 17 nicklas 12 import net.sf.basedb.core.Item;
4353 13 Feb 17 nicklas 13 import net.sf.basedb.core.ItemNotFoundException;
4353 13 Feb 17 nicklas 14 import net.sf.basedb.core.ItemQuery;
4353 13 Feb 17 nicklas 15 import net.sf.basedb.core.ItemSubtype;
4353 13 Feb 17 nicklas 16 import net.sf.basedb.core.Subtypable;
4353 13 Feb 17 nicklas 17 import net.sf.basedb.core.Type;
4353 13 Feb 17 nicklas 18 import net.sf.basedb.core.query.Expressions;
4353 13 Feb 17 nicklas 19 import net.sf.basedb.core.query.Hql;
4353 13 Feb 17 nicklas 20 import net.sf.basedb.core.query.Restriction;
4353 13 Feb 17 nicklas 21 import net.sf.basedb.core.query.Restrictions;
4353 13 Feb 17 nicklas 22
4353 13 Feb 17 nicklas 23 /**
4353 13 Feb 17 nicklas 24   Used to define a subtype by name and main item type.
4353 13 Feb 17 nicklas 25   
4353 13 Feb 17 nicklas 26   @author nicklas
4353 13 Feb 17 nicklas 27   @since 1.0
4353 13 Feb 17 nicklas 28 */
4353 13 Feb 17 nicklas 29 public class Subtype 
4353 13 Feb 17 nicklas 30 {
4353 13 Feb 17 nicklas 31
4353 13 Feb 17 nicklas 32   /**
4353 13 Feb 17 nicklas 33     The definition of the "Patient" subtype.
4353 13 Feb 17 nicklas 34   */
4353 13 Feb 17 nicklas 35   public static final Subtype PATIENT = new Subtype("Patient", null, Item.BIOSOURCE, false);
4353 13 Feb 17 nicklas 36
4353 13 Feb 17 nicklas 37   /**
5109 19 Nov 18 nicklas 38     The definition of the "Retract" subtype.
5109 19 Nov 18 nicklas 39     @since 1.4
5109 19 Nov 18 nicklas 40   */
5109 19 Nov 18 nicklas 41   public static final Subtype RETRACT = new Subtype("Retract", null, Item.BIOSOURCE, false);
5109 19 Nov 18 nicklas 42
5109 19 Nov 18 nicklas 43   /**
5109 19 Nov 18 nicklas 44     The definition of the "No" subtype.
5109 19 Nov 18 nicklas 45     @since 1.4
5109 19 Nov 18 nicklas 46   */
5123 21 Nov 18 nicklas 47   public static final Subtype NO = new Subtype("No", null, Item.BIOSOURCE, false);
5109 19 Nov 18 nicklas 48
5109 19 Nov 18 nicklas 49   /**
5109 19 Nov 18 nicklas 50     The definition of the "NotAsked" subtype.
5109 19 Nov 18 nicklas 51     @since 1.4
5109 19 Nov 18 nicklas 52   */
5109 19 Nov 18 nicklas 53   public static final Subtype NOT_ASKED = new Subtype("NotAsked", null, Item.BIOSOURCE, false);
5109 19 Nov 18 nicklas 54     
5109 19 Nov 18 nicklas 55   /**
4353 13 Feb 17 nicklas 56     The definition of the "Case" subtype.
4353 13 Feb 17 nicklas 57   */
4353 13 Feb 17 nicklas 58   public static final Subtype CASE = new Subtype("Case", null, Item.SAMPLE, false);
4353 13 Feb 17 nicklas 59
4353 13 Feb 17 nicklas 60   /**
4353 13 Feb 17 nicklas 61     The definition of the "Specimen" subtype.
4353 13 Feb 17 nicklas 62   */
4353 13 Feb 17 nicklas 63   public static final Subtype SPECIMEN = new Subtype("Specimen", null, Item.SAMPLE, false);
4353 13 Feb 17 nicklas 64
4353 13 Feb 17 nicklas 65   /**
5134 21 Nov 18 nicklas 66     The definition of the "NoSpecimen" subtype.
5134 21 Nov 18 nicklas 67     @since 1.4
5134 21 Nov 18 nicklas 68   */
5134 21 Nov 18 nicklas 69   public static final Subtype NO_SPECIMEN = new Subtype("NoSpecimen", null, Item.SAMPLE, false);
5134 21 Nov 18 nicklas 70
5134 21 Nov 18 nicklas 71   /**
5109 19 Nov 18 nicklas 72     The definition of the "Blood" subtype.
5109 19 Nov 18 nicklas 73     @since 1.4
5109 19 Nov 18 nicklas 74   */
5109 19 Nov 18 nicklas 75   public static final Subtype BLOOD = new Subtype("Blood", "b", Item.SAMPLE, false);
5109 19 Nov 18 nicklas 76
5109 19 Nov 18 nicklas 77   /**
5109 19 Nov 18 nicklas 78     The definition of the "BloodDNA" subtype.
5109 19 Nov 18 nicklas 79     @since 1.4
5109 19 Nov 18 nicklas 80   */
5109 19 Nov 18 nicklas 81   public static final Subtype BLOOD_DNA = new Subtype("BloodDNA", "d", Item.EXTRACT, false);
5109 19 Nov 18 nicklas 82
5109 19 Nov 18 nicklas 83   /**
5077 07 Nov 18 nicklas 84     The definition of the "Lysate" extract subtype.
5077 07 Nov 18 nicklas 85     @since 1.4
5077 07 Nov 18 nicklas 86   */
5077 07 Nov 18 nicklas 87   public static final Subtype LYSATE = new Subtype("Lysate", "l", Item.EXTRACT, false);
5077 07 Nov 18 nicklas 88
5077 07 Nov 18 nicklas 89   /**
4353 13 Feb 17 nicklas 90     The definition of the "RNA" extract subtype.
4353 13 Feb 17 nicklas 91   */
4353 13 Feb 17 nicklas 92   public static final Subtype RNA = new Subtype("RNA", "r", Item.EXTRACT, false);
4353 13 Feb 17 nicklas 93
4353 13 Feb 17 nicklas 94   /**
5109 19 Nov 18 nicklas 95     The definition of the "DNA" extract subtype.
5109 19 Nov 18 nicklas 96     @since 1.4
5109 19 Nov 18 nicklas 97   */
5109 19 Nov 18 nicklas 98   public static final Subtype DNA = new Subtype("DNA", "d", Item.EXTRACT, false);
5109 19 Nov 18 nicklas 99
5109 19 Nov 18 nicklas 100   /**
5109 19 Nov 18 nicklas 101     The definition of the "FlowThrough" extract subtype.
5109 19 Nov 18 nicklas 102     @since 1.4
5109 19 Nov 18 nicklas 103   */
5109 19 Nov 18 nicklas 104   public static final Subtype FLOW_THROUGH = new Subtype("FlowThrough", "ft", Item.EXTRACT, false);
5109 19 Nov 18 nicklas 105   
5109 19 Nov 18 nicklas 106   /**
4353 13 Feb 17 nicklas 107     The definition of the "Library" extract subtype. Should already exist
4353 13 Feb 17 nicklas 108     in BASE.
4353 13 Feb 17 nicklas 109   */
4353 13 Feb 17 nicklas 110   public static final Subtype LIBRARY = new Subtype("Library", "lib", Item.EXTRACT, false);
4353 13 Feb 17 nicklas 111
4353 13 Feb 17 nicklas 112   /**
4399 16 Mar 17 nicklas 113     The definition of the "MergedSequences" derived bioassay subtype.
4399 16 Mar 17 nicklas 114   */
4399 16 Mar 17 nicklas 115   public static final Subtype MERGED_SEQUENCES = new Subtype("MergedSequences", "g", Item.DERIVEDBIOASSAY, false);
7008 25 Jan 23 nicklas 116
7008 25 Jan 23 nicklas 117   /**
7008 25 Jan 23 nicklas 118     The definition of the "Methylation" derived bioassay subtype.
7008 25 Jan 23 nicklas 119     @since 1.7
7008 25 Jan 23 nicklas 120   */
7008 25 Jan 23 nicklas 121   public static final Subtype METHYLATION = new Subtype("Methylation", "mth", Item.DERIVEDBIOASSAY, false);
4399 16 Mar 17 nicklas 122   
4409 20 Mar 17 nicklas 123   /**
4409 20 Mar 17 nicklas 124     File subtype for sequence data files (FASTQ).
4409 20 Mar 17 nicklas 125   */
4409 20 Mar 17 nicklas 126   public static final Subtype SEQUENCE_DATA = new Subtype("Sequence data", null, Item.FILE, false);
4399 16 Mar 17 nicklas 127   
4399 16 Mar 17 nicklas 128   /**
4409 20 Mar 17 nicklas 129     File subtype for raw data files (generic, should already exist in BASE).
4409 20 Mar 17 nicklas 130   */
4409 20 Mar 17 nicklas 131   public static final Subtype RAW_DATA = new Subtype("Raw data", null, Item.FILE, false);
4409 20 Mar 17 nicklas 132
4409 20 Mar 17 nicklas 133   /**
5874 23 Mar 20 nicklas 134     File subtype for variant call files.
5874 23 Mar 20 nicklas 135     @since 1.6
5874 23 Mar 20 nicklas 136   */
5874 23 Mar 20 nicklas 137   public static final Subtype VARIANT_CALL_FORMAT = new Subtype("Variant call format", null, Item.FILE, false);
5874 23 Mar 20 nicklas 138
5874 23 Mar 20 nicklas 139   /**
7015 26 Jan 23 nicklas 140     File subtype for IDAT files.
7015 26 Jan 23 nicklas 141     @since 1.7
7015 26 Jan 23 nicklas 142   */
7015 26 Jan 23 nicklas 143   public static final Subtype IDAT = new Subtype("IDAT", null, Item.FILE, false);
7015 26 Jan 23 nicklas 144
7015 26 Jan 23 nicklas 145   /**
7015 26 Jan 23 nicklas 146     File subtype for GTC files.
7015 26 Jan 23 nicklas 147     @since 1.7
7015 26 Jan 23 nicklas 148   */
7015 26 Jan 23 nicklas 149   public static final Subtype GTC = new Subtype("Genotype call", null, Item.FILE, false);
7015 26 Jan 23 nicklas 150
7015 26 Jan 23 nicklas 151   /**
4353 13 Feb 17 nicklas 152     Get the subtype by name of the static constant defined in this class.
4353 13 Feb 17 nicklas 153     
4353 13 Feb 17 nicklas 154     @param cName The name of the static constant
4353 13 Feb 17 nicklas 155     @return A subtype object or null if not found
4353 13 Feb 17 nicklas 156   */
4353 13 Feb 17 nicklas 157   public static Subtype getByCName(String cName)
4353 13 Feb 17 nicklas 158   {
4353 13 Feb 17 nicklas 159     if (cName == null) return null;
4353 13 Feb 17 nicklas 160     Subtype subtype = null;
4353 13 Feb 17 nicklas 161     try
4353 13 Feb 17 nicklas 162     {
4353 13 Feb 17 nicklas 163       Field f = Subtype.class.getDeclaredField(cName);
4353 13 Feb 17 nicklas 164       subtype = (Subtype)f.get(null);
4353 13 Feb 17 nicklas 165     }
4353 13 Feb 17 nicklas 166     catch (NoSuchFieldException ex)
4353 13 Feb 17 nicklas 167     {}
4353 13 Feb 17 nicklas 168     catch (IllegalAccessException ex)
4353 13 Feb 17 nicklas 169     {}
4353 13 Feb 17 nicklas 170     catch (ClassCastException ex)
4353 13 Feb 17 nicklas 171     {}
4353 13 Feb 17 nicklas 172     return subtype;
4353 13 Feb 17 nicklas 173   }
4353 13 Feb 17 nicklas 174   
4353 13 Feb 17 nicklas 175   private final String name;
4353 13 Feb 17 nicklas 176   private final String itemSuffix;
4353 13 Feb 17 nicklas 177   private final Item mainType;
4353 13 Feb 17 nicklas 178   private final boolean pushAnnotations;
4353 13 Feb 17 nicklas 179   private int id;
4353 13 Feb 17 nicklas 180   private JSONObject json;
4353 13 Feb 17 nicklas 181   
4353 13 Feb 17 nicklas 182   /**
4353 13 Feb 17 nicklas 183     Create a new definition
4353 13 Feb 17 nicklas 184     @param name The name of the subtype
4353 13 Feb 17 nicklas 185     @param mainType The main item type of the subtype
4353 13 Feb 17 nicklas 186   */
4353 13 Feb 17 nicklas 187   private Subtype(String name, String itemSuffix, Item mainType, boolean pushAnnotations)
4353 13 Feb 17 nicklas 188   {
4353 13 Feb 17 nicklas 189     this.name = name;
4353 13 Feb 17 nicklas 190     this.itemSuffix = itemSuffix;
4353 13 Feb 17 nicklas 191     this.mainType = mainType;
4353 13 Feb 17 nicklas 192     this.pushAnnotations = pushAnnotations;
4353 13 Feb 17 nicklas 193   }
4353 13 Feb 17 nicklas 194   
4353 13 Feb 17 nicklas 195   /**
4353 13 Feb 17 nicklas 196     Get the name of the subtype.
4353 13 Feb 17 nicklas 197   */
4353 13 Feb 17 nicklas 198   public String getName()
4353 13 Feb 17 nicklas 199   {
4353 13 Feb 17 nicklas 200     return name;
4353 13 Feb 17 nicklas 201   }
4353 13 Feb 17 nicklas 202   
4353 13 Feb 17 nicklas 203   /**
4353 13 Feb 17 nicklas 204     Get the suffix to use for items of this type.
4353 13 Feb 17 nicklas 205     Null if no suffix is used.
4353 13 Feb 17 nicklas 206   */
4353 13 Feb 17 nicklas 207   public String getItemSuffix()
4353 13 Feb 17 nicklas 208   {
4353 13 Feb 17 nicklas 209     return itemSuffix;
4353 13 Feb 17 nicklas 210   }
4353 13 Feb 17 nicklas 211   
4353 13 Feb 17 nicklas 212   /**
4353 13 Feb 17 nicklas 213     Get the main item type of the subtype.
4353 13 Feb 17 nicklas 214   */
4353 13 Feb 17 nicklas 215   public Item getMainType()
4353 13 Feb 17 nicklas 216   {
4353 13 Feb 17 nicklas 217     return mainType;
4353 13 Feb 17 nicklas 218   }
4353 13 Feb 17 nicklas 219   
4353 13 Feb 17 nicklas 220   /**
4353 13 Feb 17 nicklas 221     Should annotations on items with this subtype be pushed
4353 13 Feb 17 nicklas 222     to the parent item or not?
4353 13 Feb 17 nicklas 223   */
4353 13 Feb 17 nicklas 224   public boolean getPushAnnotations()
4353 13 Feb 17 nicklas 225   {
4353 13 Feb 17 nicklas 226     return pushAnnotations;
4353 13 Feb 17 nicklas 227   }
4353 13 Feb 17 nicklas 228   
4353 13 Feb 17 nicklas 229   /**
4353 13 Feb 17 nicklas 230     Get the subtype information as a JSON object ready to be sent as an AJAX response.
4353 13 Feb 17 nicklas 231   */
4353 13 Feb 17 nicklas 232   public JSONObject asJSONObject(DbControl dc)
4353 13 Feb 17 nicklas 233   {
4353 13 Feb 17 nicklas 234     if (json == null)
4353 13 Feb 17 nicklas 235     {
4353 13 Feb 17 nicklas 236       if (id==0) load(dc); // Ensure that the subtype has been loaded
4353 13 Feb 17 nicklas 237       json = new JSONObject();
4353 13 Feb 17 nicklas 238       json.put("id", id);
4353 13 Feb 17 nicklas 239       json.put("name", getName());
4353 13 Feb 17 nicklas 240       json.put("mainType", getMainType().name());
4353 13 Feb 17 nicklas 241     }
4353 13 Feb 17 nicklas 242     return json;
4353 13 Feb 17 nicklas 243   }
4353 13 Feb 17 nicklas 244   
4353 13 Feb 17 nicklas 245   /**
4353 13 Feb 17 nicklas 246     Load the subtype as a BASE item. Same as {@link #get(DbControl)}
4353 13 Feb 17 nicklas 247     but throw an exception instead of returning null if no BASE
4353 13 Feb 17 nicklas 248     item exists.
4353 13 Feb 17 nicklas 249     @param dc The DbControl to use for database access
4353 13 Feb 17 nicklas 250     @return An ItemSubtype object
4353 13 Feb 17 nicklas 251   */
4353 13 Feb 17 nicklas 252   public ItemSubtype load(DbControl dc)
4353 13 Feb 17 nicklas 253   {
4353 13 Feb 17 nicklas 254     ItemSubtype subtype = null;
4353 13 Feb 17 nicklas 255     if (id == 0)
4353 13 Feb 17 nicklas 256     {
4353 13 Feb 17 nicklas 257       List<ItemSubtype> result = list(dc);
4353 13 Feb 17 nicklas 258       if (result.size() == 0)
4353 13 Feb 17 nicklas 259       {
4353 13 Feb 17 nicklas 260         throw new ItemNotFoundException("ItemSubtype["+name+"]");
4353 13 Feb 17 nicklas 261       }
4353 13 Feb 17 nicklas 262       else if (result.size() > 1)
4353 13 Feb 17 nicklas 263       {
4353 13 Feb 17 nicklas 264         throw new InvalidDataException("Found > 1 ItemSubtype["+name+"]");
4353 13 Feb 17 nicklas 265       }
4353 13 Feb 17 nicklas 266       subtype = result.get(0);
4353 13 Feb 17 nicklas 267       id = subtype.getId();
4353 13 Feb 17 nicklas 268     }
4353 13 Feb 17 nicklas 269     else
4353 13 Feb 17 nicklas 270     {
4353 13 Feb 17 nicklas 271       subtype = ItemSubtype.getById(dc, id);
4353 13 Feb 17 nicklas 272     }
4353 13 Feb 17 nicklas 273     return subtype;
4353 13 Feb 17 nicklas 274   }
4353 13 Feb 17 nicklas 275   
4353 13 Feb 17 nicklas 276   /**
4353 13 Feb 17 nicklas 277     Load the subtype as a BASE item. Same as {@link #load(DbControl)} 
4353 13 Feb 17 nicklas 278     but return null  if no BASE item is found instead of throwing an exception.
4353 13 Feb 17 nicklas 279     @param dc The DbControl to use for database access
4353 13 Feb 17 nicklas 280     @return An ItemSubtype object
4353 13 Feb 17 nicklas 281   */
4353 13 Feb 17 nicklas 282   public ItemSubtype get(DbControl dc)
4353 13 Feb 17 nicklas 283   {
4353 13 Feb 17 nicklas 284     ItemSubtype subtype = null;
4353 13 Feb 17 nicklas 285     if (id == 0)
4353 13 Feb 17 nicklas 286     {
4353 13 Feb 17 nicklas 287       List<ItemSubtype> result = list(dc);
4353 13 Feb 17 nicklas 288       if (result.size() == 1)
4353 13 Feb 17 nicklas 289       {
4353 13 Feb 17 nicklas 290         subtype = result.get(0);
4353 13 Feb 17 nicklas 291         id = subtype.getId();
4353 13 Feb 17 nicklas 292       }
4353 13 Feb 17 nicklas 293     }
4353 13 Feb 17 nicklas 294     else
4353 13 Feb 17 nicklas 295     {
4353 13 Feb 17 nicklas 296       subtype = ItemSubtype.getById(dc, id);
4353 13 Feb 17 nicklas 297     }
4353 13 Feb 17 nicklas 298     return subtype;
4353 13 Feb 17 nicklas 299     
4353 13 Feb 17 nicklas 300   }
4353 13 Feb 17 nicklas 301   
4353 13 Feb 17 nicklas 302   /**
4353 13 Feb 17 nicklas 303     List all subtypes registered in BASE with a name and main item type
4353 13 Feb 17 nicklas 304     matching this subtype definition. Normally, only a single subtype 
4353 13 Feb 17 nicklas 305     should be returned.
4353 13 Feb 17 nicklas 306   */
4353 13 Feb 17 nicklas 307   public List<ItemSubtype> list(DbControl dc)
4353 13 Feb 17 nicklas 308   {
4353 13 Feb 17 nicklas 309     ItemQuery<ItemSubtype> query = ItemSubtype.getQuery(getMainType());
4353 13 Feb 17 nicklas 310     query.restrict(
4353 13 Feb 17 nicklas 311       Restrictions.eq(
4353 13 Feb 17 nicklas 312         Hql.property("name"), 
4353 13 Feb 17 nicklas 313         Expressions.parameter("name", getName(), Type.STRING)
4353 13 Feb 17 nicklas 314       ));
4353 13 Feb 17 nicklas 315     query.include(Include.ALL);
4353 13 Feb 17 nicklas 316     return query.list(dc);
4353 13 Feb 17 nicklas 317   }
4353 13 Feb 17 nicklas 318   
4353 13 Feb 17 nicklas 319   /**
5079 08 Nov 18 nicklas 320     Get the annotation type category with the same name as this subtype.
5079 08 Nov 18 nicklas 321     Returns null if no category exists.
5079 08 Nov 18 nicklas 322     @since 1.4
5079 08 Nov 18 nicklas 323   */
5079 08 Nov 18 nicklas 324   public AnnotationTypeCategory getAnnotationTypeCategory(DbControl dc)
5079 08 Nov 18 nicklas 325   {
5079 08 Nov 18 nicklas 326     ItemQuery<AnnotationTypeCategory> query = AnnotationTypeCategory.getQuery();
5079 08 Nov 18 nicklas 327     query.include(Include.ALL);
5079 08 Nov 18 nicklas 328     query.restrict(
5079 08 Nov 18 nicklas 329       Restrictions.eq(
5079 08 Nov 18 nicklas 330         Hql.property("name"), 
5079 08 Nov 18 nicklas 331         Expressions.parameter("name", getName(), Type.STRING)
5079 08 Nov 18 nicklas 332       ));
5079 08 Nov 18 nicklas 333     List<AnnotationTypeCategory> result = query.list(dc);
5079 08 Nov 18 nicklas 334     return result.size() == 1 ? result.get(0) : null;
5079 08 Nov 18 nicklas 335   }
5079 08 Nov 18 nicklas 336   
5079 08 Nov 18 nicklas 337   /**
4353 13 Feb 17 nicklas 338     Add a filter restriction the given query so that it
4353 13 Feb 17 nicklas 339     only return items of this subtype.
4353 13 Feb 17 nicklas 340     
4353 13 Feb 17 nicklas 341     @param query The query to filter
4353 13 Feb 17 nicklas 342   */
4353 13 Feb 17 nicklas 343   public void addFilter(DbControl dc, ItemQuery<? extends Subtypable> query)
4353 13 Feb 17 nicklas 344   {
4353 13 Feb 17 nicklas 345     addFilter(dc, query, null);
4353 13 Feb 17 nicklas 346   }
4353 13 Feb 17 nicklas 347
4353 13 Feb 17 nicklas 348   /**
4353 13 Feb 17 nicklas 349     Add a filter restriction to the given query based on the 
4353 13 Feb 17 nicklas 350     given subtype. If no alias is specified, the filter is
4353 13 Feb 17 nicklas 351     applied to the root item, otherwise it is applied
4353 13 Feb 17 nicklas 352     to the alias of a joined (eg. parent or child) item
4353 13 Feb 17 nicklas 353     
4353 13 Feb 17 nicklas 354     @param query The query to restrict
4353 13 Feb 17 nicklas 355     @param alias Specify an alias if the filter should be
4353 13 Feb 17 nicklas 356       placed on a joined (eg. child or parent) item instead
4353 13 Feb 17 nicklas 357       of the root item
4353 13 Feb 17 nicklas 358   */
4353 13 Feb 17 nicklas 359   public void addFilter(DbControl dc, ItemQuery<?> query, String alias)
4353 13 Feb 17 nicklas 360   {
4353 13 Feb 17 nicklas 361     query.restrict(restriction(dc, alias));
4353 13 Feb 17 nicklas 362   }
4353 13 Feb 17 nicklas 363   
4353 13 Feb 17 nicklas 364   public Restriction restriction(DbControl dc, String alias)
4353 13 Feb 17 nicklas 365   {
4353 13 Feb 17 nicklas 366     if (id==0) load(dc); // Ensure that the subtype has been loaded
4353 13 Feb 17 nicklas 367     return Restrictions.eq(Hql.property(alias, "itemSubtype.id"), Expressions.integer(id));
4353 13 Feb 17 nicklas 368   }
4353 13 Feb 17 nicklas 369
4353 13 Feb 17 nicklas 370   @Override
4353 13 Feb 17 nicklas 371   public int hashCode() 
4353 13 Feb 17 nicklas 372   {
4353 13 Feb 17 nicklas 373     return id;
4353 13 Feb 17 nicklas 374   }
4353 13 Feb 17 nicklas 375
4353 13 Feb 17 nicklas 376   @Override
4353 13 Feb 17 nicklas 377   public boolean equals(Object other) 
4353 13 Feb 17 nicklas 378   {
4353 13 Feb 17 nicklas 379     if (this == other) return true;
4353 13 Feb 17 nicklas 380     if (other == null || this.getClass() != other.getClass()) return false;
4353 13 Feb 17 nicklas 381     return id == ((Subtype)other).id;
4353 13 Feb 17 nicklas 382   }
4353 13 Feb 17 nicklas 383   
4353 13 Feb 17 nicklas 384 }