diff --git a/data-store/src/main/java/org/lucares/pdb/datastore/internal/DataStore.java b/data-store/src/main/java/org/lucares/pdb/datastore/internal/DataStore.java index 8dfa82f..1f12a1f 100644 --- a/data-store/src/main/java/org/lucares/pdb/datastore/internal/DataStore.java +++ b/data-store/src/main/java/org/lucares/pdb/datastore/internal/DataStore.java @@ -45,6 +45,7 @@ public class DataStore { private static final Pattern EXTRACT_TAGS_PATTERN = Pattern.compile(REGEX_STORAGE_FILE); + // to be guarded by itself private final List docIdToDoc = new ArrayList<>(); private final Map> keyToValueToDocId = new ConcurrentHashMap<>(); @@ -70,13 +71,18 @@ public class DataStore { }); trimIntLists(); - ((ArrayList)docIdToDoc).trimToSize(); + synchronized (docIdToDoc) { + ((ArrayList)docIdToDoc).trimToSize(); + } } private void cacheTagToFileMapping(final Tags tags, final Path path) { - final int docId = docIdToDoc.size(); - docIdToDoc.add(new Doc(tags, path)); + final int docId; + synchronized (docIdToDoc) { + docId = docIdToDoc.size(); + docIdToDoc.add(new Doc(tags, path)); + } for (final String key : tags.getKeys()) { final Map valueToDocIds = keyToValueToDocId.computeIfAbsent(key, k -> new ConcurrentHashMap<>()); @@ -231,23 +237,35 @@ public class DataStore { private IntList executeQuery(final String query) { final long start = System.nanoTime(); - final Expression expression = QueryLanguageParser.parse(query); - final ExpressionToDocIdVisitor visitor = new ExpressionToDocIdVisitor(keyToValueToDocId, - new AllDocIds(docIdToDoc)); - final IntList docIdsList = expression.visit(visitor); - EXECUTE_QUERY_LOGGER.debug("executeQuery({}) took {}ms returned {} results " , query, (System.nanoTime() - start) / 1_000_000.0, docIdsList.size()); - return docIdsList; + synchronized (docIdToDoc) { + final Expression expression = QueryLanguageParser.parse(query); + final ExpressionToDocIdVisitor visitor = new ExpressionToDocIdVisitor( + keyToValueToDocId, new AllDocIds(docIdToDoc)); + final IntList docIdsList = expression.visit(visitor); + EXECUTE_QUERY_LOGGER.debug( + "executeQuery({}) took {}ms returned {} results ", query, + (System.nanoTime() - start) / 1_000_000.0, + docIdsList.size()); + return docIdsList; + } } private List mapDocIdsToDocs(final IntList docIdsList) { final List result = new ArrayList<>(docIdsList.size()); + synchronized (docIdToDoc) { 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); + for (int i = 0; i < intDocIds.length; i++) { + final int docId = intDocIds[i]; + + final Doc doc = docIdToDoc.get(docId); + + if (!doc.getTags().getValue("pod").equals("vadtrans01")){ + System.out.println(); + } + + result.add(doc); + } } return result; }