zacharymorn commented on pull request #418:
URL: https://github.com/apache/lucene/pull/418#issuecomment-1026512709


   Hi @jpountz , just want to check again to see if I have addressed your 
concern with the utility approach?  
   
   To better illustrate the potential issue I'm considering with the higher 
level abstraction approach, I've copied over some key code snippets here: 
   
   If we were to extract out `SynonymImpactsSource` (from `SynonymQuery`), it 
may look something like this:
   ```
   public class SynonymImpactsSource implements ImpactsSource {
   
     private final ImpactsEnum[] impactsEnums;
     private final Impacts[] impacts;
     private final float[] boosts;
     private Impacts lead;
   
     public SynonymImpactsSource(ImpactsEnum[] impactsEnums, float[] boosts) {
       ...
     }
   
     @Override
     public Impacts getImpacts() throws IOException {
       // Use the impacts that have the lower next boundary as a lead.
       // It will decide on the number of levels and the block boundaries.
       if (lead == null) {
         Impacts tmpLead = null;
         for (int i = 0; i < impactsEnums.length; ++i) {
           impacts[i] = impactsEnums[i].getImpacts();
           if (tmpLead == null || impacts[i].getDocIdUpTo(0) < 
tmpLead.getDocIdUpTo(0)) {
             tmpLead = impacts[i];
           }
         }
         lead = tmpLead;
       }
       return new Impacts() {
   
         @Override
         public int numLevels() {
           // Delegate to the lead
           return lead.numLevels();
         }
   
         @Override
         public int getDocIdUpTo(int level) {
           // Delegate to the lead
           return lead.getDocIdUpTo(level);
         }
   
         @Override
         public List<Impact> getImpacts(int level) {
           final int docIdUpTo = getDocIdUpTo(level); 
           return ImpactsMergingUtils.mergeImpactsPerField(
               impactsEnums, impacts, boosts, docIdUpTo, false);
         }
       };
     }
   
     @Override
     public void advanceShallow(int target) throws IOException {
       for (ImpactsEnum impactsEnum : impactsEnums) {
         if (impactsEnum.docID() < target) {
           impactsEnum.advanceShallow(target);
         }
       }
     }
   
     public Impacts[] impacts() {
       return impacts;
     }
   }
   ```
   
   However, the above `SynonymImpactsSource#getImpacts(level)` may not be 
directly usable for `CombinedFieldsQuery`, as illustrated below
   ```
   Impacts CombinedFieldsQuery$ImpactsSource#getImpacts {
      for (entry : Map<Field, SynonymImpactsSource>) {
           // this is potentially problematic, as this methods only takes in 
level info, and it internally looks up a field-specific docIdUpTo to get valid 
impacts (see definition above). However, for CombinedFieldQuery, docIdUpTo may 
be different among different fields with same level 
           combine SynonymImpactsSource.getImpacts(level) 
      }
     return combined Impacts
   }
   ```
   
   Hence we may actually need to change some APIs if we were to make 
`SynonymImpactsSource` to work in `CombinedFieldQuery` use case ?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org
For additional commands, e-mail: issues-h...@lucene.apache.org

Reply via email to