-S2DataSetのAPI(1)

v2.0.5でのS2DataSetでいくらか書いてみて、またXlsReader/XlsWriterを眺め、SqlReader/SqlWriterを想像して、考えました。仕様の変更および拡大があるので難しいかなと思いますが、私なりの理想を書いてみます。

  • XlsおよびSqlの違いを、DataSetのAPIレベルでは隠蔽したい。
  • 2.0.5ではメタ情報なメソッドで足りないものがある。
    • DataSet に保持するTable名を返すメソッド。String getTableName();
    • Column名を返すメソッド。String getColumnName();
    • Columnの型を返すメソッド。Class getColumnType();
    • 書き込みできるかを返すメソッド。boolean isWritable();
    • 構造を変えられるかどうかを返すメソッド。boolean isAlterable();
    • 書き込んでまだ永続化してないかを判定するメソッド。boolean isDuty();

以上を鑑み、S2DataSet v2.0.6 API仕様私案です。とにかく、DataReader/DataWriterの実装種類を隠蔽するために、S2DataSetのAPIが拡大してますが、なるべくシンプル?にしたつもりではあります。これだけあれば案件でも困らないと思います。今、XlsReader/XlsWriterで開発したとして、後にSqlReaderがでてきてもSeaser2の設定XMLを変更するだけで動いてほしい!との切なる願い。。。

public class SqlReader {
  public SqlReader(DataSource source);
  public void addSQL(String sql, String alias);
  public DataSet read();
}

まんまSQLを書けます。このSqlReaderは各isWritable()およびisAlterable()は全false。リードオンリーです。よって、SqlWriterは無し。S2DataSetのAPIを介してクライアントコードからSQLにアクセスするという意味で、S2Daoと異なります。

public class TableReader {
  public DBTableReader(DataSource source);
  public void addTable(String tableName);
  public void addTable(String tableName, String alias);
  public void addTable(String tableName, String condition);
  public void addTable(String tableName, String condition, String alias);
  public DataSet read();
}
public class TableWriter {
  public DBTableWriter(DataSource source);
  public void write();
}

基本的にtableNameで、DataSet#getTable(tableName)が呼べるのですが、名前がかぶるときにはaliasをつけます。テーブルにPKが付いていれば、書き込みも可能とします。このTableReader/TableWriterがほしい!いわゆるTTableですね。

public interface DataSet {
  public boolean isAlterable();
  public int getTableSize();
  public String getTableName(int index); // うーん。
  public DataTable getTable(int index);
  public DataTable getTable(String tableName)
    throws TableNotFoundRuntimeException, ConfrictNamesRuntimeException;
  public DataTable addTable()
    throws NotAlterableRuntimeException;
  public void deleteTable(DataTable table)
    throws NotAlterableRuntimeException;
}

Alterableであれば、テーブルの追加、削除ができます。DBReaderで、名前がTooManyな時には、getTable(tableName)でConfrictNamesRuntimeExceptionが発生します。

public interface DataTable {
  public boolean isDuty();
  public boolean isAlterable();
  public boolean isWritable();
  public String getTableName();
  public void setTableName(String tableName)
    throws NotAlterableRuntimeException;
  public int getColumnSize();
  public String getColumnName(int index); // うーん。
  public Class getColumnType(int index); // getValueType?
  public int getRowSize();
  public DataRow getRow(int index);
  public DataRow addRow()
    throws NotWritableRuntimeException;
  public void deleteRow(DataRow row)
    throws NotWritableRuntimeException;
  public String getPrimaryKeys(); // 賛成。
  public void PrimaryKeys(String primaryKeys)
    throws NotAlterableRuntimeException; // 賛成。だけど可能?
}

DataTableは、テーブルメタデータへのアクセスと、DataRowの操作を行います。

public interface DataRow {
  public boolean isDuty();
  public boolean isAlterable();
  public DataColumn getColumn(int index);
  public DataColumn getColumn(String columnName)
    throws ColumnNotFoundRuntimeException;
  public DataColumn addColumn(Class clazz)
    throws NotAlterableRuntimeException, NotSupportColumnTypeRuntimeException;
  public void deleteColumn(DataColumn column)
    throws NotAlterableRuntimeException;
  public DataTable getTable(); // 賛成。
}

DataRowは、DataColumnの操作のみを行います。addColumn(Class)で、対応不能な型が引数に渡されると、NotSupportColumnTypeRuntimeExceptionが発生します。

public interface DataColumn {
  public boolean isDuty();
  public boolean isWritable();
  public String getColumnName();
  public Class getColumnType(); // 賛成。 
  public int getValueType(); // 賛成。 
  public Object getValue();
  public void setValue(Object value)
    throws NotWritableRuntimeException;
  public DataTable getTable(); // 賛成。
}

DataColumnは、カラムメタデータへのアクセスと、データの操作のみを行います。
赤字でひがさんからのコメントを反映してみました。