package anotacja; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class QueryData { //main index information public int[] groups; //spatial information public short[] xCoord; public short[] yCoord; public short[] radius; //storage parameters private static boolean binaryStorage; private static boolean spatialStorage; private static File baseFolder; public static void GlobalInitialize(File baseFolderParam, boolean binaryStorageParam, boolean spatialStorageParam) { baseFolder = baseFolderParam; binaryStorage = binaryStorageParam; spatialStorage = spatialStorageParam; } public QueryData(String queryData) { if (!this.readData(queryData)) { //blad odczytu this.groups = null; this.xCoord = null; this.yCoord = null; this.radius = null; } } public void sortData() { if (this.xCoord == null) { //tylko dane BoW, nie ma potrzeby innego sortowania Arrays.sort(this.groups); } else { //dane BoW i przestrzenne, trzeba sortowac inaczej int[][] data = new int[this.groups.length][4]; for (int i = 0; i < this.groups.length; i++) { data[i][0] = this.groups[i]; data[i][1] = this.xCoord[i]; data[i][2] = this.yCoord[i]; data[i][3] = this.radius[i]; } //sortuj Arrays.sort(data, new Comparator() { @Override public int compare(final int[] entry1, final int[] entry2) { final int group1 = entry1[0]; final int group2 = entry2[0]; return Integer.compare(group1, group2); } }); //przepisz po sortowaniu for (int i = 0; i < this.groups.length; i++) { this.groups[i] = data[i][0]; this.xCoord[i] = (short)data[i][1]; this.yCoord[i] = (short)data[i][2]; this.radius[i] = (short)data[i][3]; } } } private boolean readData(String queryData) { boolean result = false; if (binaryStorage) { result = readDataFromBinary(queryData); } else { result = readDataFromText(queryData); } //debug //System.out.print("DATA: "); //for (int i = 0; i < data.length; i++) { System.out.print(data[i] + " "); } //System.out.println(); return result; } private boolean readDataFromBinary(String queryData) { try { if (!queryData.endsWith(".bin")) { queryData = queryData + ".bin"; } File contentFile = new File(queryData); //przygotowanie sciezki pliku if (!contentFile.exists()) { contentFile = new File(baseFolder, "files-out/" + queryData); } if (!contentFile.exists()) { System.out.println("Brak pliku zapytania: " + queryData); return false; } Path path = Paths.get(contentFile.getPath()); //odczyt calosci pliku do bufora byte[] array = Files.readAllBytes(path); //opakowanie w klase odczytujaca bufor ByteBuffer wrapped = ByteBuffer.wrap(array); //zapis danych nastepuje w formacie Big Endian wrapped.order(ByteOrder.BIG_ENDIAN); //odczyt liczby punktow int size = wrapped.getInt(); //alokacja bufora this.groups = new int[size]; if (spatialStorage) { this.xCoord = new short[size]; this.yCoord = new short[size]; this.radius = new short[size]; } for (int i = 0; i < size; i++) { //odczyt i-tego punktu this.groups[i] = wrapped.getInt(); if (spatialStorage) { this.xCoord[i] = (short)(wrapped.get() & 0xFF); this.yCoord[i] = (short)(wrapped.get() & 0xFF); this.radius[i] = (short)(wrapped.get() & 0xFF); } else { wrapped.get(); wrapped.get(); wrapped.get(); } } return true; } catch (IOException ex) { //blad odczytu ex.printStackTrace(); return false; } } private boolean readDataFromText(String queryData) { File contentFile = new File(queryData); if (!contentFile.exists()) contentFile = new File(baseFolder, "files-out/" + queryData); Scanner scanner = null; try { scanner = new Scanner(contentFile, "UTF-8"); int dim = scanner.nextInt(); if (dim != 1) { scanner.close(); return false; } int count = scanner.nextInt(); this.groups = new int[count]; //this.xCoord = new short[count]; //this.yCoord = new short[count]; //this.radius = new short[count]; for (int i = 0; i < count; i++) { scanner.next(); scanner.next(); scanner.next(); scanner.next(); scanner.next(); this.groups[i] = scanner.nextInt(); } scanner.close(); } catch (Exception ex) { ex.printStackTrace(); if (scanner != null) scanner.close(); return false; } return true; } }