// newV3ResolverFromTableDefinition returns a keyspaceIDResolver for a v3 table. func newV3ResolverFromTableDefinition(keyspaceSchema *vindexes.KeyspaceSchema, td *tabletmanagerdatapb.TableDefinition) (keyspaceIDResolver, error) { if td.Type != tmutils.TableBaseTable { return nil, fmt.Errorf("a keyspaceID resolver can only be created for a base table, got %v", td.Type) } tableSchema, ok := keyspaceSchema.Tables[td.Name] if !ok { return nil, fmt.Errorf("no vschema definition for table %v", td.Name) } // the primary vindex is most likely the sharding key, and has to // be unique. if len(tableSchema.ColumnVindexes) == 0 { return nil, fmt.Errorf("no vindex definition for table %v", td.Name) } colVindex := tableSchema.ColumnVindexes[0] if colVindex.Vindex.Cost() > 1 { return nil, fmt.Errorf("primary vindex cost is too high for table %v", td.Name) } unique, ok := colVindex.Vindex.(vindexes.Unique) if !ok { return nil, fmt.Errorf("primary vindex is not unique for table %v", td.Name) } // Find the sharding key column index. columnIndex, ok := tmutils.TableDefinitionGetColumn(td, colVindex.Column.Original()) if !ok { return nil, fmt.Errorf("table %v has a Vindex on unknown column %v", td.Name, colVindex.Column) } return &v3Resolver{ shardingColumnIndex: columnIndex, vindex: unique, }, nil }
// newV2Resolver returns a keyspaceIDResolver for a v2 table. // V2 keyspaces have a preset sharding column name and type. func newV2Resolver(keyspaceInfo *topo.KeyspaceInfo, td *tabletmanagerdatapb.TableDefinition) (keyspaceIDResolver, error) { if keyspaceInfo.ShardingColumnName == "" { return nil, errors.New("ShardingColumnName needs to be set for a v2 sharding key") } if keyspaceInfo.ShardingColumnType == topodatapb.KeyspaceIdType_UNSET { return nil, errors.New("ShardingColumnType needs to be set for a v2 sharding key") } if td.Type != tmutils.TableBaseTable { return nil, fmt.Errorf("a keyspaceID resolver can only be created for a base table, got %v", td.Type) } // Find the sharding key column index. columnIndex, ok := tmutils.TableDefinitionGetColumn(td, keyspaceInfo.ShardingColumnName) if !ok { return nil, fmt.Errorf("table %v doesn't have a column named '%v'", td.Name, keyspaceInfo.ShardingColumnName) } return &v2Resolver{keyspaceInfo, columnIndex}, nil }