Skip to content
Snippets Groups Projects
ISRAnd.cpp 2.41 KiB
Newer Older
  • Learn to ignore specific revisions
  • //
    // Created by Jake Close on 3/13/18.
    //
    
    
    benbergk's avatar
    benbergk committed
    #include <cassert>
    
    ISRAnd::ISRAnd ( vector<ISR * > InputTerms ) : Terms( InputTerms )
    	{
    
    	assert(InputTerms.size() > 1);
    
    	for (auto currentTerm : InputTerms)
    	{
    		currentTerm->First();
    		Location currentLocation = currentTerm->currentLocation;
    		if (currentLocation < nearestStartLocation) {
    			nearestTerm = currentTerm;
    			nearestStartLocation = currentLocation;
    
    		}
    		if (currentLocation > nearestEndLocation) {
    			nearestEndLocation = currentLocation;
    		}
    		++NumberOfTerms;
    		currentTerm++;
    
    	}
    	}
    
    Location ISRAnd::First()
    	{
    	//Fixme?
    	Location first = MAX_Location;
    
    	for(auto isr : Terms)
    		{
    			Location temp = isr->First();
    			if (temp < first)
    			{
    				first = temp;
    			}
    		}
    
    	//fixme should this return the nearest location of one subterm or the nearest location all the terms match?
    	currentLocation = Seek(first);
    	return currentLocation;
    	}
    
    
    Location ISRAnd::Next ( )
    	{
    	return Seek( nearestStartLocation);
    	}
    
    Location ISRAnd::NextDocument()
    	{
    	return Seek(GetEndDocument());
    	}
    
    Location ISRAnd::Seek ( Location target )
    	{
    	//Todo
    	// 1. Seek all the ISRs to the first occurrence beginning at
    	//    the target location.
    	// 2. Move the document end ISR to just past the furthest
    	//    word, then calculate the document begin location.
    	// 3. Seek all the other terms to past the document begin.
    	// 4. If any term is past the document end, return to
    	//    step 2.
    	// 5. If any ISR reaches the end, there is no match.
    
    	Location nearest;
    	Location furthest = 0;
    
    	while(furthest != MAX_Location) {
    
    		nearest = MAX_Location;
    
    		//find nearest & furthest ISR
    		for (auto isr : Terms) {
    			Location temp = isr->Seek(target);
    			if (temp == MAX_Location) return MAX_Location;
    			if (temp > furthest) furthest = temp;
    			if (temp < nearest) nearest = temp;
    		}
    
    		//Get Document of the furthest ISR
    		DocumentEnd->Seek(target);
    
    		//set next target to be starting location of document
    		//Location lastDocStart = DocumentEnd->GetStart()?;
    		Location lastDocStart = 0;
    
    		if(nearest >= lastDocStart)
    		{
    			//MATCH
    			//Does it matter for 'AND' what location we return? first/last in document?
    			//Should we return an ISR as well?
    			return nearest;
    		} else{
    			//No Match yet, keep searching
    			target = lastDocStart;
    		}
    
    	}
    
    	}
    
    Location ISRAnd::GetEndDocument()
    	{
    	//What does currentLocation hold?  When is it updated?
    	return DocumentEnd->Seek(currentLocation);
    	}