/** * 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 * <http://cloudgraph.org/licenses/>. */ package org.cloudgraph.hbase.mutation; import java.io.IOException; import java.sql.Timestamp; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hbase.util.Bytes; import org.cloudgraph.hbase.io.DistributedWriter; import org.cloudgraph.hbase.io.RowWriter; import org.cloudgraph.hbase.io.TableWriter; import org.cloudgraph.hbase.service.ServiceContext; import org.plasma.sdo.PlasmaDataObject; import org.plasma.sdo.PlasmaProperty; import org.plasma.sdo.PlasmaType; import org.plasma.sdo.access.RequiredPropertyException; import org.plasma.sdo.core.CoreConstants; import org.plasma.sdo.core.CoreDataObject; import org.plasma.sdo.core.SnapshotMap; import org.plasma.sdo.profile.ConcurrencyType; import org.plasma.sdo.profile.ConcurrentDataFlavor; import commonj.sdo.DataGraph; import commonj.sdo.Property; public class Delete extends DefaultMutation implements Collector { private static Log log = LogFactory.getLog(Delete.class); public Delete(ServiceContext context, SnapshotMap snapshotMap, String username) { super(context, snapshotMap, username); } @Override public void collect(DataGraph dataGraph, PlasmaDataObject dataObject, DistributedWriter graphWriter, TableWriter context, RowWriter rowWriter) throws IOException, IllegalAccessException { PlasmaType type = (PlasmaType)dataObject.getType(); // FIXME: get rid of cast - define instance properties in 'base type' Timestamp snapshotDate = (Timestamp)((CoreDataObject)dataObject).getValue(CoreConstants.PROPERTY_NAME_SNAPSHOT_TIMESTAMP); if (snapshotDate == null) throw new RequiredPropertyException("property '" + CoreConstants.PROPERTY_NAME_SNAPSHOT_TIMESTAMP + "' is required to delete entity '" + type.getName() + "'"); if (log.isDebugEnabled()) log.debug(dataObject + " timestamp: " + String.valueOf(snapshotDate)); this.checkLock(dataObject, type, snapshotDate); this.checkOptimistic(dataObject, type, snapshotDate); PlasmaProperty concurrencyUserProperty = (PlasmaProperty)type.findProperty(ConcurrencyType.optimistic, ConcurrentDataFlavor.user); if (concurrencyUserProperty == null) { if (log.isDebugEnabled()) log.debug("could not find optimistic concurrency (username) property for type, " + type.getURI() + "#" + type.getName()); } PlasmaProperty concurrencyTimestampProperty = (PlasmaProperty)type.findProperty(ConcurrencyType.optimistic, ConcurrentDataFlavor.time); if (concurrencyTimestampProperty == null) { if (log.isDebugEnabled()) log.debug("could not find optimistic concurrency timestamp property for type, " + type.getURI() + "#" + type.getName()); } // If no tombstones, and if the root of the row is deleted if this object is the root, delete it, else if // the given data object is part of the row, just return. // No need to delete its individual properties, as the row is going away anyway. if (!context.getTableConfig().tombstoneRows()) { if (rowWriter.isRootDeleted()) { if (rowWriter.getRootDataObject().equals(dataObject)) { rowWriter.deleteRow(); return; } else if (rowWriter.contains(dataObject)) { return; } } } // For tombstone rows, we want to delete app columns (and leave a tombstone column // which is not done here). // So delete all columns associated with the entity List<Property> properties = type.getProperties(); for (Property p : properties) { PlasmaProperty property = (PlasmaProperty)p; this.deleteCell(rowWriter, dataObject, property); } } }