Skip to content
This repository was archived by the owner on Nov 4, 2024. It is now read-only.

Commit 34afe09

Browse files
authored
Merge pull request #34 from neuronlabs/develop
Release v0.8.0
2 parents 7d5cef8 + 471c7a0 commit 34afe09

28 files changed

+513
-707
lines changed

config/processor.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ func DefaultProcessorConfig() map[string]interface{} {
8181
internal.ProcessFillEmptyFieldset,
8282
internal.ProcessConvertRelationFiltersSafe,
8383
internal.ProcessHookBeforeGet,
84+
internal.ProcessDeletedAtFilter,
8485
internal.ProcessCheckPagination,
8586
internal.ProcessConvertRelationFiltersSafe,
8687
internal.ProcessGet,
@@ -93,6 +94,7 @@ func DefaultProcessorConfig() map[string]interface{} {
9394
internal.ProcessFillEmptyFieldset,
9495
internal.ProcessConvertRelationFiltersSafe,
9596
internal.ProcessHookBeforeList,
97+
internal.ProcessDeletedAtFilter,
9698
internal.ProcessCheckPagination,
9799
internal.ProcessConvertRelationFiltersSafe,
98100
internal.ProcessList,
@@ -104,6 +106,7 @@ func DefaultProcessorConfig() map[string]interface{} {
104106
internal.ProcessTxBegin,
105107
internal.ProcessReducePrimaryFilters,
106108
internal.ProcessHookBeforePatch,
109+
internal.ProcessDeletedAtFilter,
107110
internal.ProcessReducePrimaryFilters,
108111
internal.ProcessPatchBelongsToRelations,
109112
internal.ProcessPatch,
@@ -124,6 +127,7 @@ func DefaultProcessorConfig() map[string]interface{} {
124127
"count_processes": []string{
125128
internal.ProcessConvertRelationFiltersSafe,
126129
internal.ProcessHookBeforeCount,
130+
internal.ProcessDeletedAtFilter,
127131
internal.ProcessCount,
128132
internal.ProcessHookAfterCount,
129133
},
@@ -148,6 +152,7 @@ func ThreadSafeProcessor() *Processor {
148152
internal.ProcessFillEmptyFieldset,
149153
internal.ProcessConvertRelationFiltersSafe,
150154
internal.ProcessHookBeforeGet,
155+
internal.ProcessDeletedAtFilter,
151156
internal.ProcessConvertRelationFiltersSafe,
152157
internal.ProcessGet,
153158
internal.ProcessGetForeignRelations,
@@ -159,6 +164,7 @@ func ThreadSafeProcessor() *Processor {
159164
internal.ProcessFillEmptyFieldset,
160165
internal.ProcessConvertRelationFiltersSafe,
161166
internal.ProcessHookBeforeList,
167+
internal.ProcessDeletedAtFilter,
162168
internal.ProcessCheckPagination,
163169
internal.ProcessConvertRelationFiltersSafe,
164170
internal.ProcessList,
@@ -170,6 +176,7 @@ func ThreadSafeProcessor() *Processor {
170176
internal.ProcessTxBegin,
171177
internal.ProcessReducePrimaryFilters,
172178
internal.ProcessHookBeforePatch,
179+
internal.ProcessDeletedAtFilter,
173180
internal.ProcessReducePrimaryFilters,
174181
internal.ProcessPatchBelongsToRelations,
175182
internal.ProcessPatch,
@@ -190,6 +197,7 @@ func ThreadSafeProcessor() *Processor {
190197
CountProcesses: ProcessList{
191198
internal.ProcessConvertRelationFiltersSafe,
192199
internal.ProcessHookBeforeCount,
200+
internal.ProcessDeletedAtFilter,
193201
internal.ProcessCount,
194202
internal.ProcessHookAfterCount,
195203
},
@@ -215,6 +223,7 @@ func ConcurrentProcessor() *Processor {
215223
internal.ProcessFillEmptyFieldset,
216224
internal.ProcessConvertRelationFilters,
217225
internal.ProcessHookBeforeGet,
226+
internal.ProcessDeletedAtFilter,
218227
internal.ProcessCheckPagination,
219228
internal.ProcessConvertRelationFilters,
220229
internal.ProcessGet,
@@ -226,6 +235,7 @@ func ConcurrentProcessor() *Processor {
226235
internal.ProcessFillEmptyFieldset,
227236
internal.ProcessConvertRelationFilters,
228237
internal.ProcessHookBeforeList,
238+
internal.ProcessDeletedAtFilter,
229239
internal.ProcessCheckPagination,
230240
internal.ProcessConvertRelationFilters,
231241
internal.ProcessList,
@@ -237,6 +247,7 @@ func ConcurrentProcessor() *Processor {
237247
internal.ProcessTxBegin,
238248
internal.ProcessReducePrimaryFilters,
239249
internal.ProcessHookBeforePatch,
250+
internal.ProcessDeletedAtFilter,
240251
internal.ProcessReducePrimaryFilters,
241252
internal.ProcessPatchBelongsToRelations,
242253
internal.ProcessPatch,
@@ -257,6 +268,7 @@ func ConcurrentProcessor() *Processor {
257268
CountProcesses: ProcessList{
258269
internal.ProcessConvertRelationFilters,
259270
internal.ProcessHookBeforeCount,
271+
internal.ProcessDeletedAtFilter,
260272
internal.ProcessCount,
261273
internal.ProcessHookAfterCount,
262274
},
@@ -282,6 +294,7 @@ func DefaultConcurrentProcessorConfig() map[string]interface{} {
282294
internal.ProcessFillEmptyFieldset,
283295
internal.ProcessConvertRelationFilters,
284296
internal.ProcessHookBeforeGet,
297+
internal.ProcessDeletedAtFilter,
285298
internal.ProcessCheckPagination,
286299
internal.ProcessConvertRelationFilters,
287300
internal.ProcessGet,
@@ -292,6 +305,7 @@ func DefaultConcurrentProcessorConfig() map[string]interface{} {
292305
internal.ProcessFillEmptyFieldset,
293306
internal.ProcessConvertRelationFilters,
294307
internal.ProcessHookBeforeList,
308+
internal.ProcessDeletedAtFilter,
295309
internal.ProcessCheckPagination,
296310
internal.ProcessConvertRelationFilters,
297311
internal.ProcessList,
@@ -303,6 +317,7 @@ func DefaultConcurrentProcessorConfig() map[string]interface{} {
303317
internal.ProcessTxBegin,
304318
internal.ProcessReducePrimaryFilters,
305319
internal.ProcessHookBeforePatch,
320+
internal.ProcessDeletedAtFilter,
306321
internal.ProcessReducePrimaryFilters,
307322
internal.ProcessPatchBelongsToRelations,
308323
internal.ProcessPatch,
@@ -323,6 +338,7 @@ func DefaultConcurrentProcessorConfig() map[string]interface{} {
323338
"count_processes": []string{
324339
internal.ProcessConvertRelationFilters,
325340
internal.ProcessHookBeforeCount,
341+
internal.ProcessDeletedAtFilter,
326342
internal.ProcessCount,
327343
internal.ProcessHookAfterCount,
328344
},

doc.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
// Package ncore is the cloud-native, distributed ORM implementation.
2-
// It's design allows to use the separate repository
3-
// for each model, with a possiblity to have different
4-
// relationships types between them.
5-
// It consits the following packages:
2+
//
3+
// It's design allows to use the separate repository for each model, with a possiblity
4+
// to have different relationships types between them.
5+
//
6+
// Neuron-core consists of following packages:
67
// - ncore - (Neuron Core) the root package that gives easy access to all subpackages.
78
// - common - contains common variables and constants for neuron derivates.
8-
// - controller - is the neuron's core, that registers and stores the models and
9-
// contains configurations required by other packages.
9+
// - controller - is the neuron's core, that registers and stores the models and
10+
// contains configurations required by other packages.
1011
// - config - contains the configurations for all packages.
11-
// - query - used to query the model's repositories.
12+
// - query - used to create queries, filters, sorts, paginations on base of mapped models.
1213
// - mapping - contains the information about the mapped models their fields and settings.
1314
// - class - contains errors classification system for the neuron packages.
1415
// - log - is the logging interface for the neuron based applications.
1516
// - i18n - is the neuron based application supported internationalization.
1617
// - repository - is a package used to store and register the repositories.
18+
//
1719
// It is also used to get the repository/factory per model. A modular design
1820
// allows to use and compile only required repositories.
1921
package ncore

internal/processes.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const (
1616

1717
// Get processes
1818
ProcessFillEmptyFieldset = "fill_empty_fieldset"
19+
ProcessDeletedAtFilter = "deleted_at_filter"
1920
ProcessConvertRelationFilters = "convert_relation_filters"
2021
ProcessConvertRelationFiltersSafe = "convert_relation_filters_safe"
2122
ProcessHookBeforeGet = "hook_before_get"

mapping/map.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,10 @@ func (m *ModelMap) RegisterModels(models ...interface{}) error {
170170
if err = m.setRelationships(); err != nil {
171171
return err
172172
}
173+
174+
for _, model := range m.models {
175+
model.structFieldCount = len(model.StructFields())
176+
}
173177
return nil
174178
}
175179

mapping/model-structs.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,11 @@ type ModelStruct struct {
3838
// filterKeys is a container for the filter keys
3939
filterKeys map[string]*StructField
4040
// sortScopeCount is the number of sortable fields in the model
41-
sortScopeCount int
42-
isJoin bool
43-
cfg *config.ModelConfig
44-
store map[interface{}]interface{}
41+
sortScopeCount int
42+
isJoin bool
43+
cfg *config.ModelConfig
44+
store map[interface{}]interface{}
45+
structFieldCount int
4546
}
4647

4748
// newModelStruct creates new model struct for given type.
@@ -103,9 +104,9 @@ func (m *ModelStruct) Config() *config.ModelConfig {
103104
func (m *ModelStruct) DeletedAt() (*StructField, bool) {
104105
field, ok := m.StoreGet(deletedAt)
105106
if ok {
106-
return field.(*StructField), ok
107+
return field.(*StructField), true
107108
}
108-
return nil, ok
109+
return nil, false
109110
}
110111

111112
// FieldByName returns field for provided name.
@@ -336,6 +337,11 @@ func (m *ModelStruct) StructFields() (fields []*StructField) {
336337
return fields
337338
}
338339

340+
// StructFieldCount returns the number of struct fields.
341+
func (m *ModelStruct) StructFieldCount() int {
342+
return m.structFieldCount
343+
}
344+
339345
// Type returns model's reflect.Type.
340346
func (m *ModelStruct) Type() reflect.Type {
341347
return m.modelType

query/const.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,18 @@ const (
2323
operatorEqualRaw = "$eq"
2424
operatorInRaw = "$in"
2525
operatorNotEqualRaw = "$ne"
26-
operatorNotInRaw = "$notin"
26+
operatorNotInRaw = "$not_in"
2727
operatorGreaterThanRaw = "$gt"
2828
operatorGreaterEqualRaw = "$ge"
2929
operatorLessThanRaw = "$lt"
3030
operatorLessEqualRaw = "$le"
31-
operatorIsNullRaw = "$isnull"
32-
operatorNotNullRaw = "$notnull"
31+
operatorIsNullRaw = "$is_null"
32+
operatorNotNullRaw = "$not_null"
3333
operatorExistsRaw = "$exists"
34-
operatorNotExistsRaw = "$notexists"
34+
operatorNotExistsRaw = "$not_exists"
3535
operatorContainsRaw = "$contains"
36-
operatorStartsWithRaw = "$startswith"
37-
operatorEndsWithRaw = "$endswith"
36+
operatorStartsWithRaw = "$starts_with"
37+
operatorEndsWithRaw = "$ends_with"
3838
)
3939

4040
// Processes constant names.
@@ -47,6 +47,7 @@ const (
4747
ProcessPatchForeignRelationsSafe = internal.ProcessPatchForeignRelationsSafe
4848
ProcessHookAfterCreate = internal.ProcessHookAfterCreate
4949

50+
ProcessDeletedAtFilter = internal.ProcessDeletedAtFilter
5051
ProcessFillEmptyFieldset = internal.ProcessFillEmptyFieldset
5152
ProcessConvertRelationFilters = internal.ProcessConvertRelationFilters
5253
ProcessConvertRelationFiltersSafe = internal.ProcessConvertRelationFiltersSafe

query/process-count.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
)
1212

1313
func countProcessFunc(ctx context.Context, s *Scope) error {
14-
if _, ok := s.StoreGet(processErrorKey); ok {
14+
if s.Error != nil {
1515
return nil
1616
}
1717

@@ -37,7 +37,7 @@ func countProcessFunc(ctx context.Context, s *Scope) error {
3737

3838
func beforeCountProcessFunc(ctx context.Context, s *Scope) error {
3939
var ok bool
40-
if _, ok = s.StoreGet(processErrorKey); ok {
40+
if s.Error != nil {
4141
return nil
4242
}
4343

@@ -60,7 +60,7 @@ func beforeCountProcessFunc(ctx context.Context, s *Scope) error {
6060

6161
func afterCountProcessFunc(ctx context.Context, s *Scope) error {
6262
var ok bool
63-
if _, ok = s.StoreGet(processErrorKey); ok {
63+
if s.Error != nil {
6464
return nil
6565
}
6666
if ok = s.Struct().IsAfterCounter(); !ok {

query/process-count_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ package query
22

33
import (
44
"context"
5-
"github.com/neuronlabs/errors"
6-
"github.com/neuronlabs/neuron-core/class"
75
"testing"
86

97
"github.com/stretchr/testify/assert"
108
"github.com/stretchr/testify/mock"
119
"github.com/stretchr/testify/require"
10+
11+
"github.com/neuronlabs/errors"
12+
13+
"github.com/neuronlabs/neuron-core/class"
1214
)
1315

1416
type countModel1 struct {

query/process-create.go

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
)
1515

1616
func createFunc(ctx context.Context, s *Scope) error {
17-
if _, ok := s.StoreGet(processErrorKey); ok {
17+
if s.Error != nil {
1818
return nil
1919
}
2020

@@ -33,24 +33,18 @@ func createFunc(ctx context.Context, s *Scope) error {
3333
createdAtField, ok := s.Struct().CreatedAt()
3434
if ok {
3535
// by default scope has auto selected fields setCreatedAt should be true
36-
setCreatedAt := s.autoSelectedFields
36+
setCreatedAt := s.autosetFields
3737
if !setCreatedAt {
38-
var found bool
38+
_, found := s.Fieldset[createdAtField.NeuronName()]
3939
// if the fields were not auto selected check if the field is selected by user
40-
for _, field := range s.SelectedFields {
41-
if createdAtField == field {
42-
found = true
43-
break
44-
}
45-
}
4640
setCreatedAt = !found
4741
}
4842

4943
if setCreatedAt {
5044
// Check if the value of the created at field is not already set by the user.
5145
v := reflect.ValueOf(s.Value).Elem().FieldByIndex(createdAtField.ReflectField().Index)
5246

53-
if s.autoSelectedFields {
47+
if s.autosetFields {
5448
setCreatedAt = reflect.DeepEqual(v.Interface(), reflect.Zero(createdAtField.ReflectField().Type).Interface())
5549
}
5650

@@ -63,7 +57,7 @@ func createFunc(ctx context.Context, s *Scope) error {
6357
v.Set(reflect.ValueOf(time.Now()))
6458
}
6559

66-
s.SelectedFields = append(s.SelectedFields, createdAtField)
60+
s.Fieldset[createdAtField.NeuronName()] = createdAtField
6761

6862
}
6963
}
@@ -79,7 +73,7 @@ func createFunc(ctx context.Context, s *Scope) error {
7973

8074
// beforeCreate is the function that is used before the create process
8175
func beforeCreateFunc(ctx context.Context, s *Scope) error {
82-
if _, ok := s.StoreGet(processErrorKey); ok {
76+
if s.Error != nil {
8377
return nil
8478
}
8579

@@ -99,7 +93,7 @@ func beforeCreateFunc(ctx context.Context, s *Scope) error {
9993
// afterCreate is the function that is used after the create process
10094
// It uses AfterCreateR hook if the model implements it.
10195
func afterCreateFunc(ctx context.Context, s *Scope) error {
102-
if _, ok := s.StoreGet(processErrorKey); ok {
96+
if s.Error != nil {
10397
return nil
10498
}
10599

@@ -116,7 +110,7 @@ func afterCreateFunc(ctx context.Context, s *Scope) error {
116110
}
117111

118112
func storeScopePrimaries(ctx context.Context, s *Scope) error {
119-
if _, ok := s.StoreGet(processErrorKey); ok {
113+
if s.Error != nil {
120114
return nil
121115
}
122116

0 commit comments

Comments
 (0)