From f6a9fc239430d44915004c69c76925a42b03b23a Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Sun, 16 Apr 2017 10:39:17 +0200 Subject: [PATCH] propose for an empty query --- .../java/org/lucares/pdb/datastore/PdbDB.java | 8 +++ .../datastore/{ => internal}/DataStore.java | 50 ++++++++++------ .../pdb/datastore/internal/Proposer.java | 58 +++++++++++++++++++ .../{ => internal}/DataStoreTest.java | 4 +- .../ProposerTest.java} | 33 ++++++----- .../org/lucares/utils/CollectionUtils.java | 15 ++++- .../performance/db/PerformanceDbTest.java | 2 +- 7 files changed, 134 insertions(+), 36 deletions(-) rename data-store/src/main/java/org/lucares/pdb/datastore/{ => internal}/DataStore.java (92%) create mode 100644 data-store/src/main/java/org/lucares/pdb/datastore/internal/Proposer.java rename data-store/src/test/java/org/lucares/pdb/datastore/{ => internal}/DataStoreTest.java (97%) rename data-store/src/test/java/org/lucares/pdb/datastore/{ProposalsTest.java => internal/ProposerTest.java} (71%) diff --git a/data-store/src/main/java/org/lucares/pdb/datastore/PdbDB.java b/data-store/src/main/java/org/lucares/pdb/datastore/PdbDB.java index cded1c6..6c980ca 100644 --- a/data-store/src/main/java/org/lucares/pdb/datastore/PdbDB.java +++ b/data-store/src/main/java/org/lucares/pdb/datastore/PdbDB.java @@ -6,13 +6,17 @@ import java.util.List; import java.util.SortedSet; import org.lucares.pdb.api.Tags; +import org.lucares.pdb.datastore.internal.DataStore; +import org.lucares.pdb.datastore.internal.Proposer; public class PdbDB { private final DataStore dataStore; + private final Proposer proposer; public PdbDB(final Path dataDirectory) throws IOException { dataStore = new DataStore(dataDirectory); + proposer = new Proposer(dataStore); } public List search(final String query) { @@ -31,4 +35,8 @@ public class PdbDB { return dataStore.getAvailableValuesForKey(query, fieldName); } + public List propose(final String query, final int caretIndex) { + return proposer.propose(query, caretIndex); + } + } diff --git a/data-store/src/main/java/org/lucares/pdb/datastore/DataStore.java b/data-store/src/main/java/org/lucares/pdb/datastore/internal/DataStore.java similarity index 92% rename from data-store/src/main/java/org/lucares/pdb/datastore/DataStore.java rename to data-store/src/main/java/org/lucares/pdb/datastore/internal/DataStore.java index 9f21f57..cb7a05c 100644 --- a/data-store/src/main/java/org/lucares/pdb/datastore/DataStore.java +++ b/data-store/src/main/java/org/lucares/pdb/datastore/internal/DataStore.java @@ -1,4 +1,4 @@ -package org.lucares.pdb.datastore; +package org.lucares.pdb.datastore.internal; import java.io.IOException; import java.nio.file.Path; @@ -16,9 +16,7 @@ import java.util.stream.Stream; import org.lucares.collections.IntList; import org.lucares.pdb.api.Tags; -import org.lucares.pdb.datastore.internal.FolderStorage; -import org.lucares.pdb.datastore.internal.RadixConverter; -import org.lucares.pdb.datastore.internal.StringCompressor; +import org.lucares.pdb.datastore.Doc; import org.lucares.pdb.datastore.lang.Expression; import org.lucares.pdb.datastore.lang.ExpressionToDocIdVisitor; import org.lucares.pdb.datastore.lang.ExpressionToDocIdVisitor.AllDocIds; @@ -153,24 +151,17 @@ public class DataStore { public List search(final String query) { - final Expression expression = QueryLanguageParser.parse(query); - final ExpressionToDocIdVisitor visitor = new ExpressionToDocIdVisitor(keyToValueToDocId, - new AllDocIds(docIdToDoc)); - final IntList docIdsList = expression.visit(visitor); - - final List result = new ArrayList<>(docIdsList.size()); - - final int[] intDocIds = docIdsList.toArray(); - for (int i = 0; i < intDocIds.length; i++) { - final int docId = intDocIds[i]; - - final Doc doc = docIdToDoc.get(docId); - result.add(doc); - } - + final IntList docIdsList = executeQuery(query); + final List result = mapDocIdsToDocs(docIdsList); return result; } + public int count(final String query) { + final IntList docIdsList = executeQuery(query); + + return docIdsList.size(); + } + public List getAvailableFields() { final List result = new ArrayList<>(); @@ -195,4 +186,25 @@ public class DataStore { return result; } + + private IntList executeQuery(final String query) { + final Expression expression = QueryLanguageParser.parse(query); + final ExpressionToDocIdVisitor visitor = new ExpressionToDocIdVisitor(keyToValueToDocId, + new AllDocIds(docIdToDoc)); + final IntList docIdsList = expression.visit(visitor); + return docIdsList; + } + + private List mapDocIdsToDocs(final IntList docIdsList) { + final List result = new ArrayList<>(docIdsList.size()); + + final int[] intDocIds = docIdsList.toArray(); + for (int i = 0; i < intDocIds.length; i++) { + final int docId = intDocIds[i]; + + final Doc doc = docIdToDoc.get(docId); + result.add(doc); + } + return result; + } } diff --git a/data-store/src/main/java/org/lucares/pdb/datastore/internal/Proposer.java b/data-store/src/main/java/org/lucares/pdb/datastore/internal/Proposer.java new file mode 100644 index 0000000..2bf83a9 --- /dev/null +++ b/data-store/src/main/java/org/lucares/pdb/datastore/internal/Proposer.java @@ -0,0 +1,58 @@ +package org.lucares.pdb.datastore.internal; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.lucares.pdb.datastore.Proposal; +import org.lucares.utils.CollectionUtils; + +public class Proposer { + + private final DataStore dataStore; + + public Proposer(final DataStore dataStore) { + this.dataStore = dataStore; + } + + public List propose(final String query, final int caretIndex) { + final List result; + + if (query.isEmpty()) { + result = proposeForAllKeys(); + } else { + throw new UnsupportedOperationException(); + } + + return result; + } + + private List proposeForAllKeys() { + final List result; + final List fields = dataStore.getAvailableFields(); + + final Map fieldToQuery = CollectionUtils.createMapFromKeys(fields, f -> f + "=*"); + + result = computeProposalsForQueries(fieldToQuery); + return result; + } + + private List computeProposalsForQueries(final Map keyToQuery) { + + final List result = new ArrayList<>(keyToQuery.size()); + for (final Entry e : keyToQuery.entrySet()) { + final String key = e.getKey(); + final String query = e.getValue(); + final int count = dataStore.count(query); + + final Proposal proposal = new Proposal(key, query, count); + result.add(proposal); + } + + Collections.sort(result); + return result; + } + +} diff --git a/data-store/src/test/java/org/lucares/pdb/datastore/DataStoreTest.java b/data-store/src/test/java/org/lucares/pdb/datastore/internal/DataStoreTest.java similarity index 97% rename from data-store/src/test/java/org/lucares/pdb/datastore/DataStoreTest.java rename to data-store/src/test/java/org/lucares/pdb/datastore/internal/DataStoreTest.java index 0983672..0c6a1f2 100644 --- a/data-store/src/test/java/org/lucares/pdb/datastore/DataStoreTest.java +++ b/data-store/src/test/java/org/lucares/pdb/datastore/internal/DataStoreTest.java @@ -1,4 +1,4 @@ -package org.lucares.pdb.datastore; +package org.lucares.pdb.datastore.internal; import java.io.IOException; import java.nio.file.Files; @@ -11,6 +11,8 @@ import java.util.Map; import java.util.Map.Entry; import org.lucares.pdb.api.Tags; +import org.lucares.pdb.datastore.Doc; +import org.lucares.pdb.datastore.internal.DataStore; import org.lucares.utils.CollectionUtils; import org.lucares.utils.file.FileUtils; import org.testng.Assert; diff --git a/data-store/src/test/java/org/lucares/pdb/datastore/ProposalsTest.java b/data-store/src/test/java/org/lucares/pdb/datastore/internal/ProposerTest.java similarity index 71% rename from data-store/src/test/java/org/lucares/pdb/datastore/ProposalsTest.java rename to data-store/src/test/java/org/lucares/pdb/datastore/internal/ProposerTest.java index bc61319..4975fca 100644 --- a/data-store/src/test/java/org/lucares/pdb/datastore/ProposalsTest.java +++ b/data-store/src/test/java/org/lucares/pdb/datastore/internal/ProposerTest.java @@ -1,22 +1,28 @@ -package org.lucares.pdb.datastore; +package org.lucares.pdb.datastore.internal; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collections; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import org.lucares.pdb.api.Tags; +import org.lucares.pdb.datastore.PdbDB; +import org.lucares.pdb.datastore.Proposal; import org.lucares.utils.file.FileUtils; +import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @Test -public class ProposalsTest { +public class ProposerTest { private Path dataDirectory; - private DataStore dataStore; + private PdbDB db; private Map tagsToPath; @BeforeMethod @@ -27,11 +33,10 @@ public class ProposalsTest { @AfterMethod public void afterMethod() throws IOException { FileUtils.delete(dataDirectory); - dataStore = null; + db = null; tagsToPath = null; } - @Test(enabled = false) public void testProposals() throws Exception { tagsToPath = new LinkedHashMap<>(); final Tags eagleTim = Tags.create("bird", "eagle", "name", "Tim"); @@ -46,10 +51,10 @@ public class ProposalsTest { tagsToPath.put(labradorJenny, null); tagsToPath.put(labradorTim, null); - dataStore = new DataStore(dataDirectory); + db = new PdbDB(dataDirectory); for (final Tags tags : tagsToPath.keySet()) { - final Path newFile = dataStore.createNewFile(tags); + final Path newFile = db.createNewFile(tags); tagsToPath.put(tags, newFile); } @@ -63,12 +68,12 @@ public class ProposalsTest { private void assertProposals(final String query, final int caretIndex, final Proposal... expected) throws InterruptedException { - // final List actual = dataStore.propose(query, caretIndex); - // final List expectedList = Arrays.asList(expected); - // Collections.sort(expectedList); - // - // System.out.println("actual: " + actual); - // System.out.println("expected: " + expectedList); - // Assert.assertEquals(expectedList, actual); + final List actual = db.propose(query, caretIndex); + final List expectedList = Arrays.asList(expected); + Collections.sort(expectedList); + + System.out.println("actual: " + actual); + System.out.println("expected: " + expectedList); + Assert.assertEquals(expectedList, actual); } } diff --git a/pdb-utils/src/main/java/org/lucares/utils/CollectionUtils.java b/pdb-utils/src/main/java/org/lucares/utils/CollectionUtils.java index 9e23efb..e54b70a 100644 --- a/pdb-utils/src/main/java/org/lucares/utils/CollectionUtils.java +++ b/pdb-utils/src/main/java/org/lucares/utils/CollectionUtils.java @@ -33,7 +33,7 @@ public class CollectionUtils { return Stream.of(input).map(mapper).collect(Collectors.toList()); } - public static Map toMap(final Iterable iterable, final Function keyMapper) { + public static Map createMapFromValues(final Iterable iterable, final Function keyMapper) { final Map result = new HashMap<>(); for (final V value : iterable) { @@ -45,6 +45,19 @@ public class CollectionUtils { return result; } + public static Map createMapFromKeys(final Iterable iterable, + final Function valueMapper) { + final Map result = new HashMap<>(); + + for (final KEY key : iterable) { + final VALUE value = valueMapper.apply(key); + + result.put(key, value); + } + + return result; + } + public static List filter(final Collection collection, final Predicate predicate) { return collection.stream().filter(predicate).collect(Collectors.toList()); } diff --git a/performanceDb/src/test/java/org/lucares/performance/db/PerformanceDbTest.java b/performanceDb/src/test/java/org/lucares/performance/db/PerformanceDbTest.java index b659845..7155b6c 100644 --- a/performanceDb/src/test/java/org/lucares/performance/db/PerformanceDbTest.java +++ b/performanceDb/src/test/java/org/lucares/performance/db/PerformanceDbTest.java @@ -14,7 +14,7 @@ import org.lucares.pdb.api.Entry; import org.lucares.pdb.api.GroupResult; import org.lucares.pdb.api.Result; import org.lucares.pdb.api.Tags; -import org.lucares.pdb.datastore.DataStore; +import org.lucares.pdb.datastore.internal.DataStore; import org.lucares.utils.file.FileUtils; import org.testng.Assert; import org.testng.annotations.AfterMethod;