Skip to content

Commit 48b27de

Browse files
committed
revs
1 parent 7abdc72 commit 48b27de

File tree

15 files changed

+278
-147
lines changed

15 files changed

+278
-147
lines changed

api.go

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

1515
"github.com/dgraph-io/dgraph/v24/dql"
1616
"github.com/dgraph-io/dgraph/v24/schema"
17-
"github.com/hypermodeinc/modusdb/api/utils"
17+
"github.com/hypermodeinc/modusdb/internal/apiutils"
18+
"github.com/hypermodeinc/modusdb/internal/structreflect"
1819
)
1920

2021
func Create[T any](db *DB, object T, ns ...uint64) (uint64, T, error) {
@@ -67,7 +68,7 @@ func Upsert[T any](db *DB, object T, ns ...uint64) (uint64, T, bool, error) {
6768
return 0, object, false, err
6869
}
6970

70-
gid, cfKeyValue, err := utils.GetUniqueConstraint[T](object)
71+
gid, cfKeyValue, err := structreflect.GetUniqueConstraint[T](object)
7172
if err != nil {
7273
return 0, object, false, err
7374
}
@@ -93,7 +94,7 @@ func Upsert[T any](db *DB, object T, ns ...uint64) (uint64, T, bool, error) {
9394

9495
if gid != 0 || cf != nil {
9596
gid, err = getExistingObject[T](ctx, n, gid, cf, object)
96-
if err != nil && err != utils.ErrNoObjFound {
97+
if err != nil && err != apiutils.ErrNoObjFound {
9798
return 0, object, false, err
9899
}
99100
wasFound = err == nil

api_mutation_gen.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ import (
1919
"github.com/dgraph-io/dgraph/v24/protos/pb"
2020
"github.com/dgraph-io/dgraph/v24/schema"
2121
"github.com/dgraph-io/dgraph/v24/x"
22-
"github.com/hypermodeinc/modusdb/api/mutations"
23-
"github.com/hypermodeinc/modusdb/api/utils"
22+
"github.com/hypermodeinc/modusdb/internal/apiutils"
23+
"github.com/hypermodeinc/modusdb/internal/dgraphtypes"
24+
"github.com/hypermodeinc/modusdb/internal/mutations"
25+
"github.com/hypermodeinc/modusdb/internal/structreflect"
2426
)
2527

2628
func generateSetDqlMutationsAndSchema[T any](ctx context.Context, n *Namespace, object T,
@@ -30,11 +32,11 @@ func generateSetDqlMutationsAndSchema[T any](ctx context.Context, n *Namespace,
3032
return fmt.Errorf("expected struct, got %s", t.Kind())
3133
}
3234

33-
fieldToJsonTags, jsonToDbTags, jsonToReverseEdgeTags, err := utils.GetFieldTags(t)
35+
tagMaps, err := structreflect.GetFieldTags(t)
3436
if err != nil {
3537
return err
3638
}
37-
jsonTagToValue := utils.GetJsonTagToValues(object, fieldToJsonTags)
39+
jsonTagToValue := structreflect.GetJsonTagToValues(object, tagMaps.FieldToJson)
3840

3941
nquads := make([]*api.NQuad, 0)
4042
uniqueConstraintFound := false
@@ -43,8 +45,8 @@ func generateSetDqlMutationsAndSchema[T any](ctx context.Context, n *Namespace,
4345
reflectValueType := reflect.TypeOf(value)
4446
var nquad *api.NQuad
4547

46-
if jsonToReverseEdgeTags[jsonName] != "" {
47-
if err := mutations.HandleReverseEdge(jsonName, reflectValueType, n.ID(), sch, jsonToReverseEdgeTags); err != nil {
48+
if tagMaps.JsonToReverseEdge[jsonName] != "" {
49+
if err := mutations.HandleReverseEdge(jsonName, reflectValueType, n.ID(), sch, tagMaps.JsonToReverseEdge); err != nil {
4850
return err
4951
}
5052
continue
@@ -69,7 +71,7 @@ func generateSetDqlMutationsAndSchema[T any](ctx context.Context, n *Namespace,
6971
return err
7072
}
7173

72-
uniqueConstraintFound, err = utils.HandleConstraints(u, jsonToDbTags, jsonName, u.ValueType, uniqueConstraintFound)
74+
uniqueConstraintFound, err = dgraphtypes.HandleConstraints(u, tagMaps.JsonToDb, jsonName, u.ValueType, uniqueConstraintFound)
7375
if err != nil {
7476
return err
7577
}
@@ -78,15 +80,15 @@ func generateSetDqlMutationsAndSchema[T any](ctx context.Context, n *Namespace,
7880
nquads = append(nquads, nquad)
7981
}
8082
if !uniqueConstraintFound {
81-
return fmt.Errorf(utils.NoUniqueConstr, t.Name())
83+
return fmt.Errorf(apiutils.NoUniqueConstr, t.Name())
8284
}
8385

8486
sch.Types = append(sch.Types, &pb.TypeUpdate{
85-
TypeName: utils.AddNamespace(n.ID(), t.Name()),
87+
TypeName: apiutils.AddNamespace(n.ID(), t.Name()),
8688
Fields: sch.Preds,
8789
})
8890

89-
val, err := utils.ValueToApiVal(t.Name())
91+
val, err := dgraphtypes.ValueToApiVal(t.Name())
9092
if err != nil {
9193
return err
9294
}

api_mutation_helpers.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import (
1010
"github.com/dgraph-io/dgraph/v24/query"
1111
"github.com/dgraph-io/dgraph/v24/schema"
1212
"github.com/dgraph-io/dgraph/v24/worker"
13-
"github.com/hypermodeinc/modusdb/api/utils"
13+
"github.com/hypermodeinc/modusdb/internal/apiutils"
14+
"github.com/hypermodeinc/modusdb/internal/structreflect"
1415
)
1516

1617
func processStructValue(ctx context.Context, value any, n *Namespace) (any, error) {
@@ -38,7 +39,7 @@ func processPointerValue(ctx context.Context, value any, n *Namespace) (any, err
3839
}
3940

4041
func getUidOrMutate[T any](ctx context.Context, db *DB, n *Namespace, object T) (uint64, error) {
41-
gid, cfKeyValue, err := utils.GetUniqueConstraint[T](object)
42+
gid, cfKeyValue, err := structreflect.GetUniqueConstraint[T](object)
4243
if err != nil {
4344
return 0, err
4445
}
@@ -60,7 +61,7 @@ func getUidOrMutate[T any](ctx context.Context, db *DB, n *Namespace, object T)
6061
}
6162
if gid != 0 || cf != nil {
6263
gid, err = getExistingObject(ctx, n, gid, cf, object)
63-
if err != nil && err != utils.ErrNoObjFound {
64+
if err != nil && err != apiutils.ErrNoObjFound {
6465
return 0, err
6566
}
6667
if err == nil {

api_query_execution.go

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ import (
1515
"fmt"
1616
"reflect"
1717

18-
"github.com/hypermodeinc/modusdb/api/query_gen"
19-
"github.com/hypermodeinc/modusdb/api/utils"
18+
"github.com/hypermodeinc/modusdb/internal/apiutils"
19+
"github.com/hypermodeinc/modusdb/internal/querygen"
20+
"github.com/hypermodeinc/modusdb/internal/structreflect"
2021
)
2122

2223
func getByGid[T any](ctx context.Context, n *Namespace, gid uint64) (uint64, T, error) {
@@ -50,31 +51,31 @@ func executeGetWithObject[T any, R UniqueField](ctx context.Context, n *Namespac
5051
obj T, withReverse bool, args ...R) (uint64, T, error) {
5152
t := reflect.TypeOf(obj)
5253

53-
fieldToJsonTags, jsonToDbTag, jsonToReverseEdgeTags, err := utils.GetFieldTags(t)
54+
tagMaps, err := structreflect.GetFieldTags(t)
5455
if err != nil {
5556
return 0, obj, err
5657
}
5758
readFromQuery := ""
5859
if withReverse {
59-
for jsonTag, reverseEdgeTag := range jsonToReverseEdgeTags {
60-
readFromQuery += fmt.Sprintf(query_gen.ReverseEdgeQuery,
61-
utils.GetPredicateName(t.Name(), jsonTag), reverseEdgeTag)
60+
for jsonTag, reverseEdgeTag := range tagMaps.JsonToReverseEdge {
61+
readFromQuery += fmt.Sprintf(querygen.ReverseEdgeQuery,
62+
apiutils.GetPredicateName(t.Name(), jsonTag), reverseEdgeTag)
6263
}
6364
}
6465

6566
var cf ConstrainedField
6667
var query string
6768
gid, ok := any(args[0]).(uint64)
6869
if ok {
69-
query = query_gen.FormatObjQuery(query_gen.BuildUidQuery(gid), readFromQuery)
70+
query = querygen.FormatObjQuery(querygen.BuildUidQuery(gid), readFromQuery)
7071
} else if cf, ok = any(args[0]).(ConstrainedField); ok {
71-
query = query_gen.FormatObjQuery(query_gen.BuildEqQuery(utils.GetPredicateName(t.Name(),
72+
query = querygen.FormatObjQuery(querygen.BuildEqQuery(apiutils.GetPredicateName(t.Name(),
7273
cf.Key), cf.Value), readFromQuery)
7374
} else {
7475
return 0, obj, fmt.Errorf("invalid unique field type")
7576
}
7677

77-
if jsonToDbTag[cf.Key] != nil && jsonToDbTag[cf.Key].Constraint == "" {
78+
if tagMaps.JsonToDb[cf.Key] != nil && tagMaps.JsonToDb[cf.Key].Constraint == "" {
7879
return 0, obj, fmt.Errorf("constraint not defined for field %s", cf.Key)
7980
}
8081

@@ -83,7 +84,7 @@ func executeGetWithObject[T any, R UniqueField](ctx context.Context, n *Namespac
8384
return 0, obj, err
8485
}
8586

86-
dynamicType := utils.CreateDynamicStruct(t, fieldToJsonTags, 1)
87+
dynamicType := structreflect.CreateDynamicStruct(t, tagMaps.FieldToJson, 1)
8788

8889
dynamicInstance := reflect.New(dynamicType).Interface()
8990

@@ -100,22 +101,22 @@ func executeGetWithObject[T any, R UniqueField](ctx context.Context, n *Namespac
100101

101102
// Check if we have at least one object in the response
102103
if len(result.Obj) == 0 {
103-
return 0, obj, utils.ErrNoObjFound
104+
return 0, obj, apiutils.ErrNoObjFound
104105
}
105106

106-
return utils.ConvertDynamicToTyped[T](result.Obj[0], t)
107+
return structreflect.ConvertDynamicToTyped[T](result.Obj[0], t)
107108
}
108109

109110
func executeQuery[T any](ctx context.Context, n *Namespace, queryParams QueryParams,
110111
withReverse bool) ([]uint64, []T, error) {
111112
var obj T
112113
t := reflect.TypeOf(obj)
113-
fieldToJsonTags, _, jsonToReverseEdgeTags, err := utils.GetFieldTags(t)
114+
tagMaps, err := structreflect.GetFieldTags(t)
114115
if err != nil {
115116
return nil, nil, err
116117
}
117118

118-
var filterQueryFunc query_gen.QueryFunc = func() string {
119+
var filterQueryFunc querygen.QueryFunc = func() string {
119120
return ""
120121
}
121122
var paginationAndSorting string
@@ -135,19 +136,19 @@ func executeQuery[T any](ctx context.Context, n *Namespace, queryParams QueryPar
135136

136137
readFromQuery := ""
137138
if withReverse {
138-
for jsonTag, reverseEdgeTag := range jsonToReverseEdgeTags {
139-
readFromQuery += fmt.Sprintf(query_gen.ReverseEdgeQuery, utils.GetPredicateName(t.Name(), jsonTag), reverseEdgeTag)
139+
for jsonTag, reverseEdgeTag := range tagMaps.JsonToReverseEdge {
140+
readFromQuery += fmt.Sprintf(querygen.ReverseEdgeQuery, apiutils.GetPredicateName(t.Name(), jsonTag), reverseEdgeTag)
140141
}
141142
}
142143

143-
query := query_gen.FormatObjsQuery(t.Name(), filterQueryFunc, paginationAndSorting, readFromQuery)
144+
query := querygen.FormatObjsQuery(t.Name(), filterQueryFunc, paginationAndSorting, readFromQuery)
144145

145146
resp, err := n.queryWithLock(ctx, query)
146147
if err != nil {
147148
return nil, nil, err
148149
}
149150

150-
dynamicType := utils.CreateDynamicStruct(t, fieldToJsonTags, 1)
151+
dynamicType := structreflect.CreateDynamicStruct(t, tagMaps.FieldToJson, 1)
151152

152153
var result struct {
153154
Objs []any `json:"objs"`
@@ -174,7 +175,7 @@ func executeQuery[T any](ctx context.Context, n *Namespace, queryParams QueryPar
174175
gids := make([]uint64, len(result.Objs))
175176
objs := make([]T, len(result.Objs))
176177
for i, obj := range result.Objs {
177-
gid, typedObj, err := utils.ConvertDynamicToTyped[T](obj, t)
178+
gid, typedObj, err := structreflect.ConvertDynamicToTyped[T](obj, t)
178179
if err != nil {
179180
return nil, nil, err
180181
}

api_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
"github.com/stretchr/testify/require"
1818

1919
"github.com/hypermodeinc/modusdb"
20-
"github.com/hypermodeinc/modusdb/api/utils"
20+
"github.com/hypermodeinc/modusdb/internal/apiutils"
2121
)
2222

2323
type User struct {
@@ -768,7 +768,7 @@ func TestNestedObjectMutationWithBadType(t *testing.T) {
768768

769769
_, _, err = modusdb.Create(db, branch, db1.ID())
770770
require.Error(t, err)
771-
require.Equal(t, fmt.Sprintf(utils.NoUniqueConstr, "BadProject"), err.Error())
771+
require.Equal(t, fmt.Sprintf(apiutils.NoUniqueConstr, "BadProject"), err.Error())
772772

773773
proj := BadProject{
774774
Name: "P",
@@ -777,7 +777,7 @@ func TestNestedObjectMutationWithBadType(t *testing.T) {
777777

778778
_, _, err = modusdb.Create(db, proj, db1.ID())
779779
require.Error(t, err)
780-
require.Equal(t, fmt.Sprintf(utils.NoUniqueConstr, "BadProject"), err.Error())
780+
require.Equal(t, fmt.Sprintf(apiutils.NoUniqueConstr, "BadProject"), err.Error())
781781

782782
}
783783

api_types.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import (
1515
"strings"
1616

1717
"github.com/dgraph-io/dgraph/v24/x"
18-
"github.com/hypermodeinc/modusdb/api/query_gen"
19-
"github.com/hypermodeinc/modusdb/api/utils"
18+
"github.com/hypermodeinc/modusdb/internal/apiutils"
19+
"github.com/hypermodeinc/modusdb/internal/querygen"
2020
)
2121

2222
type UniqueField interface {
@@ -103,60 +103,60 @@ func getDefaultNamespace(db *DB, ns ...uint64) (context.Context, *Namespace, err
103103
return ctx, n, nil
104104
}
105105

106-
func filterToQueryFunc(typeName string, f Filter) query_gen.QueryFunc {
106+
func filterToQueryFunc(typeName string, f Filter) querygen.QueryFunc {
107107
// Handle logical operators first
108108
if f.And != nil {
109-
return query_gen.And(filterToQueryFunc(typeName, *f.And))
109+
return querygen.And(filterToQueryFunc(typeName, *f.And))
110110
}
111111
if f.Or != nil {
112-
return query_gen.Or(filterToQueryFunc(typeName, *f.Or))
112+
return querygen.Or(filterToQueryFunc(typeName, *f.Or))
113113
}
114114
if f.Not != nil {
115-
return query_gen.Not(filterToQueryFunc(typeName, *f.Not))
115+
return querygen.Not(filterToQueryFunc(typeName, *f.Not))
116116
}
117117

118118
// Handle field predicates
119119
if f.String.Equals != "" {
120-
return query_gen.BuildEqQuery(utils.GetPredicateName(typeName, f.Field), f.String.Equals)
120+
return querygen.BuildEqQuery(apiutils.GetPredicateName(typeName, f.Field), f.String.Equals)
121121
}
122122
if len(f.String.AllOfTerms) != 0 {
123-
return query_gen.BuildAllOfTermsQuery(utils.GetPredicateName(typeName,
123+
return querygen.BuildAllOfTermsQuery(apiutils.GetPredicateName(typeName,
124124
f.Field), strings.Join(f.String.AllOfTerms, " "))
125125
}
126126
if len(f.String.AnyOfTerms) != 0 {
127-
return query_gen.BuildAnyOfTermsQuery(utils.GetPredicateName(typeName,
127+
return querygen.BuildAnyOfTermsQuery(apiutils.GetPredicateName(typeName,
128128
f.Field), strings.Join(f.String.AnyOfTerms, " "))
129129
}
130130
if len(f.String.AllOfText) != 0 {
131-
return query_gen.BuildAllOfTextQuery(utils.GetPredicateName(typeName,
131+
return querygen.BuildAllOfTextQuery(apiutils.GetPredicateName(typeName,
132132
f.Field), strings.Join(f.String.AllOfText, " "))
133133
}
134134
if len(f.String.AnyOfText) != 0 {
135-
return query_gen.BuildAnyOfTextQuery(utils.GetPredicateName(typeName,
135+
return querygen.BuildAnyOfTextQuery(apiutils.GetPredicateName(typeName,
136136
f.Field), strings.Join(f.String.AnyOfText, " "))
137137
}
138138
if f.String.RegExp != "" {
139-
return query_gen.BuildRegExpQuery(utils.GetPredicateName(typeName,
139+
return querygen.BuildRegExpQuery(apiutils.GetPredicateName(typeName,
140140
f.Field), f.String.RegExp)
141141
}
142142
if f.String.LessThan != "" {
143-
return query_gen.BuildLtQuery(utils.GetPredicateName(typeName,
143+
return querygen.BuildLtQuery(apiutils.GetPredicateName(typeName,
144144
f.Field), f.String.LessThan)
145145
}
146146
if f.String.LessOrEqual != "" {
147-
return query_gen.BuildLeQuery(utils.GetPredicateName(typeName,
147+
return querygen.BuildLeQuery(apiutils.GetPredicateName(typeName,
148148
f.Field), f.String.LessOrEqual)
149149
}
150150
if f.String.GreaterThan != "" {
151-
return query_gen.BuildGtQuery(utils.GetPredicateName(typeName,
151+
return querygen.BuildGtQuery(apiutils.GetPredicateName(typeName,
152152
f.Field), f.String.GreaterThan)
153153
}
154154
if f.String.GreaterOrEqual != "" {
155-
return query_gen.BuildGeQuery(utils.GetPredicateName(typeName,
155+
return querygen.BuildGeQuery(apiutils.GetPredicateName(typeName,
156156
f.Field), f.String.GreaterOrEqual)
157157
}
158158
if f.Vector.SimilarTo != nil {
159-
return query_gen.BuildSimilarToQuery(utils.GetPredicateName(typeName,
159+
return querygen.BuildSimilarToQuery(apiutils.GetPredicateName(typeName,
160160
f.Field), f.Vector.TopK, f.Vector.SimilarTo)
161161
}
162162

@@ -165,7 +165,7 @@ func filterToQueryFunc(typeName string, f Filter) query_gen.QueryFunc {
165165
}
166166

167167
// Helper function to combine multiple filters
168-
func filtersToQueryFunc(typeName string, filter Filter) query_gen.QueryFunc {
168+
func filtersToQueryFunc(typeName string, filter Filter) querygen.QueryFunc {
169169
return filterToQueryFunc(typeName, filter)
170170
}
171171

@@ -200,10 +200,10 @@ func sortingToQueryString(typeName string, s Sorting) string {
200200
}
201201

202202
if first != "" {
203-
parts = append(parts, fmt.Sprintf("%s: %s", firstOp, utils.GetPredicateName(typeName, first)))
203+
parts = append(parts, fmt.Sprintf("%s: %s", firstOp, apiutils.GetPredicateName(typeName, first)))
204204
}
205205
if second != "" {
206-
parts = append(parts, fmt.Sprintf("%s: %s", secondOp, utils.GetPredicateName(typeName, second)))
206+
parts = append(parts, fmt.Sprintf("%s: %s", secondOp, apiutils.GetPredicateName(typeName, second)))
207207
}
208208

209209
return ", " + strings.Join(parts, ", ")

0 commit comments

Comments
 (0)