view src/de/mpiwg/anteater/results/filter/NestedResultsFilter.java @ 0:036535fcd179

anteater
author jdamerow
date Fri, 14 Sep 2012 10:30:43 +0200
parents
children 51ed79e28b45
line wrap: on
line source

package de.mpiwg.anteater.results.filter;

import java.util.ArrayList;
import java.util.List;

import de.mpiwg.anteater.results.ApplicantResult;
import de.mpiwg.anteater.results.IResult;
import de.mpiwg.anteater.results.LocationResult;
import de.mpiwg.anteater.results.SpeciesScientificResult;
import de.mpiwg.anteater.text.TextInformation;

public class NestedResultsFilter implements IResultFilter {

	@Override
	public void filterElements(TextInformation info,
			List<ApplicantResult> applicantResults,
			List<SpeciesScientificResult> speciesResults,
			List<LocationResult> locationResults) {

		List<ApplicantResult> applicantsToBeRemoved = new ArrayList<ApplicantResult>();
		List<SpeciesScientificResult> speciesToBeRemoved = new ArrayList<SpeciesScientificResult>();
		List<LocationResult> locationsToBeRemoved = new ArrayList<LocationResult>();
		for (ApplicantResult applicant : applicantResults) {

			// check for nested applicants
			for (ApplicantResult applicant2 : applicantResults) {
				if (applicant == applicant2)
					continue;

				int checked = checkResults(applicant, applicant2);
				switch (checked) {
				case 0:
					continue;
				case -1: {
					if (!applicantsToBeRemoved.contains(applicant2))
						applicantsToBeRemoved.add(applicant2);
					break;
				}
				case 1 : {
					if (!applicantsToBeRemoved.contains(applicant))
						applicantsToBeRemoved.add(applicant);
				}
				}
			}

			// check for nested species
			for (SpeciesScientificResult species : speciesResults) {
				int checked = checkResults(applicant, species);
				
				switch (checked) {
				case 0:
					continue;
				case -1: {
					if (!speciesToBeRemoved.contains(species))
						speciesToBeRemoved.add(species);
					break;
				}
				case 1 : {
					if (!applicantsToBeRemoved.contains(applicant))
						applicantsToBeRemoved.add(applicant);
				}
				}
			}
			
			// check for nested places
			for (LocationResult location : locationResults) {
				int checked = checkResults(applicant, location);
				
				switch (checked) {
				case 0:
					continue;
				case -1: {
					if (!locationsToBeRemoved.contains(location))
						locationsToBeRemoved.add(location);
					break;
				}
				case 1 : {
					if (!applicantsToBeRemoved.contains(applicant))
						applicantsToBeRemoved.add(applicant);
				}
				}
			}
		}
		
		// check species
		for (SpeciesScientificResult species : speciesResults) {
			
			// check for nested species
			for (SpeciesScientificResult species2 : speciesResults) {
				if (species == species2)
					continue;

				int checked = checkResults(species, species2);
					
				switch (checked) {
				case 0:
					continue;
				case -1: {
					if (!speciesToBeRemoved.contains(species2))
						speciesToBeRemoved.add(species2);
					break;
				}
				case 1 : {
					if (!speciesToBeRemoved.contains(species))
						speciesToBeRemoved.add(species);
				}
				}
			}
			
			// check for nested location
			for (LocationResult location : locationResults) {
				int checked = checkResults(species, location);
				
				switch (checked) {
				case 0:
					continue;
				case -1: {
					if (!locationsToBeRemoved.contains(location))
						locationsToBeRemoved.add(location);
					break;
				}
				case 1 : {
					if (!speciesToBeRemoved.contains(species))
						speciesToBeRemoved.add(species);
				}
				}
			}
		}
		
		// check for locations nested in locations
		for (LocationResult location : locationResults) {
			
			for (LocationResult location2 : locationResults) {
				if (location == location2)
					continue;

				
				int checked = checkResults(location, location2);
				
				switch (checked) {
				case 0:
					continue;
				case -1: {
					if (!locationsToBeRemoved.contains(location2))
						locationsToBeRemoved.add(location2);
					break;
				}
				case 1 : {
					if (!locationsToBeRemoved.contains(location))
						locationsToBeRemoved.add(location);
				}
				}
			}		
		}
		
		applicantResults.removeAll(applicantsToBeRemoved);
		speciesResults.removeAll(speciesToBeRemoved);
		locationResults.removeAll(locationsToBeRemoved);
	}

	/**
	 * Method for checking if two results are nested. If yes, than:
	 * <ul>
	 * <li>If one result was found by Regex, this one is the correct one.</li>
	 * <li>Otherwise the outer one is assumed to be correct.</li>
	 * </ul>
	 * 
	 * @param result1
	 * @param result2
	 * @return -1 if first one is correct, 1 if second one is correct, 0 if they
	 *         are not nesting.
	 */
	protected int checkResults(IResult<?, ?> result1, IResult<?, ?> result2) {
		// if result 1 is outer one
		if (result1.getFinding().getStart() <= result2.getFinding().getStart()
				&& (result1.getFinding().getStart()
						+ result1.getFinding().getLength() >= result2
						.getFinding().getStart()
						+ result2.getFinding().getLength())) {

			if (result1.getPrediction() == 2.0)
				return -1;

			if (result2.getPrediction() == 2.0)
				return 1;

			return -1;
		}

		// if result 2 is outer one
		if (result2.getFinding().getStart() <= result1.getFinding().getStart()
				&& (result2.getFinding().getStart()
						+ result2.getFinding().getLength() >= result1
						.getFinding().getStart()
						+ result1.getFinding().getLength())) {

			if (result1.getPrediction() == 2.0)
				return -1;

			if (result2.getPrediction() == 2.0)
				return 1;

			return 1;
		}

		return 0;
	}
}