// Path: src/main/java/com/globalsight/ling/tm3/core/persistence/DistributedId.java
// public class DistributedId {
// 
//     private String tableName;
//     private long nextId = 0;
//     private long max = 0;
//     private int increment = 100;
//     
//     public DistributedId(String tableName) {
//         this.tableName = tableName;
//     }
//     
//     public DistributedId(String tableName, int increment) {
//         this.tableName = tableName;
//         this.increment = increment;
//     }
// 
//     public long getId(Connection conn) throws SQLException {
//         if (nextId >= max) {
//             nextId = reserveId(conn, increment);
//             max = nextId + increment;
//         }
//         return nextId++;
//     }
//     
//     public void destroy(Connection conn) throws SQLException {
//         SQLUtil.exec(conn, new StatementBuilder()
//             .append("delete from TM3_ID where tableName = ?")
//             .addValue(tableName));
//     }
// 
//     /**
//      * Reserve a set of |count| ids.
//      * @param conn
//      * @param count
//      * @return
//      * @throws SQLException
//      */
//     private long reserveId(Connection conn, int count) throws SQLException {
//         // The magic to why this query works is the use of LAST_INSERT_ID(expr), which
//         // will set the scoped LAST_INSERT_ID value to be the value of 'expr', 
//         // prior to updating it. 
//         SQLUtil.exec(conn, new StatementBuilder()
//             .append("INSERT INTO TM3_ID (tableName, nextId) VALUES (?, LAST_INSERT_ID(1)+?)")
//             .addValues(tableName, count)
//             .append(" ON DUPLICATE KEY UPDATE nextId=LAST_INSERT_ID(nextId)+?")
//             .addValue(count)
//         );
//         
//         return SQLUtil.getLastInsertId(conn);
//     }
// }
// 
// Path: src/main/java/com/globalsight/ling/tm3/core/persistence/StatementBuilder.java
// public class StatementBuilder extends AbstractStatementBuilder {
//     private List<Object> args = new ArrayList<Object>();
//     
//     public StatementBuilder() { 
//         super();
//     }
//     
//     public StatementBuilder(CharSequence s) {
//         super(s);
//     }
//     
//     public StatementBuilder(CharSequence s, Object...args) {
//         super(s);
//         addValues(args);
//     }
//     
//     public StatementBuilder append(CharSequence s) {
//         super.append(s);
//         return this;
//     }
//     
//     public StatementBuilder append(StatementBuilder builder) {
//         super.append(builder.getBuffer());
//         args.addAll(builder.args);
//         return this;
//     }
//     
//     public StatementBuilder addValue(Object o) {
//         args.add(o);
//         return this;
//     }
//     
//     public StatementBuilder addValues(Object...os) {
//         args.addAll(Arrays.asList(os));
//         return this;
//     }
//     
//     /**
//      * Create a PreparedStatement with all attached values inserted.
//      */
//     public PreparedStatement toPreparedStatement(Connection conn) 
//             throws SQLException {
//         PreparedStatement ps = conn.prepareStatement(getBuffer().toString());
//         int index = 1;
//         for (Object o : args) {
//             ps.setObject(index++, o);
//         }
//         this.setStatement(ps);
//         return ps;
//     }
//     
//     @Override
//     public String toString() {
//         StringBuilder s = new StringBuilder();
//         s.append("Statement[")
//          .append(getBuffer())
//          .append(", values=(");
//         for (int i = 0; i < args.size(); i++) {
//             if (i > 0) s.append(", ");
//             s.append(args.get(i));
//         }
//         s.append(")]");
//         return s.toString();
//     }
// }


import java.sql.Connection;
import java.sql.SQLException;
import java.util.Set;
import java.util.HashSet;
import java.util.Map;
import org.hibernate.Session;
import com.globalsight.ling.tm3.core.persistence.DistributedId;
import com.globalsight.ling.tm3.core.persistence.StatementBuilder;
        if (tuIds == null) {
            tuIds = new DistributedId(getTuTableName());
        }
        return tuIds;
    }

    protected DistributedId getTuvIds() {
        if (tuvIds == null) {
            tuvIds = new DistributedId(getTuvTableName());
        }
        return tuvIds;
    }

    // XXX Should this use its own connection?
    long getTuId(Connection conn) throws SQLException {
        return getTuIds().getId(conn);
    }
    
    long getTuvId(Connection conn) throws SQLException {
        return getTuvIds().getId(conn);
    }
    
    /**
     * Add a set of INNER JOIN clauses to filter a statement
     * by an arbitrary number of attributes.
     * @param sb
     * @param tuAlias alias of the TU table to join against
     * @param attrs
     * @return 
     */
