change directory structure
- the tags come first, then the date, e.g. "mykey=myvalue_<uuid>/2016/01/01/<uuid>" - We do this, so that we don't have to tag each file, but only the root folder. This should speed up searches
This commit is contained in:
@@ -1,11 +1,16 @@
|
|||||||
package org.lucares.performance.db;
|
package org.lucares.performance.db;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
public class StorageUtils {
|
public class StorageUtils {
|
||||||
|
|
||||||
static File createStorageFile(final Path parent, final Day day, final String name) {
|
public static Path createStorageFile(final Path parent, final String tagBaseDir, final Day day) {
|
||||||
return new File(parent.toFile(), day.format(File.separator) + File.separator + name);
|
|
||||||
|
final Path tagSpecificFolder = parent.resolve(tagBaseDir);
|
||||||
|
final Path dateSpecificFolder = tagSpecificFolder.resolve(day.format("/"));
|
||||||
|
final Path storageFile = dateSpecificFolder.resolve(UUID.randomUUID().toString());
|
||||||
|
|
||||||
|
return storageFile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,16 +145,16 @@ public class TagsToFile implements CollectionUtils {
|
|||||||
|
|
||||||
private File createNewFile(final OffsetDateTime date, final Tags tags) {
|
private File createNewFile(final OffsetDateTime date, final Tags tags) {
|
||||||
final Day day = new Day(date);
|
final Day day = new Day(date);
|
||||||
final String name = tags.abbreviatedRepresentation() + UUID.randomUUID().toString();
|
final String tagBaseDir = tags.abbreviatedRepresentation() + UUID.randomUUID().toString();
|
||||||
|
|
||||||
final File result = StorageUtils.createStorageFile(dataDirectory, day, name);
|
final Path result = StorageUtils.createStorageFile(dataDirectory, tagBaseDir, day);
|
||||||
try {
|
try {
|
||||||
Files.createDirectories(result.getParentFile().toPath());
|
Files.createDirectories(result.getParent());
|
||||||
Files.createFile(result.toPath());
|
Files.createFile(result);
|
||||||
} catch (final IOException e) {
|
} catch (final IOException e) {
|
||||||
throw new IllegalStateException(e); // very unlikely
|
throw new IllegalStateException(e); // very unlikely
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result.toFile();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,11 +5,11 @@ import java.io.IOException;
|
|||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
import java.time.ZoneOffset;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.lucares.pdb.api.Entry;
|
import org.lucares.pdb.api.Entry;
|
||||||
@@ -92,7 +92,11 @@ public class PerformanceDbTest {
|
|||||||
|
|
||||||
try (PerformanceDb db = new PerformanceDb(dataDirectory)) {
|
try (PerformanceDb db = new PerformanceDb(dataDirectory)) {
|
||||||
|
|
||||||
final TimeRange timeRange = TimeRange.ofDay(OffsetDateTime.now(ZoneOffset.UTC));
|
final int year = 2016;
|
||||||
|
final int month = 1;
|
||||||
|
final int day = 2;
|
||||||
|
|
||||||
|
final TimeRange timeRange = TimeRange.ofDay(DateUtils.getDate(year, month, day, 1, 1, 1));
|
||||||
final long numberOfEntries = 2;
|
final long numberOfEntries = 2;
|
||||||
|
|
||||||
final Tags tags = Tags.create("myKey", "one");
|
final Tags tags = Tags.create("myKey", "one");
|
||||||
@@ -107,10 +111,14 @@ public class PerformanceDbTest {
|
|||||||
final List<Entry> actualEntries = db.get(Query.createQuery(tags)).singleGroup().asList();
|
final List<Entry> actualEntries = db.get(Query.createQuery(tags)).singleGroup().asList();
|
||||||
Assert.assertEquals(actualEntries, entries);
|
Assert.assertEquals(actualEntries, entries);
|
||||||
|
|
||||||
final File storageFileForToday = StorageUtils.createStorageFile(dataDirectory, new Day(timeRange.getFrom()),
|
final List<Path> foldersInStorage = Files.list(dataDirectory).filter(Files::isDirectory)
|
||||||
"name doesn't matter");
|
.collect(Collectors.toList());
|
||||||
final File storageFolderForToday = storageFileForToday.getParentFile();
|
Assert.assertEquals(foldersInStorage.size(), 1);
|
||||||
final File[] filesInStorage = storageFolderForToday.listFiles();
|
|
||||||
|
final Path dateSpecificFolder = foldersInStorage.get(0)
|
||||||
|
.resolve(new Day(timeRange.getFrom()).format(File.separator));
|
||||||
|
|
||||||
|
final File[] filesInStorage = dateSpecificFolder.toFile().listFiles();
|
||||||
Assert.assertEquals(filesInStorage.length, 1,
|
Assert.assertEquals(filesInStorage.length, 1,
|
||||||
"one file in storage, but was: " + Arrays.asList(filesInStorage));
|
"one file in storage, but was: " + Arrays.asList(filesInStorage));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user