package com.alvazan.ssql.cmdline; import java.util.List; import com.alvazan.orm.api.base.NoSqlEntityManager; import com.alvazan.orm.api.z3api.NoSqlTypedSession; import com.alvazan.orm.api.z3api.QueryResult; import com.alvazan.orm.api.z5api.IndexColumnInfo; import com.alvazan.orm.api.z5api.IndexPoint; import com.alvazan.orm.api.z8spi.iter.Cursor; import com.alvazan.orm.api.z8spi.meta.DboColumnMeta; import com.alvazan.orm.api.z8spi.meta.DboColumnToOneMeta; import com.alvazan.orm.api.z8spi.meta.DboTableMeta; import com.alvazan.orm.api.z8spi.meta.ViewInfo; public class CmdListPartitions { public void list(String cmd, NoSqlEntityManager mgr) { String lastPart = cmd.substring(15).trim(); String[] pieces = lastPart.split(" "); if(pieces.length == 0) throw new InvalidCommand("not enough arguments"); else if(pieces.length > 2) throw new InvalidCommand("too many arguments '"+lastPart+"'"); String colFamily = pieces[0]; String field = null; if(pieces.length > 1) field = pieces[1]; listPartitions(mgr, colFamily, field); } private void listPartitions(NoSqlEntityManager mgr, String colFamily, String field) { DboTableMeta meta = mgr.find(DboTableMeta.class, colFamily); if(meta == null) throw new InvalidCommand("This column family='"+colFamily+"' does not exist"); List<DboColumnMeta> partitionedCols = meta.getPartitionedColumns(); if(partitionedCols.size() == 0) { throw new InvalidCommand("This column family='"+colFamily+"' is not partitioned"); } else if(field == null) { if(partitionedCols.size() > 1) throw new InvalidCommand("You must supply a column as this table is partitioned by multiple columns"); DboColumnMeta colMeta = partitionedCols.get(0); listByPartition(colMeta, mgr); return; } for(DboColumnMeta col : partitionedCols) { if(field.equals(col.getColumnName())) { listByPartition(col, mgr); return; } } throw new InvalidCommand("ColumnFamily="+colFamily+" is not partitioned by column='"+field+"'"); } private void listByPartition(DboColumnMeta colMeta, NoSqlEntityManager mgr) { if(!(colMeta instanceof DboColumnToOneMeta)) throw new InvalidCommand("We can only list the partitions when partitioning by a field with @ManyToOne annotation and col="+colMeta.getColumnName()+" does not have that annotation"); String cf = colMeta.getOwner().getColumnFamily(); DboColumnToOneMeta fkMeta = (DboColumnToOneMeta) colMeta; DboTableMeta fkTable = fkMeta.getFkToColumnFamily(); String sql = "SELECT * FROM "+fkTable.getColumnFamily(); NoSqlTypedSession s = mgr.getTypedSession(); QueryResult query = s.createQueryCursor(sql, 100); ViewInfo oneView = query.getViews().get(0); Cursor<IndexColumnInfo> cursor = query.getCursor(); String firstPart = "/"+cf+"/<AnyIndexedColumn>/"+fkMeta.getColumnName()+"/"; System.out.println("Printing partitions of "+cf+" by column "+colMeta.getColumnName()); System.out.println(""); //always print the nullpartition first and start count at with 1... System.out.println("/"+cf+"/<AnyIndexedColumn>"); int counter = 1; while(cursor.next()) { IndexColumnInfo current = cursor.getCurrent(); IndexPoint pt = current.getKeyForView(oneView); String key = pt.getKeyAsString(); System.out.println(firstPart+key); counter++; } System.out.println(counter+" Total Partitions"); } }