/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.drill.exec.store.sys;
import org.apache.drill.exec.store.sys.store.DataChangeVersion;
import java.util.Iterator;
import java.util.Map;
/**
* An abstraction used to store and retrieve instances of given value type.
*
* @param <V> value type
*/
public interface PersistentStore<V> extends AutoCloseable {
/**
* Returns storage {@link PersistentStoreMode mode} of this store.
*/
PersistentStoreMode getMode();
/**
* Checks if lookup key is present in store.
*
* @param key lookup key
* @return true if store contains lookup key, false otherwise
*/
boolean contains(String key);
/**
* Checks if lookup key is present in store.
* Sets data change version number.
*
* @param key lookup key
* @param version version holder
* @return true if store contains lookup key, false otherwise
*/
boolean contains(String key, DataChangeVersion version);
/**
* Returns the value for the given key if exists, null otherwise.
* @param key lookup key
*/
V get(String key);
/**
* Returns the value for the given key if exists, null otherwise.
* Sets data change version number.
* @param key lookup key
* @param version version holder
*/
V get(String key, DataChangeVersion version);
/**
* Stores the (key, value) tuple in the store. Lifetime of the tuple depends upon store {@link #getMode mode}.
*
* @param key lookup key
* @param value value to store
*/
void put(String key, V value);
/**
* Stores the (key, value) tuple in the store.
* If tuple already exits, stores it only if versions match,
* otherwise throws {@link org.apache.drill.exec.exception.VersionMismatchException}
* Lifetime of the tuple depends upon store {@link #getMode mode}.
*
* @param key lookup key
* @param value value to store
* @param version version holder
*/
void put(String key, V value, DataChangeVersion version);
/**
* Removes the value corresponding to the given key if exists, nothing happens otherwise.
* @param key lookup key
*/
void delete(String key);
/**
* Stores the (key, value) tuple in the store only if it does not exists.
*
* @param key lookup key
* @param value value to store
* @return true if put takes place, false otherwise.
*/
boolean putIfAbsent(String key, V value);
/**
* Returns an iterator of desired number of entries offsetting by the skip value.
*
* @param skip number of records to skip from beginning
* @param take max number of records to return
*/
Iterator<Map.Entry<String, V>> getRange(int skip, int take);
/**
* Returns an iterator of entries.
*/
Iterator<Map.Entry<String, V>> getAll();
}