package zeta.tool;
import java.io.File;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Arrays;
import zeta.util.DatabaseUtils;
public class CheckCompleteness {
public static void main(String[] args) {
if (args.length == 1) {
if (args[0].equals("?")) {
System.out.println("USAGE: [s] [n]");
} else if (args[0].equals("s")) {
summary(0);
} else {
checkCompleteness(Long.parseLong(args[0]));
}
} else if (args.length == 2 && args[0].equals("s")) {
summary(Long.parseLong(args[1]));
} else {
checkCompleteness(0);
}
}
static void summary(long greaterThanWorkUnitId) {
File file = new File(ConstantProperties.FINAL_DIR + "/1");
String[] list = file.list();
if (list != null) {
long rangeAll = 0;
int numberOfWorkUnits = 0;
int workUnitIdOverlap = 100; long minWorkUnitId = 0;
long maxWorkUnitIdRange = 0;
for (int i = 0; i < list.length; ++i) {
if (list[i].endsWith(".zip")) {
int idx = list[i].indexOf('_', 11);
long workUnitId = Long.parseLong(list[i].substring(11, idx));
if (greaterThanWorkUnitId == 0 || greaterThanWorkUnitId < workUnitId) {
int range = Integer.parseInt(list[i].substring(idx+1, list[i].length()-4));
if (minWorkUnitId == 0 || minWorkUnitId > workUnitId) {
minWorkUnitId = workUnitId;
}
if (maxWorkUnitIdRange == 0 || maxWorkUnitIdRange < workUnitId+range) {
maxWorkUnitIdRange = workUnitId+range-workUnitIdOverlap;
}
rangeAll += range-workUnitIdOverlap;
++numberOfWorkUnits;
}
}
}
System.out.println("Checked between " + minWorkUnitId + " and " + maxWorkUnitIdRange);
System.out.println("Available: " + rangeAll + " (" + (rangeAll*100.0)/(maxWorkUnitIdRange-minWorkUnitId) + "%)");
System.out.println("Missing: " + (maxWorkUnitIdRange-minWorkUnitId-rangeAll) + " (" + ((maxWorkUnitIdRange-minWorkUnitId-rangeAll)*100.0)/(maxWorkUnitIdRange-minWorkUnitId) + "%)");
}
}
static void checkCompleteness(long greaterThanWorkUnitId) {
File file = new File(ConstantProperties.FINAL_DIR + "/1");
String[] list = file.list();
if (list != null) {
Arrays.sort(list);
Connection connection = null;
Statement stmt = null;
try {
long lastWorkUnitId = 0;
for (int i = 0; i < list.length; ++i) {
if (list[i].endsWith(".zip")) {
int idx = list[i].indexOf('_', 11);
long workUnitId = Long.parseLong(list[i].substring(11, idx));
if (greaterThanWorkUnitId == 0 || greaterThanWorkUnitId < workUnitId) {
int range = Integer.parseInt(list[i].substring(idx+1, list[i].length()-4));
if (lastWorkUnitId != 0 && lastWorkUnitId < workUnitId) {
try {
if (connection == null) {
connection = GetData.getConnection();
stmt = connection.createStatement();
}
ResultSet rs = stmt.executeQuery("SELECT MAX(work_unit_id) FROM zeta.computation WHERE task_id=1 AND work_unit_id<" + lastWorkUnitId);
if (rs.next()) {
workUnitId = rs.getLong(1);
}
rs.close();
rs = stmt.executeQuery("SELECT range FROM zeta.computation WHERE task_id=1 AND work_unit_id=" + workUnitId);
if (rs.next()) {
range = rs.getInt(1);
}
rs.close();
System.out.println("MISSING: " + workUnitId + ' ' + range);
} catch (Exception e) {
System.out.println("!MISSING: " + (lastWorkUnitId-100) + ' ' + (workUnitId-lastWorkUnitId+200));
}
--i;
} else {
}
lastWorkUnitId = workUnitId+range;
}
}
}
} finally {
DatabaseUtils.close(stmt);
DatabaseUtils.close(connection);
}
}
}
static void checkSize(String filename, int range) {
long size = new File(ConstantProperties.FINAL_DIR + "/1/" + filename).length();
switch (range) {
case 200000:
if (size < 610000 || size > 900000) System.out.println("Wrong size (" + size + "): " + filename);
break;
case 300000:
if (size < 910000 || size > 1310000) System.out.println("Wrong size (" + size + "): " + filename);
break;
case 500000:
if (size < 1480000 || size > 2200000) System.out.println("Wrong size (" + size + "): " + filename);
break;
case 700000:
if (size < 2100000 || size > 2850000) System.out.println("Wrong size (" + size + "): " + filename);
break;
case 1000000:
if (size < 3000000 || size > 4100000) System.out.println("Wrong size (" + size + "): " + filename);
break;
default:
System.out.println("Unknown range " + range + " (" + size + "): " + filename);
break;
}
}
}