Package com.alvazan.ssql.cmdline

Source Code of com.alvazan.ssql.cmdline.CmdListPartitions

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");
  }
}
TOP

Related Classes of com.alvazan.ssql.cmdline.CmdListPartitions

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.