/**
* 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.slice;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import junit.framework.Test;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.cloudgraph.hbase.test.DataTypeGraphModelTest;
import org.cloudgraph.test.datatypes.DateNode;
import org.cloudgraph.test.datatypes.Node;
import org.cloudgraph.test.datatypes.query.QDateNode;
import org.plasma.common.test.PlasmaTestSetup;
import org.plasma.query.Expression;
import org.plasma.sdo.helper.PlasmaDataFactory;
import org.plasma.sdo.helper.PlasmaTypeHelper;
import commonj.sdo.DataGraph;
import commonj.sdo.Type;
/**
* Date SDO datatype specific graph slice test.
* @author Scott Cinnamond
* @since 0.5.2
*/
public class DatePredicateSliceTest extends DataTypeGraphModelTest {
private static Log log = LogFactory.getLog(DatePredicateSliceTest.class);
private String USERNAME = "slice_test";
private long WAIT_TIME = 1050;
public static Test suite() {
return PlasmaTestSetup.newTestSetup(DatePredicateSliceTest.class);
}
public void setUp() throws Exception {
super.setUp();
}
public void testEqual() throws IOException
{
long id = System.currentTimeMillis() + 10000; // space tests out more than 1 second
Calendar now = Calendar.getInstance();
now.setTime(new Date(id));
now.clear(Calendar.MILLISECOND);
Node root = this.createGraph(id, now.getTime());
service.commit(root.getDataGraph(), USERNAME);
// fetch a slice
Node fetched = this.fetchSliceEquals(now.getTime());
debugGraph(fetched.getDataGraph());
assertNotNull(fetched);
assertTrue(fetched.getChildCount() == 1);
assertNotNull(fetched.getChild(0).getDateField());
assertTrue(fetched.getChild(0).getDateField().compareTo(now.getTime()) == 0);
}
public void testGreaterThan() throws IOException
{
long id = System.currentTimeMillis() + 20000; // space tests out more than 1 second
Calendar now = Calendar.getInstance();
now.setTime(new Date(id));
now.clear(Calendar.MILLISECOND);
Node root = this.createGraph(id, now.getTime());
service.commit(root.getDataGraph(), USERNAME);
// fetch a slice
Node fetched = this.fetchSliceGreaterThan(now.getTime());
assertNotNull(fetched);
debugGraph(fetched.getDataGraph());
assertTrue(fetched.getChildCount() == maxRows - 1);
for (Node node : fetched.getChild())
assertTrue(node.getDateField().compareTo(now.getTime()) > 0);
}
public void testBetween() throws IOException
{
long id = System.currentTimeMillis() + 30000; // space tests out more than 1 second
Calendar now = Calendar.getInstance();
now.setTime(new Date(id));
now.clear(Calendar.MILLISECOND);
Node root = this.createGraph(id, now.getTime());
service.commit(root.getDataGraph(), USERNAME);
int startIndex = 1;
int endIndex = 4;
Calendar start = Calendar.getInstance();
start.setTime(now.getTime());
start.clear(Calendar.MILLISECOND);
start.add(Calendar.DAY_OF_YEAR, startIndex);
Calendar end = Calendar.getInstance();
end.setTime(now.getTime());
end.clear(Calendar.MILLISECOND);
end.add(Calendar.DAY_OF_YEAR, endIndex);
log.info(start.getTime());
log.info(end.getTime());
// fetch a slice
Node fetched = this.fetchSliceBetween(
now.getTime(),
start.getTime(), end.getTime());
assertNotNull(fetched);
debugGraph(fetched.getDataGraph());
assertTrue(fetched.getChildCount() == (endIndex - startIndex) + 1);
assertNotNull(fetched.getChild(startIndex-1).getDateField());
assertTrue(fetched.getChild(startIndex-1).getDateField().compareTo(start.getTime()) == 0);
assertTrue(fetched.getChild(endIndex-1).getDateField().compareTo(end.getTime()) == 0);
}
public void testLike() throws IOException
{
long id = System.currentTimeMillis() + 40000; // space tests out more than 1 second
Calendar now = Calendar.getInstance();
now.setTime(new Date(id));
now.clear(Calendar.MILLISECOND);
Node root = this.createGraph(id, now.getTime());
service.commit(root.getDataGraph(), USERNAME);
// fetch a slice
Node fetched = this.fetchSliceLike(now.getTime(),
"*date*", "*3");
assertNotNull(fetched);
debugGraph(fetched.getDataGraph());
assertTrue(fetched.getChildCount() == 1);
assertNotNull(fetched.getChild(0).getStringField());
assertTrue(fetched.getChild(0).getStringField().contains("date"));
assertTrue(fetched.getChild(0).getStringField().contains("3"));
}
protected DateNode createGraph(long id, Date now) {
DataGraph dataGraph = PlasmaDataFactory.INSTANCE.createDataGraph();
dataGraph.getChangeSummary().beginLogging(); // log changes from this point
Type rootType = PlasmaTypeHelper.INSTANCE.getType(DateNode.class);
DateNode root = (DateNode)dataGraph.createRootObject(rootType);
fillNode(root, id, now, "date", 0, 0);
fillGraph(root, id, now, "date");
return root;
}
protected Node fetchSliceEquals(Date date) {
QDateNode root = QDateNode.newQuery();
QDateNode node = QDateNode.newQuery();
Expression predicate = node.dateField().eq(date)
.and(node.levelNum().eq(1));
createSelect(root, predicate);
root.where(root.dateField().eq(date));
DataGraph[] result = service.find(root);
assertTrue(result != null);
assertTrue(result.length == 1);
return (Node)result[0].getRootObject();
}
protected Node fetchSliceGreaterThan(Date date) {
QDateNode root = QDateNode.newQuery();
QDateNode node = QDateNode.newQuery();
Expression predicate = node.dateField().gt(date)
.and(node.levelNum().eq(1));
createSelect(root, predicate);
root.where(root.dateField().eq(date));
DataGraph[] result = service.find(root);
assertTrue(result != null);
assertTrue(result.length == 1);
return (Node)result[0].getRootObject();
}
protected Node fetchSliceBetween(Date date,
Date start, Date end) {
QDateNode root = QDateNode.newQuery();
QDateNode node = QDateNode.newQuery();
Expression predicate = node.levelNum().eq(1)
.and(node.dateField().between(start, end));
createSelect(root, predicate);
root.where(root.dateField().eq(date));
DataGraph[] result = service.find(root);
assertTrue(result != null);
assertTrue(result.length == 1);
return (Node)result[0].getRootObject();
}
protected Node fetchSliceLike(Date date, String wildcard1, String wildcard2) {
QDateNode root = QDateNode.newQuery();
QDateNode node = QDateNode.newQuery();
// group + left expr
Expression predicate = node.group(node.stringField().like(wildcard1)
.and(node.stringField().like(wildcard2)))
.and(node.levelNum().eq(1));
// right expr + group
//Expression predicate = node.levelNum().eq(22)
// .and(node
// .group(node.stringField().like(wildcard1)
// .and(node.stringField().like(wildcard2))));
//Expression predicate = node.stringField().like(wildcard2)
// .and(node.stringField().like(wildcard1))
// .and(node.levelNum().eq(1));
createSelect(root, predicate);
root.where(root.dateField().eq(date));
DataGraph[] result = service.find(root);
assertTrue(result != null);
assertTrue(result.length == 1);
return (Node)result[0].getRootObject();
}
private QDateNode createSelect(QDateNode root, Expression predicate)
{
root.select(root.dateField());
root.select(root.child(predicate).dateField());
root.select(root.child(predicate).stringField());
root.select(root.child(predicate).levelNum());
root.select(root.child(predicate).child(predicate).dateField());
root.select(root.child(predicate).child(predicate).child(predicate).dateField());
root.select(root.child(predicate).child(predicate).child(predicate).child(predicate).dateField());
return root;
}
}