// Path: src/main/java/com/globalsight/ling/tm3/core/persistence/DistributedId.java
// public class DistributedId {
// 
//     private String tableName;
//     private long nextId = 0;
//     private long max = 0;
//     private int increment = 100;
//     
//     public DistributedId(String tableName) {
//         this.tableName = tableName;
//     }
//     
//     public DistributedId(String tableName, int increment) {
//         this.tableName = tableName;
//         this.increment = increment;
//     }
// 
//     public long getId(Connection conn) throws SQLException {
//         if (nextId >= max) {
//             nextId = reserveId(conn, increment);
//             max = nextId + increment;
//         }
//         return nextId++;
//     }
//     
//     public void destroy(Connection conn) throws SQLException {
//         SQLUtil.exec(conn, new StatementBuilder()
//             .append("delete from TM3_ID where tableName = ?")
//             .addValue(tableName));
//     }
// 
//     /**
//      * Reserve a set of |count| ids.
//      * @param conn
//      * @param count
//      * @return
//      * @throws SQLException
//      */
//     private long reserveId(Connection conn, int count) throws SQLException {
//         // The magic to why this query works is the use of LAST_INSERT_ID(expr), which
//         // will set the scoped LAST_INSERT_ID value to be the value of 'expr', 
//         // prior to updating it. 
//         SQLUtil.exec(conn, new StatementBuilder()
//             .append("INSERT INTO TM3_ID (tableName, nextId) VALUES (?, LAST_INSERT_ID(1)+?)")
//             .addValues(tableName, count)
//             .append(" ON DUPLICATE KEY UPDATE nextId=LAST_INSERT_ID(nextId)+?")
//             .addValue(count)
//         );
//         
//         return SQLUtil.getLastInsertId(conn);
//     }
// }
// 
// Path: src/main/java/com/globalsight/ling/tm3/core/persistence/StatementBuilder.java
// public class StatementBuilder extends AbstractStatementBuilder {
//     private List<Object> args = new ArrayList<Object>();
//     
//     public StatementBuilder() { 
//         super();
//     }
//     
//     public StatementBuilder(CharSequence s) {
//         super(s);
//     }
//     
//     public StatementBuilder(CharSequence s, Object...args) {
//         super(s);
//         addValues(args);
//     }
//     
//     public StatementBuilder append(CharSequence s) {
//         super.append(s);
//         return this;
//     }
//     
//     public StatementBuilder append(StatementBuilder builder) {
//         super.append(builder.getBuffer());
//         args.addAll(builder.args);
//         return this;
//     }
//     
//     public StatementBuilder addValue(Object o) {
//         args.add(o);
//         return this;
//     }
//     
//     public StatementBuilder addValues(Object...os) {
//         args.addAll(Arrays.asList(os));
//         return this;
//     }
//     
//     /**
//      * Create a PreparedStatement with all attached values inserted.
//      */
//     public PreparedStatement toPreparedStatement(Connection conn) 
//             throws SQLException {
//         PreparedStatement ps = conn.prepareStatement(getBuffer().toString());
//         int index = 1;
//         for (Object o : args) {
//             ps.setObject(index++, o);
//         }
//         this.setStatement(ps);
//         return ps;
//     }
//     
//     @Override
//     public String toString() {
//         StringBuilder s = new StringBuilder();
//         s.append("Statement[")
//          .append(getBuffer())
//          .append(", values=(");
//         for (int i = 0; i < args.size(); i++) {
//             if (i > 0) s.append(", ");
//             s.append(args.get(i));
//         }
//         s.append(")]");
//         return s.toString();
//     }
// }


// Path: src/main/java/com/globalsight/ling/tm3/core/StorageInfo.java
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Set;
import java.util.HashSet;
import java.util.Map;
import org.hibernate.Session;
import com.globalsight.ling.tm3.core.persistence.DistributedId;
import com.globalsight.ling.tm3.core.persistence.StatementBuilder;

        if (tuIds == null) {
            tuIds = new DistributedId(getTuTableName());
        }
        return tuIds;
    }

    protected DistributedId getTuvIds() {
        if (tuvIds == null) {
            tuvIds = new DistributedId(getTuvTableName());
        }
        return tuvIds;
    }

    // XXX Should this use its own connection?
    long getTuId(Connection conn) throws SQLException {
        return getTuIds().getId(conn);
    }
    
    long getTuvId(Connection conn) throws SQLException {
        return getTuvIds().getId(conn);
    }
    
    /**
     * Add a set of INNER JOIN clauses to filter a statement
     * by an arbitrary number of attributes.
     * @param sb
     * @param tuAlias alias of the TU table to join against
     * @param attrs
     * @return 
     */
    StatementBuilder attributeJoinFilter(StatementBuilder sb,