@@ -28,7 +28,7 @@ import (
28
28
// see Model.Where.
29
29
func (m * Model ) All (where ... interface {}) (Result , error ) {
30
30
var ctx = m .GetCtx ()
31
- return m .doGetAll (ctx , false , where ... )
31
+ return m .doGetAll (ctx , SelectTypeDefault , false , where ... )
32
32
}
33
33
34
34
// AllAndCount retrieves all records and the total count of records from the model.
@@ -69,7 +69,7 @@ func (m *Model) AllAndCount(useFieldForCount bool) (result Result, totalCount in
69
69
}
70
70
71
71
// Retrieve all records
72
- result , err = m .doGetAll (m .GetCtx (), false )
72
+ result , err = m .doGetAll (m .GetCtx (), SelectTypeDefault , false )
73
73
return
74
74
}
75
75
@@ -110,7 +110,7 @@ func (m *Model) One(where ...interface{}) (Record, error) {
110
110
if len (where ) > 0 {
111
111
return m .Where (where [0 ], where [1 :]... ).One ()
112
112
}
113
- all , err := m .doGetAll (ctx , true )
113
+ all , err := m .doGetAll (ctx , SelectTypeDefault , true )
114
114
if err != nil {
115
115
return nil , err
116
116
}
@@ -136,24 +136,41 @@ func (m *Model) Array(fieldsAndWhere ...interface{}) ([]Value, error) {
136
136
return m .Fields (gconv .String (fieldsAndWhere [0 ])).Array ()
137
137
}
138
138
}
139
- all , err := m .All ()
139
+
140
+ var (
141
+ field string
142
+ core = m .db .GetCore ()
143
+ ctx = core .injectInternalColumn (m .GetCtx ())
144
+ )
145
+ all , err := m .doGetAll (ctx , SelectTypeArray , false )
140
146
if err != nil {
141
147
return nil , err
142
148
}
143
- var field string
144
149
if len (all ) > 0 {
145
- var recordFields = m .getRecordFields (all [0 ])
146
- if len (recordFields ) > 1 {
147
- // it returns error if there are multiple fields in the result record.
148
- return nil , gerror .NewCodef (
149
- gcode .CodeInvalidParameter ,
150
- `invalid fields for "Array" operation, result fields number "%d"%s, but expect one` ,
151
- len (recordFields ),
152
- gjson .MustEncodeString (recordFields ),
150
+ internalData := core .getInternalColumnFromCtx (ctx )
151
+ if internalData == nil {
152
+ return nil , gerror .NewCode (
153
+ gcode .CodeInternalError ,
154
+ `query count error: the internal context data is missing. there's internal issue should be fixed` ,
153
155
)
154
156
}
155
- if len (recordFields ) == 1 {
156
- field = recordFields [0 ]
157
+ // If FirstResultColumn present, it returns the value of the first record of the first field.
158
+ // It means it use no cache mechanism, while cache mechanism makes `internalData` missing.
159
+ field = internalData .FirstResultColumn
160
+ if field == "" {
161
+ // Fields number check.
162
+ var recordFields = m .getRecordFields (all [0 ])
163
+ if len (recordFields ) == 1 {
164
+ field = recordFields [0 ]
165
+ } else {
166
+ // it returns error if there are multiple fields in the result record.
167
+ return nil , gerror .NewCodef (
168
+ gcode .CodeInvalidParameter ,
169
+ `invalid fields for "Array" operation, result fields number "%d"%s, but expect one` ,
170
+ len (recordFields ),
171
+ gjson .MustEncodeString (recordFields ),
172
+ )
173
+ }
157
174
}
158
175
}
159
176
return all .Array (field ), nil
@@ -398,13 +415,26 @@ func (m *Model) Value(fieldsAndWhere ...interface{}) (Value, error) {
398
415
}
399
416
}
400
417
var (
401
- sqlWithHolder , holderArgs = m .getFormattedSqlAndArgs (ctx , queryTypeValue , true )
402
- all , err = m .doGetAllBySql (ctx , queryTypeValue , sqlWithHolder , holderArgs ... )
418
+ sqlWithHolder , holderArgs = m .getFormattedSqlAndArgs (ctx , SelectTypeValue , true )
419
+ all , err = m .doGetAllBySql (ctx , SelectTypeValue , sqlWithHolder , holderArgs ... )
403
420
)
404
421
if err != nil {
405
422
return nil , err
406
423
}
407
424
if len (all ) > 0 {
425
+ internalData := core .getInternalColumnFromCtx (ctx )
426
+ if internalData == nil {
427
+ return nil , gerror .NewCode (
428
+ gcode .CodeInternalError ,
429
+ `query count error: the internal context data is missing. there's internal issue should be fixed` ,
430
+ )
431
+ }
432
+ // If FirstResultColumn present, it returns the value of the first record of the first field.
433
+ // It means it use no cache mechanism, while cache mechanism makes `internalData` missing.
434
+ if v , ok := all [0 ][internalData .FirstResultColumn ]; ok {
435
+ return v , nil
436
+ }
437
+ // Fields number check.
408
438
var recordFields = m .getRecordFields (all [0 ])
409
439
if len (recordFields ) == 1 {
410
440
for _ , v := range all [0 ] {
@@ -445,13 +475,26 @@ func (m *Model) Count(where ...interface{}) (int, error) {
445
475
return m .Where (where [0 ], where [1 :]... ).Count ()
446
476
}
447
477
var (
448
- sqlWithHolder , holderArgs = m .getFormattedSqlAndArgs (ctx , queryTypeCount , false )
449
- all , err = m .doGetAllBySql (ctx , queryTypeCount , sqlWithHolder , holderArgs ... )
478
+ sqlWithHolder , holderArgs = m .getFormattedSqlAndArgs (ctx , SelectTypeCount , false )
479
+ all , err = m .doGetAllBySql (ctx , SelectTypeCount , sqlWithHolder , holderArgs ... )
450
480
)
451
481
if err != nil {
452
482
return 0 , err
453
483
}
454
484
if len (all ) > 0 {
485
+ internalData := core .getInternalColumnFromCtx (ctx )
486
+ if internalData == nil {
487
+ return 0 , gerror .NewCode (
488
+ gcode .CodeInternalError ,
489
+ `query count error: the internal context data is missing. there's internal issue should be fixed` ,
490
+ )
491
+ }
492
+ // If FirstResultColumn present, it returns the value of the first record of the first field.
493
+ // It means it use no cache mechanism, while cache mechanism makes `internalData` missing.
494
+ if v , ok := all [0 ][internalData .FirstResultColumn ]; ok {
495
+ return v .Int (), nil
496
+ }
497
+ // Fields number check.
455
498
var recordFields = m .getRecordFields (all [0 ])
456
499
if len (recordFields ) == 1 {
457
500
for _ , v := range all [0 ] {
@@ -616,17 +659,17 @@ func (m *Model) Having(having interface{}, args ...interface{}) *Model {
616
659
// The parameter `limit1` specifies whether limits querying only one record if m.limit is not set.
617
660
// The optional parameter `where` is the same as the parameter of Model.Where function,
618
661
// see Model.Where.
619
- func (m * Model ) doGetAll (ctx context.Context , limit1 bool , where ... interface {}) (Result , error ) {
662
+ func (m * Model ) doGetAll (ctx context.Context , selectType SelectType , limit1 bool , where ... interface {}) (Result , error ) {
620
663
if len (where ) > 0 {
621
664
return m .Where (where [0 ], where [1 :]... ).All ()
622
665
}
623
- sqlWithHolder , holderArgs := m .getFormattedSqlAndArgs (ctx , queryTypeNormal , limit1 )
624
- return m .doGetAllBySql (ctx , queryTypeNormal , sqlWithHolder , holderArgs ... )
666
+ sqlWithHolder , holderArgs := m .getFormattedSqlAndArgs (ctx , selectType , limit1 )
667
+ return m .doGetAllBySql (ctx , selectType , sqlWithHolder , holderArgs ... )
625
668
}
626
669
627
670
// doGetAllBySql does the select statement on the database.
628
671
func (m * Model ) doGetAllBySql (
629
- ctx context.Context , queryType queryType , sql string , args ... interface {},
672
+ ctx context.Context , selectType SelectType , sql string , args ... interface {},
630
673
) (result Result , err error ) {
631
674
if result , err = m .getSelectResultFromCache (ctx , sql , args ... ); err != nil || result != nil {
632
675
return
@@ -639,24 +682,25 @@ func (m *Model) doGetAllBySql(
639
682
},
640
683
handler : m .hookHandler .Select ,
641
684
},
642
- Model : m ,
643
- Table : m .tables ,
644
- Sql : sql ,
645
- Args : m .mergeArguments (args ),
685
+ Model : m ,
686
+ Table : m .tables ,
687
+ Sql : sql ,
688
+ Args : m .mergeArguments (args ),
689
+ SelectType : selectType ,
646
690
}
647
691
if result , err = in .Next (ctx ); err != nil {
648
692
return
649
693
}
650
694
651
- err = m .saveSelectResultToCache (ctx , queryType , result , sql , args ... )
695
+ err = m .saveSelectResultToCache (ctx , selectType , result , sql , args ... )
652
696
return
653
697
}
654
698
655
699
func (m * Model ) getFormattedSqlAndArgs (
656
- ctx context.Context , queryType queryType , limit1 bool ,
700
+ ctx context.Context , selectType SelectType , limit1 bool ,
657
701
) (sqlWithHolder string , holderArgs []interface {}) {
658
- switch queryType {
659
- case queryTypeCount :
702
+ switch selectType {
703
+ case SelectTypeCount :
660
704
queryFields := "COUNT(1)"
661
705
if len (m .fields ) > 0 {
662
706
// DO NOT quote the m.fields here, in case of fields like:
@@ -698,7 +742,7 @@ func (m *Model) getFormattedSqlAndArgs(
698
742
699
743
func (m * Model ) getHolderAndArgsAsSubModel (ctx context.Context ) (holder string , args []interface {}) {
700
744
holder , args = m .getFormattedSqlAndArgs (
701
- ctx , queryTypeNormal , false ,
745
+ ctx , SelectTypeDefault , false ,
702
746
)
703
747
args = m .mergeArguments (args )
704
748
return
0 commit comments