blob: df0a1cbac457de8ef4e8e1cd2466cf40cba983ff [file] [log] [blame]
/**
* 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.gora.store;
import java.io.Closeable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
import org.apache.gora.persistency.BeanFactory;
import org.apache.gora.persistency.Persistent;
import org.apache.gora.query.PartitionQuery;
import org.apache.gora.query.Query;
import org.apache.gora.query.Result;
import org.apache.hadoop.conf.Configurable;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.Writable;
/**
* DataStore handles actual object persistence. Objects can be persisted,
* fetched, queried or deleted by the DataStore methods. DataStores can be
* constructed by an instance of {@link DataStoreFactory}.
*
* <p> DataStores implementations should be thread safe.
* <p><a name="visibility"><b>Note:</b> Results of updates ({@link #put(Object, Persistent)},
* {@link #delete(Object)} and {@link #deleteByQuery(Query)} operations) are
* guaranteed to be visible to subsequent get / execute operations ONLY
* after a subsequent call to {@link #flush()}.
* @param <K> the class of keys in the datastore
* @param <T> the class of persistent objects in the datastore
*/
public interface DataStore<K, T extends Persistent> extends Closeable,
Writable, Configurable {
/**
* Initializes this DataStore.
* @param keyClass the class of the keys
* @param persistentClass the class of the persistent objects
* @param properties extra metadata
* @throws IOException
*/
void initialize(Class<K> keyClass, Class<T> persistentClass,
Properties properties) throws IOException;
/**
* Sets the class of the keys
* @param keyClass the class of keys
*/
void setKeyClass(Class<K> keyClass);
/**
* Returns the class of the keys
* @return class of the keys
*/
Class<K> getKeyClass();
/**
* Sets the class of the persistent objects
* @param persistentClass class of persistent objects
*/
void setPersistentClass(Class<T> persistentClass);
/**
* Returns the class of the persistent objects
* @return class of the persistent objects
*/
Class<T> getPersistentClass();
/**
* Returns the schema name given to this DataStore
* @return schema name
*/
String getSchemaName();
/**
* Creates the optional schema or table (or similar) in the datastore
* to hold the objects. If the schema is already created previously,
* or the underlying data model does not support
* or need this operation, the operation is ignored.
*/
void createSchema() throws IOException;
/**
* Deletes the underlying schema or table (or similar) in the datastore
* that holds the objects. This also deletes all the data associated with
* the schema.
*/
void deleteSchema() throws IOException;
/**
* Deletes all the data associated with the schema, but keeps the
* schema (table or similar) intact.
*/
void truncateSchema() throws IOException;
/**
* Returns whether the schema that holds the data exists in the datastore.
* @return whether schema exists
*/
boolean schemaExists() throws IOException;
/**
* Returns a new instance of the key object. If the object cannot be instantiated
* (it the class is a Java primitive wrapper, or does not have no-arg
* constructor) it throws an exception. Only use this function if you can
* make sure that the key class has a no-arg constructor.
* @return a new instance of the key object.
*/
K newKey() throws IOException;
/**
* Returns a new instance of the managed persistent object.
* @return a new instance of the managed persistent object.
*/
T newPersistent() throws IOException;
/**
* Returns the object corresponding to the given key fetching all the fields.
* @param key the key of the object
* @return the Object corresponding to the key or null if it cannot be found
*/
T get(K key) throws IOException;
/**
* Returns the object corresponding to the given key.
* @param key the key of the object
* @param fields the fields required in the object. Pass null, to retrieve all fields
* @return the Object corresponding to the key or null if it cannot be found
*/
T get(K key, String[] fields) throws IOException;
/**
* Inserts the persistent object with the given key. If an
* object with the same key already exists it will silently
* be replaced. See also the note on
* <a href="#visibility">visibility</a>.
*/
void put(K key, T obj) throws IOException;
/**
* Deletes the object with the given key
* @param key the key of the object
* @return whether the object was successfully deleted
*/
boolean delete(K key) throws IOException;
/**
* Deletes all the objects matching the query.
* See also the note on <a href="#visibility">visibility</a>.
* @param query matching records to this query will be deleted
* @return number of deleted records
*/
long deleteByQuery(Query<K, T> query) throws IOException;
/**
* Executes the given query and returns the results.
* @param query the query to execute.
* @return the results as a {@link Result} object.
*/
Result<K,T> execute(Query<K, T> query) throws IOException;
/**
* Constructs and returns a new Query.
* @return a new Query.
*/
Query<K, T> newQuery();
/**
* Partitions the given query and returns a list of {@link PartitionQuery}s,
* which will execute on local data.
* @param query the base query to create the partitions for. If the query
* is null, then the data store returns the partitions for the default query
* (returning every object)
* @return a List of PartitionQuery's
*/
List<PartitionQuery<K,T>> getPartitions(Query<K,T> query)
throws IOException;
/**
* Forces the write caches to be flushed. DataStore implementations may
* optimize their writing by deferring the actual put / delete operations
* until this moment.
* See also the note on <a href="#visibility">visibility</a>.
*/
void flush() throws IOException;
/**
* Sets the {@link BeanFactory} to use by the DataStore.
* @param beanFactory the BeanFactory to use
*/
void setBeanFactory(BeanFactory<K,T> beanFactory);
/**
* Returns the BeanFactory used by the DataStore
* @return the BeanFactory used by the DataStore
*/
BeanFactory<K,T> getBeanFactory();
/**
* Close the DataStore. This should release any resources held by the
* implementation, so that the instance is ready for GC.
* All other DataStore methods cannot be used after this
* method was called. Subsequent calls of this method are ignored.
*/
void close() throws IOException;
Configuration getConf();
void setConf(Configuration conf);
void readFields(DataInput in) throws IOException;
void write(DataOutput out) throws IOException;
}