Changeset 8087 for branches/3.19-stable


Ignore:
Timestamp:
Oct 31, 2022, 9:25:23 AM (7 months ago)
Author:
Nicklas Nordborg
Message:

References #2286: Improve performance for multi-hop child->parent->child kolumns

Implemented support for keeping track of all items that are handled by a SourceItemTransformer chain. The information is stored in the TransformContext and can be used to "avoid" items when doing a second transform using the same context.

So, when doing a child->parent->child transform, during the first phase from child->parent the context will remember all items if the TransformContext.setCollecting() method has been called. During the second phase from parent->child doubling back can be avoided by calling TransformContext.setAvoiding().

Location:
branches/3.19-stable/src/core/net/sf/basedb/util/listable
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/BioSourceToSampleTransformer.java

    r6848 r8087  
    5656  public Set<Integer> transform(TransformContext context, Set<Integer> source)
    5757  {
     58    context.collect(getSourceItemType(), source);
    5859    ItemQuery<Sample> query = Sample.getQuery();
    5960    query.setIncludes(context.getInclude());
     
    6566        Expressions.parameter("biosources")
    6667      ));
    67     return safeIdList(context.getDbControl(), query, "biosources", source);
     68    return context.avoid(getTargetItemType(), safeIdList(context.getDbControl(), query, "biosources", source));
    6869  }
    6970
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/DerivedBioAssayToChildDerivedBioAssayTransformer.java

    r6848 r8087  
    7979    while (parents.size() > 0)
    8080    {
    81       Set<Integer> children = safeIdList(dc, query, "parents", parents);
     81      context.collect(getSourceItemType(), parents);
     82      Set<Integer> children = context.avoid(getTargetItemType(), safeIdList(dc, query, "parents", parents));
    8283     
    8384      // Store new children and "used" parents
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/DerivedBioAssayToParentDerivedBioAssayTransformer.java

    r6848 r8087  
    7979    while (children.size() > 0)
    8080    {
    81       Set<Integer> parents = safeIdList(dc, query, "children", children);
     81      context.collect(getSourceItemType(), children);
     82      Set<Integer> parents = context.avoid(getTargetItemType(), safeIdList(dc, query, "children", children));
    8283     
    8384      // Store new parents and "used" children
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/DerivedBioAssayToPhysicalBioAssayTransformer.java

    r6848 r8087  
    2424import java.util.Set;
    2525
    26 import net.sf.basedb.core.DbControl;
    2726import net.sf.basedb.core.Item;
    2827import net.sf.basedb.core.ItemQuery;
     
    5453  public Set<Integer> transform(TransformContext context, Set<Integer> source)
    5554  {
    56     DbControl dc = context.getDbControl();
    57    
     55    context.collect(getSourceItemType(), source);
    5856    ItemQuery<PhysicalBioAssay> query = PhysicalBioAssay.getQuery();
    5957    query.setIncludes(context.getInclude());
     
    6664    );
    6765   
    68     return safeIdList(context.getDbControl(), query, "bioAssays", source);
     66    return context.avoid(getTargetItemType(), safeIdList(context.getDbControl(), query, "bioAssays", source));
    6967  }
    7068
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/DerivedBioAssayToRawBioAssayTransformer.java

    r6848 r8087  
    6767  public Set<Integer> transform(TransformContext context, Set<Integer> source)
    6868  {
     69    context.collect(getSourceItemType(), source);
    6970    DbControl dc = context.getDbControl();
    7071   
     
    7879      )
    7980    );
    80     Set<Integer> all = safeIdList(dc, query, "bioAssays", source);
     81    Set<Integer> all = context.avoid(getTargetItemType(), safeIdList(dc, query, "bioAssays", source));
    8182   
    8283    if (collectedExtracts != null)
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/ExtractToChildExtractTransformer.java

    r8086 r8087  
    101101    while (parents.size() > 0)
    102102    {
    103       Set<Integer> children = safeIdList(dc, query, "parents", parents);
     103      context.collect(getSourceItemType(), parents);
     104      Set<Integer> children = context.avoid(getTargetItemType(), safeIdList(dc, query, "parents", parents));
    104105     
    105106      // Store new children and "used" parents
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/ExtractToParentExtractTransformer.java

    r7836 r8087  
    136136    while (children.size() > 0)
    137137    {
    138       Set<Integer> parents = safeIdList(dc, query, "children", children);
     138      context.collect(getSourceItemType(), children);
     139      Set<Integer> parents = context.avoid(getTargetItemType(), safeIdList(dc, query, "children", children));
    139140      if (upstream != null) parents.removeAll(upstream);
    140141      if (downstream != null) parents.retainAll(downstream);
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/ExtractToPhysicalBioAssayTransformer.java

    r6848 r8087  
    2424import java.util.Set;
    2525
    26 import net.sf.basedb.core.DbControl;
    2726import net.sf.basedb.core.Item;
    2827import net.sf.basedb.core.ItemQuery;
     
    5352  public Set<Integer> transform(TransformContext context, Set<Integer> source)
    5453  {
    55     DbControl dc = context.getDbControl();
    56    
     54    context.collect(getSourceItemType(), source);
    5755    ItemQuery<PhysicalBioAssay> query = PhysicalBioAssay.getQuery();
    5856    query.setIncludes(context.getInclude());
     
    6563        Expressions.parameter("parents")
    6664      ));
    67     return safeIdList(context.getDbControl(), query, "parents", source);
     65    return context.avoid(getTargetItemType(), safeIdList(context.getDbControl(), query, "parents", source));
    6866  }
    6967
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/ExtractToSampleTransformer.java

    r7772 r8087  
    7474  public Set<Integer> transform(TransformContext context, Set<Integer> source)
    7575  {
     76    context.collect(getSourceItemType(), source);
    7677    ItemQuery<Sample> query = Sample.getQuery();
    7778    query.setIncludes(context.getInclude());
     
    8889      query.restrict(Restrictions.eq(Hql.property("st", "pushAnnotations"), Expressions.bool(true)));
    8990    }
    90     return safeIdList(context.getDbControl(), query, "extracts", source);
     91    return context.avoid(getTargetItemType(), safeIdList(context.getDbControl(), query, "extracts", source));
    9192  }
    9293
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/PhysicalBioAssayToDerivedBioAssayTransformer.java

    r6848 r8087  
    8080      )
    8181    );
    82     Set<Integer> all = safeIdList(dc, query, "bioAssays", source);
     82    context.collect(getSourceItemType(), source);
     83    Set<Integer> all = context.avoid(getTargetItemType(), safeIdList(dc, query, "bioAssays", source));
    8384   
    8485    if (collectedExtracts != null)
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/PhysicalBioAssayToExtractTransformer.java

    r6848 r8087  
    5555  public Set<Integer> transform(TransformContext context, Set<Integer> source)
    5656  {
     57    context.collect(getSourceItemType(), source);
    5758    ItemQuery<Extract> query = Extract.getQuery();
    5859    query.setIncludes(context.getInclude());
     
    6667      )
    6768    );
    68     return safeIdList(context.getDbControl(), query, "bioAssays", source);
     69    return context.avoid(getTargetItemType(), safeIdList(context.getDbControl(), query, "bioAssays", source));
    6970  }
    7071
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/RawBioAssayToDerivedBioAssayTransformer.java

    r6848 r8087  
    2424import java.util.Set;
    2525
    26 import net.sf.basedb.core.DbControl;
    2726import net.sf.basedb.core.DerivedBioAssay;
    2827import net.sf.basedb.core.Item;
     
    5554  public Set<Integer> transform(TransformContext context, Set<Integer> source)
    5655  {
    57     DbControl dc = context.getDbControl();
    58    
     56    context.collect(getSourceItemType(), source);
    5957    ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery();
    6058    query.setIncludes(context.getInclude());
     
    6664      )
    6765    );
    68     return safeIdList(context.getDbControl(), query, "rawBioAssays", source);
     66    return context.avoid(getTargetItemType(), safeIdList(context.getDbControl(), query, "rawBioAssays", source));
    6967  }
    7068
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/SampleToBioSourceTransformer.java

    r7772 r8087  
    7171  public Set<Integer> transform(TransformContext context, Set<Integer> source)
    7272  {
     73    context.collect(getSourceItemType(), source);
    7374    ItemQuery<BioSource> query = BioSource.getQuery();
    7475    query.setIncludes(context.getInclude());
     
    8586      query.restrict(Restrictions.eq(Hql.property("st", "pushAnnotations"), Expressions.bool(true)));
    8687    }
    87     return safeIdList(context.getDbControl(), query, "samples", source);
     88    return context.avoid(getTargetItemType(), safeIdList(context.getDbControl(), query, "samples", source));
    8889  }
    8990
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/SampleToChildSampleTransformer.java

    r8086 r8087  
    2929import net.sf.basedb.core.ItemQuery;
    3030import net.sf.basedb.core.Sample;
    31 import net.sf.basedb.core.Type;
    3231import net.sf.basedb.core.query.Expressions;
    3332import net.sf.basedb.core.query.Hql;
     
    102101    while (parents.size() > 0)
    103102    {
    104       query.setParameter("parents", parents, Type.INT);
    105       Set<Integer> children = safeIdList(dc, query, "parents", parents);
     103      context.collect(getSourceItemType(), parents);
     104      Set<Integer> children = context.avoid(getTargetItemType(), safeIdList(dc, query, "parents", parents));
    106105     
    107106      // Store new children and "used" parents
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/SampleToExtractTransformer.java

    r6848 r8087  
    5757  public Set<Integer> transform(TransformContext context, Set<Integer> source)
    5858  {
     59    context.collect(getSourceItemType(), source);
    5960    ItemQuery<Extract> query = Extract.getQuery();
    6061    query.setIncludes(context.getInclude());
     
    6667        Expressions.parameter("samples")
    6768      ));
    68     return safeIdList(context.getDbControl(), query, "samples", source);
     69    return context.avoid(getTargetItemType(), safeIdList(context.getDbControl(), query, "samples", source));
    6970  }
    7071
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/SampleToParentSampleTransformer.java

    r7772 r8087  
    103103    while (children.size() > 0)
    104104    {
    105       Set<Integer> parents = safeIdList(dc, query, "children", children);
     105      context.collect(getSourceItemType(), children);
     106      Set<Integer> parents = context.avoid(getTargetItemType(), safeIdList(dc, query, "children", children));
    106107     
    107108      // Store new parents and "used" children
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/SourceItemTransformerChain.java

    r6801 r8087  
    102102    for (SourceItemTransformer sit : chain)
    103103    {
    104       //System.out.println(sit + " before: " + sit.getSourceItemType() + "=" + source.size() +":" + source);
    105104      source = sit.transform(context, source);
    106       //System.out.println("After: " + sit.getTargetItemType() + "=" + source.size());
    107105    }
    108106    return source;
  • branches/3.19-stable/src/core/net/sf/basedb/util/listable/TransformContext.java

    r7770 r8087  
    2323
    2424import java.util.Collection;
     25import java.util.HashMap;
     26import java.util.HashSet;
     27import java.util.Map;
     28import java.util.Set;
    2529
    2630import net.sf.basedb.core.DbControl;
    2731import net.sf.basedb.core.Include;
     32import net.sf.basedb.core.Item;
    2833
    2934/**
     
    8994  }
    9095
     96  private boolean collecting;
     97  private boolean avoiding;
     98  private Map<Item, Set<Integer>> collectedByItemType;
     99
     100 
     101  /**
     102    Enable/disable collecting of all source items that the transformers in
     103    this context are using.
     104    @since 3.19.5
     105  */
     106  public void setCollecting(boolean collecting)
     107  {
     108    this.collecting = collecting;
     109  }
     110 
     111  /**
     112    Shortcut for enabling 'collecting' and disabling 'avoiding'.
     113    @since 3.19.5
     114  */
     115  public void setCollecting()
     116  {
     117    this.collecting = true;
     118    this.avoiding = false;
     119  }
     120 
     121  public boolean isCollecting()
     122  {
     123    return collecting;
     124  }
     125 
     126  /**
     127    Enable/disable avoiding of returning any source items that has
     128    been previously collected.
     129    @since 3.19.5
     130  */
     131  public void setAvoiding(boolean avoiding)
     132  {
     133    this.avoiding = avoiding;
     134  }
     135  /**
     136    Shortcut for enabling 'avoiding' and disabling 'collecting'.
     137    @since 3.19.5
     138  */
     139  public void setAvoiding()
     140  {
     141    this.collecting = false;
     142    this.avoiding = true;
     143  }
     144
     145  public boolean isAvoiding()
     146  {
     147    return avoiding;
     148  }
     149 
     150  /**
     151    Clear all collected items and disable both 'collecting' and
     152    'avoiding'.
     153    @since 3.19.5
     154  */
     155  public void resetCollected()
     156  {
     157    this.collecting = false;
     158    this.avoiding = false;
     159    if (collectedByItemType != null) collectedByItemType.clear();
     160  }
     161 
     162  /**
     163    Store collected items for later use if collecting has been enabled.
     164    @return The source items
     165  */
     166  public Set<Integer> collect(Item itemType, Set<Integer> source)
     167  {
     168    if (collecting && source.size() > 0)
     169    {
     170      if (collectedByItemType == null) collectedByItemType = new HashMap<>();
     171      Set<Integer> collected = collectedByItemType.get(itemType);
     172      if (collected == null)
     173      {
     174        collected = new HashSet<>();
     175        collectedByItemType.put(itemType, collected);
     176      }
     177      collected.addAll(source);
     178    }
     179    return source;
     180  }
     181 
     182  /**
     183    Avoid collected items by removing them from the source set.
     184    Note that this method modified the source set directly.
     185    @return The source set
     186  */
     187  public Set<Integer> avoid(Item itemType, Set<Integer> source)
     188  {
     189    if (avoiding && source.size() > 0)
     190    {
     191      if (collectedByItemType != null && collectedByItemType.containsKey(itemType))
     192      {
     193        Set<Integer> collected = collectedByItemType.get(itemType);
     194        source.removeAll(collected);
     195      }
     196    }
     197    return source;
     198  }
     199
    91200}
Note: See TracChangeset for help on using the changeset viewer.