From 5c2856f8e5f5e9b8dc3e335bc21665a3dda1122c Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Mon, 4 Mar 2019 12:59:49 +0300 Subject: [PATCH] split ForwardIndex into 2 objects: ForwardIndex - a binary data storage, ForwardIndexAccessor - decoder of indexed binary data --- .../util/indexing/impl/MapReduceIndex.java | 42 +++++++++++++++++++ .../indexing/impl/forward/ForwardIndex.java | 25 +++++++++++ .../impl/forward/ForwardIndexAccessor.java | 24 +++++++++++ .../com/intellij/util/io/KeyValueStore.java | 16 +++++++ .../com/intellij/util/io/PersistentMap.java | 13 +----- 5 files changed, 108 insertions(+), 12 deletions(-) create mode 100644 platform/util/src/com/intellij/util/indexing/impl/forward/ForwardIndex.java create mode 100644 platform/util/src/com/intellij/util/indexing/impl/forward/ForwardIndexAccessor.java create mode 100644 platform/util/src/com/intellij/util/io/KeyValueStore.java diff --git a/platform/util/src/com/intellij/util/indexing/impl/MapReduceIndex.java b/platform/util/src/com/intellij/util/indexing/impl/MapReduceIndex.java index 8fe105a1a23c..88d4c0d25dea 100644 --- a/platform/util/src/com/intellij/util/indexing/impl/MapReduceIndex.java +++ b/platform/util/src/com/intellij/util/indexing/impl/MapReduceIndex.java @@ -24,6 +24,7 @@ import com.intellij.openapi.util.ThrowableComputable; import com.intellij.openapi.util.io.BufferExposingByteArrayOutputStream; import com.intellij.util.ThrowableRunnable; import com.intellij.util.indexing.*; +import com.intellij.util.indexing.impl.forward.ForwardIndexAccessor; import com.intellij.util.io.DataExternalizer; import com.intellij.util.io.DataOutputStream; import org.jetbrains.annotations.ApiStatus; @@ -74,6 +75,13 @@ public abstract class MapReduceIndex implements InvertedIndex< } }); + protected MapReduceIndex(@NotNull IndexExtension extension, + @NotNull IndexStorage storage, + @Nullable com.intellij.util.indexing.impl.forward.ForwardIndex forwardIndex, + @Nullable ForwardIndexAccessor forwardIndexAccessor) { + this(extension, storage, forwardIndex == null && forwardIndexAccessor == null ? null : wrapWithOldForwardIndex(forwardIndex, forwardIndexAccessor)); + } + protected MapReduceIndex(@NotNull IndexExtension extension, @NotNull IndexStorage storage, @Nullable ForwardIndex forwardIndex) { @@ -355,5 +363,39 @@ public abstract class MapReduceIndex implements InvertedIndex< } } } + + @NotNull + private static ForwardIndex wrapWithOldForwardIndex(com.intellij.util.indexing.impl.forward.ForwardIndex forwardIndex, + ForwardIndexAccessor forwardIndexAccessor) { + LOG.assertTrue(forwardIndex != null); + LOG.assertTrue(forwardIndexAccessor != null); + return new ForwardIndex() { + @NotNull + @Override + public InputDataDiffBuilder getDiffBuilder(int inputId) throws IOException { + return forwardIndexAccessor.getDiffBuilder(inputId, forwardIndex.get(inputId)); + } + + @Override + public void putInputData(int inputId, @NotNull Map data) throws IOException { + forwardIndex.put(inputId, forwardIndexAccessor.serializeIndexedData(data, null)); + } + + @Override + public void flush() { + forwardIndex.force(); + } + + @Override + public void clear() throws IOException { + forwardIndex.clear(); + } + + @Override + public void close() throws IOException { + forwardIndex.close(); + } + }; + } } diff --git a/platform/util/src/com/intellij/util/indexing/impl/forward/ForwardIndex.java b/platform/util/src/com/intellij/util/indexing/impl/forward/ForwardIndex.java new file mode 100644 index 000000000000..3940420983e6 --- /dev/null +++ b/platform/util/src/com/intellij/util/indexing/impl/forward/ForwardIndex.java @@ -0,0 +1,25 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.util.indexing.impl.forward; + +import com.intellij.openapi.util.io.ByteArraySequence; +import com.intellij.util.io.KeyValueStore; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; + +/** + * Represents key-value storage held by forward index data structure. + */ +@ApiStatus.Experimental +public interface ForwardIndex extends KeyValueStore { + @Nullable + @Override + ByteArraySequence get(@NotNull Integer key) throws IOException; + + @Override + void put(@NotNull Integer key, @Nullable ByteArraySequence value) throws IOException; + + void clear() throws IOException; +} \ No newline at end of file diff --git a/platform/util/src/com/intellij/util/indexing/impl/forward/ForwardIndexAccessor.java b/platform/util/src/com/intellij/util/indexing/impl/forward/ForwardIndexAccessor.java new file mode 100644 index 000000000000..c96528555482 --- /dev/null +++ b/platform/util/src/com/intellij/util/indexing/impl/forward/ForwardIndexAccessor.java @@ -0,0 +1,24 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.util.indexing.impl.forward; + +import com.intellij.openapi.util.io.ByteArraySequence; +import com.intellij.util.indexing.impl.InputDataDiffBuilder; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.util.Map; + +public interface ForwardIndexAccessor { + /** + * Creates a diff builder for given inputId. + */ + @NotNull + InputDataDiffBuilder getDiffBuilder(int inputId, @Nullable ByteArraySequence sequence) throws IOException; + + /** + * Serialize indexed data to forward index format. + */ + @Nullable + ByteArraySequence serializeIndexedData(@Nullable Map data, @Nullable Input content) throws IOException; +} \ No newline at end of file diff --git a/platform/util/src/com/intellij/util/io/KeyValueStore.java b/platform/util/src/com/intellij/util/io/KeyValueStore.java new file mode 100644 index 000000000000..2b08b3c120a3 --- /dev/null +++ b/platform/util/src/com/intellij/util/io/KeyValueStore.java @@ -0,0 +1,16 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.util.io; + +import org.jetbrains.annotations.ApiStatus; + +import java.io.Closeable; +import java.io.IOException; + +@ApiStatus.Experimental +public interface KeyValueStore extends Closeable { + V get(K key) throws IOException; + + void put(K key, V value) throws IOException; + + void force(); +} diff --git a/platform/util/src/com/intellij/util/io/PersistentMap.java b/platform/util/src/com/intellij/util/io/PersistentMap.java index 09dda6b9be7c..3dd985b2fd8a 100644 --- a/platform/util/src/com/intellij/util/io/PersistentMap.java +++ b/platform/util/src/com/intellij/util/io/PersistentMap.java @@ -3,28 +3,17 @@ package com.intellij.util.io; import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; -import java.io.Closeable; import java.io.IOException; /** * @author Dmitry Avdeev */ -public interface PersistentMap extends Closeable { - - V get(K key) throws IOException; - - void put(K key, V value) throws IOException; - +public interface PersistentMap extends KeyValueStore { boolean processKeys(@NotNull Processor processor) throws IOException; boolean isClosed(); boolean isDirty(); - void force(); - - @Override - void close() throws IOException; - void markDirty() throws IOException; }