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:
2016-12-23 15:07:08 +01:00
parent 5efab12063
commit 85eaee940e
3 changed files with 27 additions and 14 deletions

View File

@@ -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;
} }
} }

View File

@@ -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();
} }
} }

View File

@@ -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));
} }