Skip to content
Snippets Groups Projects
BasicSearch.java 4.36 KiB
Newer Older
  • Learn to ignore specific revisions
  • package search;
    
    
    import java.util.ArrayList;
    
    import java.util.Collection;
    
    import java.util.Scanner;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import org.json.simple.parser.ParseException;
    
    
    import utils.Stopwatch;
    
    import data.DataStore;
    
    import data.Date;
    
    import data.Record;
    
    import sort.Bound;
    import sort.GeneralRange;
    import sort.RangeHelper;
    
    public class BasicSearch {
    	public static void init() {
    
    		while(true) {
    
    			System.out.println("Main Menu");
    			System.out.println("Available commands:");
    			System.out.println("\ttree [taxonId / scientific name]");
    
    			System.out.println("\trecords (taxonId / scientific name) [-t start end]");
    			System.out.print("> ");
    
    			Pattern pat = Pattern.compile("([a-zA-Z]+)[ ]?([0-9a-zA-Z ]+[0-9a-zA-Z])?[ ]?[-]?([a-zA-Z])?[ ]?([A-Za-z0-9]+)?[ ]?([A-Za-z0-9]+)?[ ]?([A-Za-z0-9]+)?[ ]?([A-Za-z0-9]+)?[ ]?([A-Za-z0-9]+)?[ ]?");
    
    			Scanner s = new Scanner(System.in);
    
    			String line = s.nextLine();
    			Matcher matcher = pat.matcher(line);
    			if (!matcher.find()) continue;
    
    			//tree
    			//tree taxonId
    			//tree scientific name
    			//records taxonId
    			//records scientific name
    			String command = matcher.group(1);
    
    			if (command.equals("records"))
    				rangeSearch(matcher);
    			else if (command.equals("tree"))
    				printTree(matcher);
    		}
    	}
    	
    	private static void rangeSearch(Matcher matcher) {
    		Integer start = null;
    		Integer end = null;
    		GeneralRange<Record> a0 = RangeHelper.date(Bound.ANY);
    
    Christopher Schankula's avatar
    Christopher Schankula committed
    		if (matcher.group(3) != null)
    			if (matcher.group(3).equals("t")) {
    				if (matcher.group(4) != null)
    					start = Integer.parseInt(matcher.group(4));
    				if (matcher.group(5) != null)
    					end = Integer.parseInt(matcher.group(5));
    				Date lower = new Date(start,01,01);
    				Date upper = new Date(end+1,01,01);
    				
    				a0 = RangeHelper.date(Bound.LOWHIGH, lower, upper);
    			}
    
    		
    		Integer taxonId = null;
    		try {
    			taxonId = Integer.parseInt(matcher.group(2));
    		} catch (NumberFormatException e) {
    			if (taxonId == null) {
    				try {
    					taxonId = WormsAPI.nameToRecordID(matcher.group(2));
    				} catch (IOException e1) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (ParseException e1) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    		
    		GeneralRange<Record> a2 = r -> 0;
    		GeneralRange<Record> a3 = r -> 0;
    		
    
    		Iterable<Integer> searches = BioTree.getNonEmptyChildren(taxonId);
    		
    		ArrayList<Record> results = new ArrayList<Record>();
    		for (Integer txId: searches) {
    			a1 = RangeHelper.taxonID(Bound.EQUALS, txId);
    			ArrayList<GeneralRange<Record>> axes = new ArrayList<GeneralRange<Record>>();
    			
    			axes.add(a0);axes.add(a1);axes.add(a2);axes.add(a3);
    			
    			results.addAll((Collection<? extends Record>) DataStore.records.rangeSearch(axes));
    		}
    		
    
    		System.out.println("Found " + ((ArrayList<Record>) results).size() + " records in " + elapsed + " seconds.");
    
    		
    		while(true) {
    			System.out.println("Available commands: list, histogram, sum, exit");
    
    			System.out.print("> ");
    
    			Scanner s = new Scanner(System.in);
    			String command = s.nextLine();
    
    			if (command.equals("list"))
    				printRecords(results);
    			else if (command.equals("histogram")) {
    				Histogram.printHistogram(Histogram.histogram(results));
    			} else if (command.equals("exit"))
    				return;
    			else if (command.equals("sum")) {
    				int sum = Histogram.sum(results);
    				System.out.println(sum);
    			}
    		}
    	}
    	
    	private static void printRecords(Iterable<Record> results) {
    		String format = "|%1$-45s|%2$-15s|%3$-15s|%4$-15s|%5$-15s|%6$-15s\n";
    		System.out.format(format, "Scientific Name", "IndividualCount", "Latitude", "Longitude","Year","Month","Day");
    		for (Record r: results) {
    			System.out.println(r);
    		}
    	}
    	
    	private static void printTree(Matcher matcher) {
    		Integer taxonId;
    		String name;
    		if (matcher.group(2) == null)
    			BioTree.printTree();
    		else {
    			name = matcher.group(2);
    			try {
    				taxonId = Integer.parseInt(name);
    				BioTree.printTree(taxonId);
    			} catch (Exception e) {
    				BioTree.printTree(name);