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

Code
Comments
Other
Rev Date Author Line
6791 23 Mar 15 nicklas 1 /**
6791 23 Mar 15 nicklas 2   $Id$
6791 23 Mar 15 nicklas 3
6791 23 Mar 15 nicklas 4   Copyright (C) 2015 Nicklas Nordborg
6791 23 Mar 15 nicklas 5
6791 23 Mar 15 nicklas 6   This file is part of BASE - BioArray Software Environment.
6791 23 Mar 15 nicklas 7   Available at http://base.thep.lu.se/
6791 23 Mar 15 nicklas 8
6791 23 Mar 15 nicklas 9   BASE is free software; you can redistribute it and/or
6791 23 Mar 15 nicklas 10   modify it under the terms of the GNU General Public License
6791 23 Mar 15 nicklas 11   as published by the Free Software Foundation; either version 3
6791 23 Mar 15 nicklas 12   of the License, or (at your option) any later version.
6791 23 Mar 15 nicklas 13
6791 23 Mar 15 nicklas 14   BASE is distributed in the hope that it will be useful,
6791 23 Mar 15 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
6791 23 Mar 15 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6791 23 Mar 15 nicklas 17   GNU General Public License for more details.
6791 23 Mar 15 nicklas 18
6791 23 Mar 15 nicklas 19   You should have received a copy of the GNU General Public License
6791 23 Mar 15 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
6791 23 Mar 15 nicklas 21 */
6791 23 Mar 15 nicklas 22 package net.sf.basedb.util.listable;
6791 23 Mar 15 nicklas 23
6791 23 Mar 15 nicklas 24 import java.util.HashSet;
6791 23 Mar 15 nicklas 25 import java.util.Set;
6791 23 Mar 15 nicklas 26
6791 23 Mar 15 nicklas 27 import net.sf.basedb.core.DbControl;
6791 23 Mar 15 nicklas 28 import net.sf.basedb.core.Extract;
6791 23 Mar 15 nicklas 29 import net.sf.basedb.core.Item;
6791 23 Mar 15 nicklas 30 import net.sf.basedb.core.ItemQuery;
6791 23 Mar 15 nicklas 31 import net.sf.basedb.core.query.Expressions;
6791 23 Mar 15 nicklas 32 import net.sf.basedb.core.query.Hql;
6791 23 Mar 15 nicklas 33 import net.sf.basedb.core.query.Restrictions;
6791 23 Mar 15 nicklas 34
6791 23 Mar 15 nicklas 35 /**
6791 23 Mar 15 nicklas 36   Collect extracts seen on derived bioassays and raw bioassays that
6791 23 Mar 15 nicklas 37   has been loaded by other transformers. Use the {@link #collectFromDerivedBioAssays(boolean)}
6791 23 Mar 15 nicklas 38   and {@link #collectFromRawBioAssays()} methods to create transformers that can be inserted
6791 23 Mar 15 nicklas 39   into the chain of {@link SourceItemTransformerChain}.
6791 23 Mar 15 nicklas 40   
6791 23 Mar 15 nicklas 41   @author Nicklas
6791 23 Mar 15 nicklas 42   @since 3.5
6791 23 Mar 15 nicklas 43 */
6791 23 Mar 15 nicklas 44 public class CollectExtracts 
6791 23 Mar 15 nicklas 45 {
6791 23 Mar 15 nicklas 46   
6791 23 Mar 15 nicklas 47   private final Set<Integer> collected;
6801 25 Mar 15 nicklas 48   private final Set<Integer> parents;
6801 25 Mar 15 nicklas 49   private final Set<Integer> children;
7838 28 Aug 20 nicklas 50   private boolean needWrapper = true;
6791 23 Mar 15 nicklas 51   
6791 23 Mar 15 nicklas 52   /**
6791 23 Mar 15 nicklas 53     Create a new derived bioassay to physical bioassay transformer.
6791 23 Mar 15 nicklas 54   */
6791 23 Mar 15 nicklas 55   public CollectExtracts() 
6791 23 Mar 15 nicklas 56   {
6791 23 Mar 15 nicklas 57     collected = new HashSet<Integer>();
6801 25 Mar 15 nicklas 58     parents = new HashSet<Integer>();
6801 25 Mar 15 nicklas 59     children = new HashSet<Integer>();
6791 23 Mar 15 nicklas 60   }
6791 23 Mar 15 nicklas 61   
7838 28 Aug 20 nicklas 62   /**
7838 28 Aug 20 nicklas 63     Clear all collected extracts in order to prepare for a new
7838 28 Aug 20 nicklas 64     collection.
7838 28 Aug 20 nicklas 65     @since 3.17
7838 28 Aug 20 nicklas 66   */
7838 28 Aug 20 nicklas 67   void resetCollected()
7838 28 Aug 20 nicklas 68   {
7838 28 Aug 20 nicklas 69     collected.clear();
7838 28 Aug 20 nicklas 70     parents.clear();
7838 28 Aug 20 nicklas 71     children.clear();
7838 28 Aug 20 nicklas 72   }
6791 23 Mar 15 nicklas 73   
6791 23 Mar 15 nicklas 74   /**
7838 28 Aug 20 nicklas 75     Wraps the parent transformer with a ResetCollected transformer the
7838 28 Aug 20 nicklas 76     first time this method is called. If called more than once, the
7838 28 Aug 20 nicklas 77     parent is return unwrapped.
7838 28 Aug 20 nicklas 78     @since 3.17
7838 28 Aug 20 nicklas 79   */
7838 28 Aug 20 nicklas 80   private SourceItemTransformer wrapForReset(SourceItemTransformer transformer)
7838 28 Aug 20 nicklas 81   {
7838 28 Aug 20 nicklas 82     if (needWrapper) 
7838 28 Aug 20 nicklas 83     {
7838 28 Aug 20 nicklas 84       needWrapper = false;
7838 28 Aug 20 nicklas 85       transformer = new ResetCollected(transformer);
7838 28 Aug 20 nicklas 86     }
7838 28 Aug 20 nicklas 87     return transformer;
7838 28 Aug 20 nicklas 88   }
7838 28 Aug 20 nicklas 89   
7838 28 Aug 20 nicklas 90   /**
6791 23 Mar 15 nicklas 91     The created transformer collect the ID:s of all extracts linked from
6791 23 Mar 15 nicklas 92     the source derived bioassays and then return the same set of derived
6791 23 Mar 15 nicklas 93     bioassays again. If loadParents is set, extract ID:s will also
6791 23 Mar 15 nicklas 94     be collected from all parent derived bioassays (as loaded by
6791 23 Mar 15 nicklas 95     {@link DerivedBioAssayToParentDerivedBioAssayTransformer}).
6791 23 Mar 15 nicklas 96   */
6791 23 Mar 15 nicklas 97   public SourceItemTransformer collectFromDerivedBioAssays(boolean loadParents)
6791 23 Mar 15 nicklas 98   {
7838 28 Aug 20 nicklas 99     return wrapForReset(new CollectFromDerivedBioAssays(loadParents));
6791 23 Mar 15 nicklas 100   }
6791 23 Mar 15 nicklas 101
6791 23 Mar 15 nicklas 102   /**
6791 23 Mar 15 nicklas 103     The created transformer collect the ID:s of all extracts linked from
6791 23 Mar 15 nicklas 104     the source raw bioassays and then return the same set of raw bioassays
6791 23 Mar 15 nicklas 105     again.
6791 23 Mar 15 nicklas 106   */
6791 23 Mar 15 nicklas 107   public SourceItemTransformer collectFromRawBioAssays()
6791 23 Mar 15 nicklas 108   {
7838 28 Aug 20 nicklas 109     return wrapForReset(new CollectFromRawBioAssays());
6791 23 Mar 15 nicklas 110   }
6791 23 Mar 15 nicklas 111   
6791 23 Mar 15 nicklas 112   /**
6792 23 Mar 15 nicklas 113     The created transformer collect the ID:s of all extracts in the 
6801 25 Mar 15 nicklas 114     source collection and return same set of extracts again.
6792 23 Mar 15 nicklas 115   */
6801 25 Mar 15 nicklas 116   public SourceItemTransformer collectFromExtracts()
6792 23 Mar 15 nicklas 117   {
7838 28 Aug 20 nicklas 118     return wrapForReset(new CollectFromExtracts());
6792 23 Mar 15 nicklas 119   }
6792 23 Mar 15 nicklas 120   
6792 23 Mar 15 nicklas 121   /**
6801 25 Mar 15 nicklas 122     The created transformer collect the ID:s of all parent
6801 25 Mar 15 nicklas 123     extracts to the already collected extracts and store them in the
6801 25 Mar 15 nicklas 124     {@link #getCollectedParents()}. If the 'includeCollected' flag
6801 25 Mar 15 nicklas 125     is set, the collected extracts are included among the parents.
6801 25 Mar 15 nicklas 126   */
6801 25 Mar 15 nicklas 127   public SourceItemTransformer collectParentsOfCollected(boolean includeCollected)
6801 25 Mar 15 nicklas 128   {
7838 28 Aug 20 nicklas 129     return wrapForReset(new CollectParents(true, includeCollected));
6801 25 Mar 15 nicklas 130   }
6801 25 Mar 15 nicklas 131   
6801 25 Mar 15 nicklas 132   /**
6801 25 Mar 15 nicklas 133     The created transformer collect the ID:s of all parent
6801 25 Mar 15 nicklas 134     extracts to the source extracts and store them in the
6801 25 Mar 15 nicklas 135     {@link #getCollectedParents()}. If the 'includeSource' flag
6801 25 Mar 15 nicklas 136     is set, the source extracts are included among the parents.
6801 25 Mar 15 nicklas 137   */
6801 25 Mar 15 nicklas 138   public SourceItemTransformer collectParentsOfSource(boolean includeSource)
6801 25 Mar 15 nicklas 139   {
7838 28 Aug 20 nicklas 140     return wrapForReset(new CollectParents(false, includeSource));
6801 25 Mar 15 nicklas 141   }
6801 25 Mar 15 nicklas 142   
6801 25 Mar 15 nicklas 143   
6801 25 Mar 15 nicklas 144   /**
6801 25 Mar 15 nicklas 145     The created transformer collect the ID:s of all child
6801 25 Mar 15 nicklas 146     extracts to the already collected extracts and store them in the
6801 25 Mar 15 nicklas 147     {@link #getCollectedChildren()}. If the 'includeCollected' flag
6801 25 Mar 15 nicklas 148     is set, the collected extracts are included among the children.
6801 25 Mar 15 nicklas 149   */
6801 25 Mar 15 nicklas 150   public SourceItemTransformer collectChildrenOfCollected(boolean includeCollected)
6801 25 Mar 15 nicklas 151   {
7838 28 Aug 20 nicklas 152     return wrapForReset(new CollectChildren(true, includeCollected));
6801 25 Mar 15 nicklas 153   }
6801 25 Mar 15 nicklas 154   
6801 25 Mar 15 nicklas 155   /**
6801 25 Mar 15 nicklas 156     The created transformer collect the ID:s of all child
6801 25 Mar 15 nicklas 157     extracts to the source extracts and store them in the
6801 25 Mar 15 nicklas 158     {@link #getCollectedChildren()}. If the 'includeSource' flag
6801 25 Mar 15 nicklas 159     is set, the source extracts are included among the parents.
6801 25 Mar 15 nicklas 160   */
6801 25 Mar 15 nicklas 161   public SourceItemTransformer collectChildrenOfSource(boolean includeSource)
6801 25 Mar 15 nicklas 162   {
7838 28 Aug 20 nicklas 163     return wrapForReset(new CollectChildren(false, includeSource));
6801 25 Mar 15 nicklas 164   }
6801 25 Mar 15 nicklas 165   
6801 25 Mar 15 nicklas 166   /**
6792 23 Mar 15 nicklas 167     Get all extracts that has been collected.
6792 23 Mar 15 nicklas 168   */
6792 23 Mar 15 nicklas 169   public Set<Integer> getCollected()
6792 23 Mar 15 nicklas 170   {
6792 23 Mar 15 nicklas 171     return collected;
6792 23 Mar 15 nicklas 172   }
6792 23 Mar 15 nicklas 173   
6792 23 Mar 15 nicklas 174   /**
6801 25 Mar 15 nicklas 175     Get parent extracts that was collected by the
6880 21 Apr 15 nicklas 176     {@link #collectParentsOfSource(boolean)} or 
6880 21 Apr 15 nicklas 177     {@link #collectParentsOfCollected(boolean)} collector.
6791 23 Mar 15 nicklas 178   */
6801 25 Mar 15 nicklas 179   public Set<Integer> getCollectedParents()
6791 23 Mar 15 nicklas 180   {
6801 25 Mar 15 nicklas 181     return parents;
6791 23 Mar 15 nicklas 182   }
6791 23 Mar 15 nicklas 183   
6791 23 Mar 15 nicklas 184   /**
6801 25 Mar 15 nicklas 185     Get child extracts that was collected by the
6801 25 Mar 15 nicklas 186     {@link #collectChildrenOfCollected(boolean)} and/or 
6801 25 Mar 15 nicklas 187     {@link #collectChildrenOfSource(boolean)} collectors.
6791 23 Mar 15 nicklas 188   */
6801 25 Mar 15 nicklas 189   public Set<Integer> getCollectedChildren()
6791 23 Mar 15 nicklas 190   {
6801 25 Mar 15 nicklas 191     return children;
6791 23 Mar 15 nicklas 192   }
6791 23 Mar 15 nicklas 193   
6801 25 Mar 15 nicklas 194
6791 23 Mar 15 nicklas 195   /**
6791 23 Mar 15 nicklas 196     Transformer implementation that given a set of derived bioassays
6791 23 Mar 15 nicklas 197     load their linked extracts and store that in the parent class. The
6791 23 Mar 15 nicklas 198     original source of derived bioassays is returned unmodifed.
6791 23 Mar 15 nicklas 199   */
6791 23 Mar 15 nicklas 200   class CollectFromDerivedBioAssays
6791 23 Mar 15 nicklas 201     extends AbstractSourceItemTransformer
6791 23 Mar 15 nicklas 202   {
6791 23 Mar 15 nicklas 203     
6791 23 Mar 15 nicklas 204     private final boolean loadParents;
6791 23 Mar 15 nicklas 205     
6801 25 Mar 15 nicklas 206     CollectFromDerivedBioAssays(boolean loadParents) 
6791 23 Mar 15 nicklas 207     {
6791 23 Mar 15 nicklas 208       super(Item.DERIVEDBIOASSAY, Item.DERIVEDBIOASSAY);
6791 23 Mar 15 nicklas 209       this.loadParents = loadParents;
6791 23 Mar 15 nicklas 210     }
6791 23 Mar 15 nicklas 211
6791 23 Mar 15 nicklas 212
6791 23 Mar 15 nicklas 213     @Override
7836 28 Aug 20 nicklas 214     public Set<Integer> transform(TransformContext context, final Set<Integer> source) 
6791 23 Mar 15 nicklas 215     {
6791 23 Mar 15 nicklas 216       DbControl dc = context.getDbControl();
6791 23 Mar 15 nicklas 217       
6791 23 Mar 15 nicklas 218       Set<Integer> derviedBioAssays = source;
6791 23 Mar 15 nicklas 219       if (loadParents)
6791 23 Mar 15 nicklas 220       {
6791 23 Mar 15 nicklas 221         derviedBioAssays = new DerivedBioAssayToParentDerivedBioAssayTransformer(true).transform(context, source);
6791 23 Mar 15 nicklas 222       }
6791 23 Mar 15 nicklas 223       
6791 23 Mar 15 nicklas 224       ItemQuery<Extract> query = Extract.getQuery();
6848 13 Apr 15 nicklas 225       query.setIncludes(context.getInclude());
6791 23 Mar 15 nicklas 226       query.joinPermanent(Hql.innerJoin("derivedBioAssays", "dba"));
6791 23 Mar 15 nicklas 227       query.restrictPermanent(
6791 23 Mar 15 nicklas 228         Restrictions.in(
6791 23 Mar 15 nicklas 229           Hql.alias("dba"),
6791 23 Mar 15 nicklas 230           Expressions.parameter("derivedBioAssays")
6791 23 Mar 15 nicklas 231         )
6791 23 Mar 15 nicklas 232       );
6801 25 Mar 15 nicklas 233
6796 24 Mar 15 nicklas 234       collected.addAll(safeIdList(dc, query, "derivedBioAssays", derviedBioAssays));
6801 25 Mar 15 nicklas 235       //System.out.println("Collected extracts: " + collected);
6791 23 Mar 15 nicklas 236       return source;
6791 23 Mar 15 nicklas 237     }
6791 23 Mar 15 nicklas 238     
6791 23 Mar 15 nicklas 239   }
6791 23 Mar 15 nicklas 240   
6791 23 Mar 15 nicklas 241   /**
6791 23 Mar 15 nicklas 242     Transformer implementation that given a set of raw bioassays
6791 23 Mar 15 nicklas 243     load their linked extracts and store that in the parent class. The
6791 23 Mar 15 nicklas 244     original source of raw bioassays is returned unmodifed.
6791 23 Mar 15 nicklas 245   */
6791 23 Mar 15 nicklas 246   class CollectFromRawBioAssays
6791 23 Mar 15 nicklas 247     extends AbstractSourceItemTransformer
6791 23 Mar 15 nicklas 248   {
6791 23 Mar 15 nicklas 249     
6801 25 Mar 15 nicklas 250     CollectFromRawBioAssays() 
6791 23 Mar 15 nicklas 251     {
6791 23 Mar 15 nicklas 252       super(Item.RAWBIOASSAY, Item.RAWBIOASSAY);
6791 23 Mar 15 nicklas 253     }
6791 23 Mar 15 nicklas 254   
6791 23 Mar 15 nicklas 255   
6791 23 Mar 15 nicklas 256     @Override
7836 28 Aug 20 nicklas 257     public Set<Integer> transform(TransformContext context, final Set<Integer> source) 
6791 23 Mar 15 nicklas 258     {
6791 23 Mar 15 nicklas 259       DbControl dc = context.getDbControl();
6791 23 Mar 15 nicklas 260       
6791 23 Mar 15 nicklas 261       ItemQuery<Extract> query = Extract.getQuery();
6848 13 Apr 15 nicklas 262       query.setIncludes(context.getInclude());
6791 23 Mar 15 nicklas 263       query.joinPermanent(Hql.innerJoin("rawBioAssays", "rba"));
6791 23 Mar 15 nicklas 264       query.restrictPermanent(
6791 23 Mar 15 nicklas 265         Restrictions.in(
6791 23 Mar 15 nicklas 266           Hql.alias("rba"),
6791 23 Mar 15 nicklas 267           Expressions.parameter("rawBioAssays")
6791 23 Mar 15 nicklas 268         )
6791 23 Mar 15 nicklas 269       );
6791 23 Mar 15 nicklas 270       
6796 24 Mar 15 nicklas 271       collected.addAll(safeIdList(dc, query, "rawBioAssays", source));
6801 25 Mar 15 nicklas 272       //System.out.println("Collected extracts: " + collected);
6791 23 Mar 15 nicklas 273       return source;
6791 23 Mar 15 nicklas 274     }
6791 23 Mar 15 nicklas 275   }
6791 23 Mar 15 nicklas 276
6792 23 Mar 15 nicklas 277   /**
6792 23 Mar 15 nicklas 278     Transformer implementation that store the given set of
6792 23 Mar 15 nicklas 279     extracts in the parent class. The original source of extracts
6792 23 Mar 15 nicklas 280     is returned unmodifed.
6792 23 Mar 15 nicklas 281   */
6792 23 Mar 15 nicklas 282   class CollectFromExtracts
6792 23 Mar 15 nicklas 283     extends AbstractSourceItemTransformer
6792 23 Mar 15 nicklas 284   {
6792 23 Mar 15 nicklas 285     
6801 25 Mar 15 nicklas 286     CollectFromExtracts() 
6801 25 Mar 15 nicklas 287     {
6801 25 Mar 15 nicklas 288       super(Item.EXTRACT, Item.EXTRACT);
6801 25 Mar 15 nicklas 289     }
6801 25 Mar 15 nicklas 290   
6801 25 Mar 15 nicklas 291     @Override
7836 28 Aug 20 nicklas 292     public Set<Integer> transform(TransformContext context, final Set<Integer> source) 
6801 25 Mar 15 nicklas 293     {
6801 25 Mar 15 nicklas 294       collected.addAll(source);
6801 25 Mar 15 nicklas 295       //System.out.println("Collected extracts: " + collected);
6801 25 Mar 15 nicklas 296       return source;
6801 25 Mar 15 nicklas 297     }
6801 25 Mar 15 nicklas 298   }
6801 25 Mar 15 nicklas 299
6801 25 Mar 15 nicklas 300   /**
6801 25 Mar 15 nicklas 301     Transformer implementation that collect the parent extracts from 
6801 25 Mar 15 nicklas 302     the source or collected extracts. The original source of extracts is 
6801 25 Mar 15 nicklas 303     returned unmodifed.
6801 25 Mar 15 nicklas 304   */
6801 25 Mar 15 nicklas 305   class CollectParents
6801 25 Mar 15 nicklas 306     extends AbstractSourceItemTransformer
6801 25 Mar 15 nicklas 307   {
6792 23 Mar 15 nicklas 308     
6801 25 Mar 15 nicklas 309     private final boolean useCollectedAsSource;
6801 25 Mar 15 nicklas 310     private final boolean includeSource;
6801 25 Mar 15 nicklas 311     
6801 25 Mar 15 nicklas 312     
6801 25 Mar 15 nicklas 313     CollectParents(boolean useCollectedAsSource, boolean includeSource) 
6792 23 Mar 15 nicklas 314     {
6792 23 Mar 15 nicklas 315       super(Item.EXTRACT, Item.EXTRACT);
6801 25 Mar 15 nicklas 316       this.useCollectedAsSource = useCollectedAsSource;
6801 25 Mar 15 nicklas 317       this.includeSource = includeSource;
6792 23 Mar 15 nicklas 318     }
6792 23 Mar 15 nicklas 319   
6792 23 Mar 15 nicklas 320     @Override
7836 28 Aug 20 nicklas 321     public Set<Integer> transform(TransformContext context, final Set<Integer> source) 
6792 23 Mar 15 nicklas 322     {
7836 28 Aug 20 nicklas 323       Set<Integer> sourceToUse = useCollectedAsSource ? collected : source;
7836 28 Aug 20 nicklas 324       parents.addAll(new ExtractToParentExtractTransformer(includeSource).transform(context, sourceToUse));
6792 23 Mar 15 nicklas 325       return source;
6792 23 Mar 15 nicklas 326     }
6792 23 Mar 15 nicklas 327   }
6792 23 Mar 15 nicklas 328
6801 25 Mar 15 nicklas 329   /**
6801 25 Mar 15 nicklas 330     Transformer implementation that collect the child extracts from 
6801 25 Mar 15 nicklas 331     the source or collected extracts. The original source of extracts is 
6801 25 Mar 15 nicklas 332     returned unmodifed.
6801 25 Mar 15 nicklas 333   */
6801 25 Mar 15 nicklas 334   class CollectChildren
6801 25 Mar 15 nicklas 335     extends AbstractSourceItemTransformer
6801 25 Mar 15 nicklas 336   {
6801 25 Mar 15 nicklas 337     
6801 25 Mar 15 nicklas 338     private final boolean useCollectedAsSource;
6801 25 Mar 15 nicklas 339     private final boolean includeSource;
6801 25 Mar 15 nicklas 340     
6801 25 Mar 15 nicklas 341     
6801 25 Mar 15 nicklas 342     CollectChildren(boolean useCollectedAsSource, boolean includeSource) 
6801 25 Mar 15 nicklas 343     {
6801 25 Mar 15 nicklas 344       super(Item.EXTRACT, Item.EXTRACT);
6801 25 Mar 15 nicklas 345       this.useCollectedAsSource = useCollectedAsSource;
6801 25 Mar 15 nicklas 346       this.includeSource = includeSource;
6801 25 Mar 15 nicklas 347     }
6801 25 Mar 15 nicklas 348   
6801 25 Mar 15 nicklas 349     @Override
7836 28 Aug 20 nicklas 350     public Set<Integer> transform(TransformContext context, final Set<Integer> source) 
6801 25 Mar 15 nicklas 351     {
7836 28 Aug 20 nicklas 352       Set<Integer> sourceToUse = useCollectedAsSource ? collected : source;
7836 28 Aug 20 nicklas 353       children.addAll(new ExtractToChildExtractTransformer(includeSource).transform(context, sourceToUse));
6801 25 Mar 15 nicklas 354       return source;
6801 25 Mar 15 nicklas 355     }
6801 25 Mar 15 nicklas 356   }
6801 25 Mar 15 nicklas 357
7838 28 Aug 20 nicklas 358   /**
7838 28 Aug 20 nicklas 359     Transformer implementation that reset the collected extracts before forwarding the call
7838 28 Aug 20 nicklas 360     to the parent transformer. This should wrap the first created transformer that
7838 28 Aug 20 nicklas 361     collect extracts to the same CollectedExtract instance.
7838 28 Aug 20 nicklas 362     @since 3.17
7838 28 Aug 20 nicklas 363   */
7838 28 Aug 20 nicklas 364   class ResetCollected
7838 28 Aug 20 nicklas 365     extends AbstractSourceItemTransformer
7838 28 Aug 20 nicklas 366   {
7838 28 Aug 20 nicklas 367     private final SourceItemTransformer parent;
7838 28 Aug 20 nicklas 368     
7838 28 Aug 20 nicklas 369     ResetCollected(SourceItemTransformer parent) 
7838 28 Aug 20 nicklas 370     {
7838 28 Aug 20 nicklas 371       super(parent.getSourceItemType(), parent.getTargetItemType());
7838 28 Aug 20 nicklas 372       this.parent = parent;
7838 28 Aug 20 nicklas 373     }
7838 28 Aug 20 nicklas 374   
7838 28 Aug 20 nicklas 375     @Override
7838 28 Aug 20 nicklas 376     public Set<Integer> transform(TransformContext context, final Set<Integer> source) 
7838 28 Aug 20 nicklas 377     {
7838 28 Aug 20 nicklas 378       resetCollected();
7838 28 Aug 20 nicklas 379       return parent.transform(context, source);
7838 28 Aug 20 nicklas 380     }
7838 28 Aug 20 nicklas 381   }
7838 28 Aug 20 nicklas 382   
6791 23 Mar 15 nicklas 383 }