// Helper function to perform a primary index scan on the given keyspace. Returns a map of // all primary key names. func doPrimaryIndexScan(t *testing.T, b datastore.Keyspace) (m map[string]bool, excp errors.Error) { conn := datastore.NewIndexConnection(&testingContext{t}) m = map[string]bool{} nitems, excp := b.Count() if excp != nil { t.Fatalf("failed to get keyspace count") return } indexers, excp := b.Indexers() if excp != nil { t.Fatalf("failed to retrieve indexers") return } pindexes, excp := indexers[0].PrimaryIndexes() if excp != nil || len(pindexes) < 1 { t.Fatalf("failed to retrieve primary indexes") return } idx := pindexes[0] go idx.ScanEntries("", nitems, datastore.UNBOUNDED, nil, conn) for { v, ok := <-conn.EntryChannel() if !ok { // Channel closed => Scan complete return } m[v.PrimaryKey] = true } }
func allIndexes(keyspace datastore.Keyspace) ([]datastore.Index, error) { indexers, err := keyspace.Indexers() if err != nil { return nil, err } indexes := make([]datastore.Index, 0, len(indexers)*16) for _, indexer := range indexers { idxes, err := indexer.Indexes() if err != nil { return nil, err } for _, idx := range idxes { state, _, er := idx.State() if er != nil { logging.Errorp("Index selection", logging.Pair{"error", er.Error()}) } if er != nil || state != datastore.ONLINE { continue } indexes = append(indexes, idx) } } return indexes, nil }
// Helper function to scan the primary index of given keyspace with given span func doIndexScan(t *testing.T, b datastore.Keyspace, span *datastore.Span) ( e []*datastore.IndexEntry, excp errors.Error) { conn := datastore.NewIndexConnection(&testingContext{t}) e = []*datastore.IndexEntry{} nitems, excp := b.Count() if excp != nil { t.Fatalf("failed to get keyspace count") return } indexers, excp := b.Indexers() if excp != nil { t.Fatalf("failed to retrieve indexers") return } idx, excp := indexers[0].IndexByName("#primary") if excp != nil { t.Fatalf("failed to retrieve primary index") return } go idx.Scan("", span, false, nitems, datastore.UNBOUNDED, nil, conn) for { entry, ok := <-conn.EntryChannel() if !ok { return } e = append(e, entry) } return }
func buildPrimaryIndex(keyspace datastore.Keyspace, hintIndexes, otherIndexes []datastore.Index) ( primary datastore.PrimaryIndex, err error) { ok := false // Prefer hints for _, index := range hintIndexes { if !index.IsPrimary() { continue } primary, ok = index.(datastore.PrimaryIndex) if ok { return } else { return nil, fmt.Errorf("Unable to cast primary index %s", index.Name()) } } // Consider other primary indexes if otherIndexes != nil { for _, index := range otherIndexes { if !index.IsPrimary() { continue } primary, ok = index.(datastore.PrimaryIndex) if ok { return } else { return nil, fmt.Errorf("Unable to cast primary index %s", index.Name()) } } } // Return first online primary index indexers, er := keyspace.Indexers() if er != nil { return nil, err } for _, indexer := range indexers { primaries, er := indexer.PrimaryIndexes() if er != nil { return nil, er } for _, primary = range primaries { state, _, er := primary.State() if er != nil { return nil, er } if state == datastore.ONLINE { return } } } if primary == nil { return nil, fmt.Errorf( "No primary index on keyspace %s. Use CREATE PRIMARY INDEX to create one.", keyspace.Name()) } return nil, fmt.Errorf("Primary index %s not online.", primary.Name()) }