func (this *builder) buildScan(keyspace datastore.Keyspace, node *algebra.KeyspaceTerm, limit expression.Expression) ( secondary plan.Operator, primary *plan.PrimaryScan, err error) { var indexes, hintIndexes, otherIndexes []datastore.Index hints := node.Indexes() if hints != nil { indexes, err = allHints(keyspace, hints) hintIndexes = indexes } else { indexes, err = allIndexes(keyspace) otherIndexes = indexes } if err != nil { return } pred := this.where if pred != nil { dnf := NewDNF() pred = pred.Copy() pred, err = dnf.Map(pred) if err != nil { return } formalizer := expression.NewFormalizer() formalizer.Keyspace = node.Alias() primaryKey := expression.Expressions{ expression.NewField( expression.NewMeta(expression.NewConstant(node.Alias())), expression.NewFieldName("id", false)), } sargables, er := sargableIndexes(indexes, pred, primaryKey, dnf, formalizer) if er != nil { return nil, nil, er } minimals, er := minimalIndexes(sargables, pred) if er != nil { return nil, nil, er } if len(minimals) > 0 { secondary, err = this.buildSecondaryScan(minimals, node, limit) return secondary, nil, err } } primary, err = this.buildPrimaryScan(keyspace, node, limit, hintIndexes, otherIndexes) return nil, primary, err }