func (e *XSelectIndexExec) doIndexRequest() (*xapi.SelectResult, error) { txn, err := e.ctx.GetTxn(false) if err != nil { return nil, errors.Trace(err) } selIdxReq := new(tipb.SelectRequest) startTs := txn.StartTS() selIdxReq.StartTs = &startTs selIdxReq.IndexInfo = xapi.IndexToProto(e.table.Meta(), e.indexPlan.Index) if len(e.indexPlan.FilterConditions) == 0 { // Push limit to index request only if there is not filter conditions. selIdxReq.Limit = e.indexPlan.LimitCount } if e.indexPlan.Desc { selIdxReq.OrderBy = append(selIdxReq.OrderBy, &tipb.ByItem{Desc: &e.indexPlan.Desc}) } fieldTypes := make([]*types.FieldType, len(e.indexPlan.Index.Columns)) for i, v := range e.indexPlan.Index.Columns { fieldTypes[i] = &(e.table.Cols()[v.Offset].FieldType) } selIdxReq.Ranges, err = indexRangesToPBRanges(e.indexPlan.Ranges, fieldTypes) if err != nil { return nil, errors.Trace(err) } concurrency := 1 if e.indexPlan.OutOfOrder { concurrency = 10 } return xapi.Select(txn.GetClient(), selIdxReq, concurrency) }
func (e *XSelectIndexExec) doIndexRequest() (xapi.SelectResult, error) { selIdxReq := new(tipb.SelectRequest) selIdxReq.StartTs = e.txn.StartTS() selIdxReq.IndexInfo = xapi.IndexToProto(e.table.Meta(), e.indexPlan.Index) if e.indexPlan.Desc { selIdxReq.OrderBy = append(selIdxReq.OrderBy, &tipb.ByItem{Desc: e.indexPlan.Desc}) } fieldTypes := make([]*types.FieldType, len(e.indexPlan.Index.Columns)) for i, v := range e.indexPlan.Index.Columns { fieldTypes[i] = &(e.table.Cols()[v.Offset].FieldType) } if !e.indexPlan.DoubleRead || e.where == nil { // TODO: when where condition is all index columns limit can be pushed too. selIdxReq.Limit = e.indexPlan.LimitCount } concurrency := 1 if !e.indexPlan.DoubleRead { concurrency = defaultConcurrency selIdxReq.Aggregates = e.aggFuncs selIdxReq.GroupBy = e.byItems selIdxReq.Where = e.where } else if e.indexPlan.OutOfOrder { concurrency = defaultConcurrency } keyRanges, err := indexRangesToKVRanges(e.table.Meta().ID, e.indexPlan.Index.ID, e.indexPlan.Ranges, fieldTypes) if err != nil { return nil, errors.Trace(err) } return xapi.Select(e.txn.GetClient(), selIdxReq, keyRanges, concurrency, !e.indexPlan.OutOfOrder) }