public RoutingHandlerImpl(Database database) { this.database = database; this.trc = new RoutingCalculatorImpl(); }
@Override public String toString() { return "ObjectNode [shardName=" + shardName + ", objectName=" + getCompositeObjectName() + "]"; }
private RoutingResult fixedRoutingResult(ObjectNode... tableNode) { RoutingResult result = RoutingResult.fixedResult(tableNode); return result; }
private void validateGroupNodeItem(GroupObjectNode node) { Set<String> catalog = New.hashSet(); Set<String> schema = New.hashSet(); for (ObjectNode objectNode : node.getItems()) { catalog.add(objectNode.getCatalog()); schema.add(objectNode.getSchema()); } if (catalog.size() > 1) { throw new IllegalStateException("Inconsistent object node catalog " + catalog); } if (schema.size() > 1) { throw new IllegalStateException("Inconsistent object node schema " + schema); } node.setCatalog(catalog.iterator().next()); node.setSchema(schema.iterator().next()); }
@Override public RoutingResult calculate(ShardedTableRule tableRouter, List<RoutingArgument> arguments) { ObjectNode[] partition = tableRouter.getObjectNodes(); Object partitioner = tableRouter.getPartitioner(); boolean typeof = partitioner instanceof MultColumnPartitioner; if (!typeof) { String name = partitioner.getClass().getName(); throw new RuleEvaluateException("Algorithm " + name + " can't supported multiple rule column."); } MultColumnPartitioner cp = (MultColumnPartitioner) partitioner; Integer[] position = cp.partition(arguments); checkReturnValue(tableRouter, position); List<ObjectNode> selected = New.arrayList(); for (Integer integer : position) { ObjectNode tableNode = partition[integer]; selected.add(tableNode); } return RoutingResult.fixedResult(selected); }
@Override public void initialize(ObjectNode[] tableNodes) { for (int i = 0; i < tableNodes.length; i++) { indexMapping.put(tableNodes[i], i); } RoutingResult fixedResult = RoutingResult.fixedResult(tableNodes); this.group = fixedResult.group(); forShard = new ModePartitioner(); forShard.initialize(new ObjectNode[dbCount]); forTable = new ModePartitioner(); forTable.initialize(new ObjectNode[tblCount]); }
/** * @param value */ protected boolean checkNull(Value value) { if (isNull(value)) { if (getDefaultNodeIndex() == -1) { throw new RuleEvaluateException( "No default node defined when no rule column value from SQL"); } return true; } else { return false; } }
public static RoutingResult fixedResult(List<ObjectNode> nodes) { return new RoutingResult(nodes, nodes); }
public boolean isNodeComparable(TableRule o) { if(o.getClass() == TableRule.class) { return metadataNode.getShardName().equals(o.metadataNode.getShardName()); } return false; }
public ObjectNode getSingleResult() { if (isMultipleNode()) { throw new IllegalStateException("The RoutingResult has multiple table node."); } return selected.get(0); }
@Override public int compareTo(RoutingResult o) { Set<String> shards1 = shardNames(); Set<String> shards2 = o.shardNames(); int len1 = shards1.size(); int len2 = shards2.size(); if(len1 == len2) { len1 = selected.size(); len2 = o.selected.size(); } return len1 - len2; }
protected String buildInsertQuery() { StringBuilder sql = new StringBuilder(); sql.append("INSERT INTO ").append(tableNode.getCompositeObjectName()).append(" (").append(nameColumnName) .append(", ").append(valueColumnName).append(") ").append("VALUES (?, ?)"); return sql.toString(); }
public RoutingResult getBroadcastsRoutingResult() { return RoutingResult.fixedResult(broadcasts); }
public static RoutingResult fixedResult(ObjectNode ... tableNode) { List<ObjectNode> nodes = Arrays.asList(tableNode); return new RoutingResult(nodes, nodes); }
private Set<String> shardNames() { Set<String> shards = New.linkedHashSet(); for (ObjectNode tableNode : selected) { String shardName = tableNode.getShardName(); shards.add(shardName); } return shards; }
protected String buildSelectQuery() { StringBuilder sql = new StringBuilder(); sql.append("SELECT ").append(valueColumnName).append(" FROM ").append(tableNode.getCompositeObjectName()) .append(" WHERE ").append(nameColumnName).append(" = ?"); return sql.toString(); }
public RoutingResult getRandomRoutingResult() { ObjectNode select = randomMetadataNode(); return RoutingResult.fixedResult(select); }
public static RoutingResult emptyResult() { List<ObjectNode> nodes = New.arrayList(0); return new RoutingResult(nodes, nodes); }
protected String buildUpdateQuery() { StringBuilder sql = new StringBuilder(); sql.append("UPDATE ").append(tableNode.getCompositeObjectName()).append(" SET ").append(valueColumnName) .append(" = ?").append(" WHERE ").append(valueColumnName).append(" = ? and ").append(nameColumnName) .append(" = ?"); return sql.toString(); }
protected String buildCreateQuery() { StringBuilder sql = new StringBuilder(); sql.append("CREATE TABLE ").append(tableNode.getCompositeObjectName()).append(" ( ").append(nameColumnName) .append(" ").append(DataType.getDataType(Value.STRING).name).append('(').append(nameColumnLength) .append(") NOT NULL, ").append(valueColumnName).append(" ") .append(DataType.getDataType(Value.LONG).name).append(", PRIMARY KEY ( ").append(nameColumnName) .append(" ))"); return sql.toString(); }