/*
* This file is part of the Wayback archival access software
* (http://archive-access.sourceforge.net/projects/wayback/).
*
* Licensed to the Internet Archive (IA) by one or more individual
* contributors.
*
* The IA licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.archive.wayback.query.resultspartitioner;
import java.util.ArrayList;
import java.util.Calendar;
import org.archive.util.ArchiveUtils;
import org.archive.wayback.core.CaptureSearchResults;
import org.archive.wayback.core.WaybackRequest;
import org.archive.wayback.util.Timestamp;
/**
*
*
* @author brad
* @version $Date$, $Revision$
* @deprecated use org.archive.wayback.util.parition.*
*/
public class ResultsTimelinePartitionsFactory {
private static int NUM_HOUR_PARTITIONS = 12;
private static int NUM_DAY_PARTITIONS = 15;
private static int NUM_MONTH_PARTITIONS = 12;
private static int NUM_TWO_MONTH_PARTITIONS = 16;
private static int NUM_YEAR_PARTITIONS = 10;
// These are sort of "ball park" figures. Should be using calendars
// for better accuracy..
private static int MAX_HOUR_SECONDS = 2 * 60 * 60 * NUM_HOUR_PARTITIONS;
private static int MAX_DAY_SECONDS = 2 * 60 * 60 * 24 * NUM_DAY_PARTITIONS;
private static int MAX_MONTH_SECONDS = 2 * 60 * 60 * 24 * 30 *
NUM_MONTH_PARTITIONS;
private static int MAX_TWO_MONTH_SECONDS = 2 * 60 * 60 * 24 * 2* 30 *
NUM_TWO_MONTH_PARTITIONS;
//private static int MAX_YEAR_SECONDS = 60 * 60 * 24 * 365 * NUM_YEAR_PARTITIONS;
private static HourResultsPartitioner hourRP = new HourResultsPartitioner();
private static DayResultsPartitioner dayRP = new DayResultsPartitioner();
private static MonthResultsPartitioner monthRP = new MonthResultsPartitioner();
private static TwoMonthTimelineResultsPartitioner twoMonthRP = new TwoMonthTimelineResultsPartitioner();
private static YearResultsPartitioner yearRP = new YearResultsPartitioner();
/**
* @param results
* @param wbRequest
* @return ArrayList of ResultsPartition objects
*/
public static ArrayList<ResultsPartition> getHour(CaptureSearchResults results,
WaybackRequest wbRequest) {
return get(hourRP,NUM_HOUR_PARTITIONS,results,wbRequest);
}
/**
* @param results
* @param wbRequest
* @return ArrayList of ResultsPartition objects
*/
public static ArrayList<ResultsPartition> getDay(CaptureSearchResults results,
WaybackRequest wbRequest) {
return get(dayRP,NUM_DAY_PARTITIONS,results,wbRequest);
}
/**
* @param results
* @param wbRequest
* @return ArrayList of ResultsPartition objects
*/
public static ArrayList<ResultsPartition> getMonth(CaptureSearchResults results,
WaybackRequest wbRequest) {
return get(monthRP,NUM_MONTH_PARTITIONS,results,wbRequest);
}
/**
* @param results
* @param wbRequest
* @return ArrayList of ResultsPartition objects
*/
public static ArrayList<ResultsPartition> getTwoMonth(CaptureSearchResults results,
WaybackRequest wbRequest) {
return get(twoMonthRP,NUM_TWO_MONTH_PARTITIONS,results,wbRequest);
}
/**
* @param results
* @param wbRequest
* @return ArrayList of ResultsPartition objects
*/
public static ArrayList<ResultsPartition> getYear(CaptureSearchResults results,
WaybackRequest wbRequest) {
return get(yearRP,NUM_YEAR_PARTITIONS,results,wbRequest);
}
/**
* @param results
* @param wbRequest
* @return ArrayList of ResultsPartition objects
*/
public static ArrayList<ResultsPartition> getAuto(CaptureSearchResults results,
WaybackRequest wbRequest) {
int first = Timestamp.parseBefore(results.getFirstResultTimestamp()).sse();
int last = Timestamp.parseAfter(results.getLastResultTimestamp()).sse();
int diff = last - first;
if(diff < MAX_HOUR_SECONDS) {
return getHour(results,wbRequest);
} else if(diff < MAX_DAY_SECONDS) {
return getDay(results,wbRequest);
} else if(diff < MAX_MONTH_SECONDS) {
return getMonth(results,wbRequest);
} else if(diff < MAX_TWO_MONTH_SECONDS) {
return getTwoMonth(results,wbRequest);
}
return getYear(results,wbRequest);
}
/**
* @param results
* @return String Constant of minimum resolution that will hold the results
*/
public static String getMinResolution(CaptureSearchResults results) {
int first = Timestamp.parseBefore(results.getFirstResultTimestamp()).sse();
int last = Timestamp.parseAfter(results.getLastResultTimestamp()).sse();
int diff = last - first;
if(diff < MAX_HOUR_SECONDS) {
return WaybackRequest.REQUEST_RESOLUTION_HOURS;
} else if(diff < MAX_DAY_SECONDS) {
return WaybackRequest.REQUEST_RESOLUTION_DAYS;
} else if(diff < MAX_MONTH_SECONDS) {
return WaybackRequest.REQUEST_RESOLUTION_MONTHS;
} else if(diff < MAX_TWO_MONTH_SECONDS) {
return WaybackRequest.REQUEST_RESOLUTION_TWO_MONTHS;
}
return WaybackRequest.REQUEST_RESOLUTION_YEARS;
}
private static ArrayList<ResultsPartition> get(ResultsPartitioner
partitioner, int partitionCount, CaptureSearchResults results,
WaybackRequest wbRequest) {
ArrayList<ResultsPartition> partitions =
new ArrayList<ResultsPartition>();
int i; // counter
int totalPartitions = (partitionCount * 2) + 1; // total # of partitions
// first calculate the "center" based on the exact request date:
String reqDate = results.getFilter(WaybackRequest.REQUEST_EXACT_DATE);
Calendar centerCal = partitioner.dateStrToCalendar(reqDate);
partitioner.alignStart(centerCal);
// now "decrement" to the first partition:
Calendar startCal = partitioner.incrementPartition(centerCal,
partitionCount * -1);
// now "increment", adding as many as needed:
Calendar endCal = partitioner.incrementPartition(startCal,1);
for(i = 0; i < totalPartitions; i++) {
String startDateStr = ArchiveUtils.get14DigitDate(startCal
.getTime());
String endDateStr = ArchiveUtils.get14DigitDate(endCal.getTime());
String title = partitioner.rangeToTitle(startCal,endCal,wbRequest);
ResultsPartition partition = new ResultsPartition(startDateStr,
endDateStr, title);
partition.filter(results);
partitions.add(partition);
startCal = endCal;
endCal = partitioner.incrementPartition(startCal,1);
}
return partitions;
}
}