All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.cloudgraph.hbase.io.DistributedGraphReader Maven / Gradle / Ivy

/**
 *        CloudGraph Community Edition (CE) License
 * 
 * This is a community release of CloudGraph, a dual-license suite of
 * Service Data Object (SDO) 2.1 services designed for relational and 
 * big-table style "cloud" databases, such as HBase and others. 
 * This particular copy of the software is released under the 
 * version 2 of the GNU General Public License. CloudGraph was developed by 
 * TerraMeta Software, Inc.
 * 
 * Copyright (c) 2013, TerraMeta Software, Inc. All rights reserved.
 * 
 * General License information can be found below.
 * 
 * This distribution may include materials developed by third
 * parties. For license and attribution notices for these
 * materials, please refer to the documentation that accompanies
 * this distribution (see the "Licenses for Third-Party Components"
 * appendix) or view the online documentation at 
 * . 
 */
package org.cloudgraph.hbase.io;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.namespace.QName;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.cloudgraph.config.CloudGraphConfig;
import org.cloudgraph.config.TableConfig;
import org.cloudgraph.state.StateMarshalingContext;
import org.plasma.sdo.PlasmaType;

import commonj.sdo.DataObject;
import commonj.sdo.Type;


/**
 * Encapsulates one or more
 * graph table reader components for federation across
 * multiple physical tables and/or physical table rows. 
 * Maps physical configured
 * table names to respective table readers. In most usage
 * scenarios, a "root" table reader is typically added 
 * initially, then other reader are incrementally added
 * as association target types are detected and found configured as
 * graph roots within another distinct table context. 
 * 

* Acts as a container for one or more {@link TableReader} elements * encapsulating a set of component table read operations * for distributed assembly across multiple tables, or a single table * in the most simple (degenerate) case. *

* @see org.cloudgraph.hbase.io.GraphTableReader * @see org.cloudgraph.state.GraphTable * @author Scott Cinnamond * @since 0.5.1 */ public class DistributedGraphReader implements DistributedReader { private static Log log = LogFactory.getLog(DistributedGraphReader.class); private TableReader rootReader; /** maps table names to table readers */ private Map tableReaderMap = new HashMap(); /** maps qualified graph-root type names to table readers */ private Map typeTableReaderMap = new HashMap(); /** maps table readers to graph-root types */ private Map> tableReaderTypeMap = new HashMap>(); // maps data objects to row readers private Map rowReaderMap = new HashMap(); private StateMarshalingContext marshallingContext; @SuppressWarnings("unused") private DistributedGraphReader() {} public DistributedGraphReader(Type rootType, List types, StateMarshalingContext marshallingContext) { this.marshallingContext = marshallingContext; PlasmaType root = (PlasmaType)rootType; TableConfig rootTable = CloudGraphConfig.getInstance().getTable( root.getQualifiedName()); TableReader tableReader = new GraphTableReader(rootTable, this); this.tableReaderMap.put(tableReader.getTableConfig().getName(), tableReader); this.rootReader = tableReader; this.typeTableReaderMap.put(((PlasmaType)rootType).getQualifiedName(), this.rootReader); List list = new ArrayList(); this.tableReaderTypeMap.put(this.rootReader, list); list.add(rootType); for (Type t : types) { PlasmaType type = (PlasmaType)t; TableConfig table = CloudGraphConfig.getInstance().findTable( type.getQualifiedName()); if (table == null) continue; // not a graph root tableReader = this.tableReaderMap.get(table.getName()); if (tableReader == null) { // create a new table reader if not added already, e.g. // as root above or from a graph root type // mapped to a table we have seen here tableReader = new GraphTableReader(table, this); this.tableReaderMap.put(tableReader.getTableConfig().getName(), tableReader); } // always map root types this.typeTableReaderMap.put(type.getQualifiedName(), tableReader); list = this.tableReaderTypeMap.get((TableOperation)tableReader); if (list == null) { list = new ArrayList(); this.tableReaderTypeMap.put(tableReader, list); } if (!list.contains(type)) list.add(type); } } /** * Returns the table reader for the given * configured table name, or null of not exists. * @param tableName the name of the configured table. * @return the table reader for the given * configured table name, or null of not exists. */ @Override public TableReader getTableReader(String tableName) { return this.tableReaderMap.get(tableName); } /** * Returns the table reader for the given * qualified type name, or null if not exists. * @param qualifiedTypeName the qualified type name. * @return the table reader for the given * qualified type name, or null if not exists. */ public TableReader getTableReader(QName qualifiedTypeName) { return this.typeTableReaderMap.get(qualifiedTypeName); } /** * Adds the given table reader to the container * @param reader the table reader. */ @Override public void addTableReader(TableReader reader) { String name = reader.getTableConfig().getName(); if (this.tableReaderMap.get(name) != null) throw new OperationException("table reader for '" + name + "' already exists"); this.tableReaderMap.put(name, reader); } /** * Returns the count of table readers for this * container. * @return the count of table readers for this * container */ @Override public int getTableReaderCount() { return this.tableReaderMap.size(); } /** * Returns all table readers for the this container * @return all table readers for the this container */ public List getTableReaders() { List result = new ArrayList(); result.addAll(this.tableReaderMap.values()); return result; } /** * Returns the table reader associated with the * data graph root. * @return the table reader associated with the * data graph root. */ public TableReader getRootTableReader() { return this.rootReader; } /** * Sets the table reader associated with the * data graph root. * @param reader the table reader */ public void setRootTableReader(TableReader reader) { this.rootReader = reader; this.tableReaderMap.put(rootReader.getTableConfig().getName(), rootReader); } /** * Returns the row reader associated with the given data object * @param dataObject the data object * @return the row reader associated with the given data object * @throws IllegalArgumentException if the given data object * is not associated with any row reader. */ public RowReader getRowReader(DataObject dataObject) { RowReader result = rowReaderMap.get(dataObject); if (result == null) throw new IllegalArgumentException("the given data object of type " + dataObject.getType().getURI() + "#" + dataObject.getType().getName() + " is not associated with any row reader"); return result; } public void mapRowReader(DataObject dataObject, RowReader rowReader) { RowReader existing = this.rowReaderMap.get(dataObject); if (existing != null) { //throw new IllegalArgumentException log.warn("the given data object of type " + dataObject.getType().getURI() + "#" + dataObject.getType().getName() + " is already associated with a row reader"); return; } rowReaderMap.put(dataObject, rowReader); } /** * Returns a list of types associated * with the given table reader. * @param reader the table reader * @return a list of types associated * with the given table reader. */ @Override public List getTypes(TableReader operation) { return this.tableReaderTypeMap.get(operation); } /** * Returns true if only one table operation exists * with only one associated (root) type for this * operation. * @return true if only one table operation exists * with only one associated (root) type for this * operation. */ public boolean hasSingleRootType() { if (this.getTableReaderCount() == 1 && this.getTypes(this.rootReader).size() == 1) { return true; } else return false; } /** * Frees resources associated with this reader and any * component readers. */ public void clear() { this.rowReaderMap.clear(); // table readers are created based entirely on metadata // i.e. selected types for a query for (TableReader tableReader : tableReaderMap.values()) tableReader.clear(); } @Override public StateMarshalingContext getMarshallingContext() { return this.marshallingContext; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy