in nimo-full-check/checker/document-checker.go [294:349]
func (dc *DocumentChecker) checkOutline() error {
// describe dynamodb table
out, err := dc.sourceConn.DescribeTable(&dynamodb.DescribeTableInput{
TableName: aws.String(dc.ns.Collection),
})
if err != nil {
return fmt.Errorf("describe table failed[%v]", err)
}
LOG.Info("describe table[%v] result: %v", dc.ns.Collection, out)
// 1. check total number
// dynamo count
dynamoCount := out.Table.ItemCount
// mongo count
cnt, err := dc.mongoClient.Client.Database(dc.ns.Database).Collection(dc.ns.Collection).CountDocuments(context.Background(), bson.M{})
if err != nil {
return fmt.Errorf("get mongo count failed[%v]", err)
}
if *dynamoCount != cnt {
// return fmt.Errorf("dynamo count[%v] != mongo count[%v]", *dynamoCount, cnt)
LOG.Warn("dynamo count[%v] != mongo count[%v]", *dynamoCount, cnt)
}
// set sampler
dc.sampler = NewSample(conf.Opts.Sample, cnt)
// 2. check index
// TODO
// parse index
// parse primary key with sort key
allIndexes := out.Table.AttributeDefinitions
primaryIndexes := out.Table.KeySchema
// parse index type
parseMap := shakeUtils.ParseIndexType(allIndexes)
primaryKey, sortKey, err := shakeUtils.ParsePrimaryAndSortKey(primaryIndexes, parseMap)
if err != nil {
return fmt.Errorf("parse primary and sort key failed[%v]", err)
}
dc.primaryKeyWithType = KeyUnion{
name: primaryKey,
tp: parseMap[primaryKey],
union: fmt.Sprintf("%s.%s", primaryKey, parseMap[primaryKey]),
}
dc.sortKeyWithType = KeyUnion{
name: sortKey,
tp: parseMap[sortKey],
union: fmt.Sprintf("%s.%s", sortKey, parseMap[sortKey]),
}
return nil
}