Skip to content

Commit 84b76c7

Browse files
committed
- updated pointer handling
1 parent 219b01b commit 84b76c7

4 files changed

Lines changed: 88 additions & 7 deletions

File tree

cmd/command/translate_shape_test.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package command
22

33
import (
4+
"context"
5+
"os"
46
"path/filepath"
7+
"strings"
58
"testing"
69

710
"github.com/stretchr/testify/assert"
@@ -28,3 +31,70 @@ func TestRoutePathForShape(t *testing.T) {
2831
assert.Equal(t, filepath.ToSlash("platform/campaign"), relDir)
2932
assert.Equal(t, "post", stem)
3033
}
34+
35+
func TestTranslateShape_PreservesPredicateBuilderBlocksInGeneratedSQL(t *testing.T) {
36+
ctx := context.Background()
37+
projectDir := t.TempDir()
38+
repoDir := filepath.Join(projectDir, "repo", "dev")
39+
dqlDir := filepath.Join(projectDir, "dql", "opaque")
40+
sqlDir := filepath.Join(dqlDir, "sql")
41+
require.NoError(t, os.MkdirAll(sqlDir, 0o755))
42+
require.NoError(t, os.MkdirAll(repoDir, 0o755))
43+
44+
sqlSource := `SELECT
45+
x0.k_a,
46+
x0.k_b,
47+
z9.m_q,
48+
SUM(x0.v_n) AS agg_alpha,
49+
AVG(z9.v_r) AS agg_beta
50+
FROM
51+
data_alpha x0
52+
LEFT JOIN data_beta z9
53+
ON x0.k_b = z9.k_b
54+
55+
${predicate.Builder().CombineOr($predicate.FilterGroup(0, "AND")).Build("WHERE")}
56+
GROUP BY
57+
x0.k_a,
58+
x0.k_b,
59+
z9.m_q
60+
${predicate.Builder().CombineOr($predicate.FilterGroup(1, "HAVING")).Build("HAVING")}`
61+
require.NoError(t, os.WriteFile(filepath.Join(sqlDir, "opaque_source.sql"), []byte(sqlSource), 0o600))
62+
63+
dqlSource := `/* {"URI":"/opaque/report","Name":"OpaqueReport"} */
64+
#set($_ = $cube())
65+
#set($_ = $Cutoff<string>(query/cutoff).Optional().WithPredicate(0, 'greater_or_equal', 'x0', 'k_a'))
66+
#set($_ = $Threshold<int>(query/threshold).Optional().WithPredicate(1, 'expr', '(SUM(v_n) >= ?)'))
67+
68+
SELECT opaque_root.*,
69+
grouping_enabled(opaque_root),
70+
allow_nulls(opaque_root),
71+
set_limit(opaque_root, 25)
72+
FROM (${embed:sql/opaque_source.sql}) opaque_root`
73+
dqlPath := filepath.Join(dqlDir, "opaque_report.dql")
74+
require.NoError(t, os.WriteFile(dqlPath, []byte(dqlSource), 0o600))
75+
76+
opts := &options.Options{
77+
Translate: &options.Translate{
78+
Rule: options.Rule{
79+
Project: projectDir,
80+
Source: []string{dqlPath},
81+
Engine: options.EngineShape,
82+
},
83+
Repository: options.Repository{
84+
RepositoryURL: repoDir,
85+
APIPrefix: "/v1/api",
86+
},
87+
},
88+
}
89+
require.NoError(t, opts.Init(ctx))
90+
91+
svc := New()
92+
require.NoError(t, svc.translateShape(ctx, opts))
93+
94+
generatedSQLPath := filepath.Join(repoDir, "Datly", "routes", "opaque", "opaque_report", "opaque_report.sql")
95+
data, err := os.ReadFile(generatedSQLPath)
96+
require.NoError(t, err)
97+
generated := string(data)
98+
assert.True(t, strings.Contains(generated, `${predicate.Builder().CombineOr($predicate.FilterGroup(0, "AND")).Build("WHERE")}`))
99+
assert.True(t, strings.Contains(generated, `${predicate.Builder().CombineOr($predicate.FilterGroup(1, "HAVING")).Build("HAVING")}`))
100+
}

internal/converter/repeated.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55
"strconv"
66
"strings"
7-
"unsafe"
87
)
98

109
type Repeated []string
@@ -32,23 +31,35 @@ func (r Repeated) AsUInts() ([]uint, error) {
3231
if err != nil {
3332
return nil, err
3433
}
35-
return *(*[]uint)(unsafe.Pointer(&v)), nil
34+
result := make([]uint, len(v))
35+
for i, item := range v {
36+
result[i] = uint(item)
37+
}
38+
return result, nil
3639
}
3740

3841
func (r Repeated) AsInt64s() ([]int64, error) {
3942
v, err := r.AsInts()
4043
if err != nil {
4144
return nil, err
4245
}
43-
return *(*[]int64)(unsafe.Pointer(&v)), nil
46+
result := make([]int64, len(v))
47+
for i, item := range v {
48+
result[i] = int64(item)
49+
}
50+
return result, nil
4451
}
4552

4653
func (r Repeated) AsUInt64s() ([]uint64, error) {
4754
v, err := r.AsInts()
4855
if err != nil {
4956
return nil, err
5057
}
51-
return *(*[]uint64)(unsafe.Pointer(&v)), nil
58+
result := make([]uint64, len(v))
59+
for i, item := range v {
60+
result[i] = uint64(item)
61+
}
62+
return result, nil
5263
}
5364

5465
func (r Repeated) AsFloats64() ([]float64, error) {

view/collector.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,8 +1115,8 @@ func (r *Collector) Fetched() {
11151115
}
11161116

11171117
func (r *Collector) Len() int {
1118-
if r.DestPtr() != nil {
1119-
return (*reflect.SliceHeader)(xunsafe.AsPointer(r.DestPtr())).Len
1118+
if r.DestPtr() != nil && r.slice != nil {
1119+
return r.slice.Len(xunsafe.AsPointer(r.DestPtr()))
11201120
}
11211121
return 0
11221122
}

view/extension/codec/xmlfilter/service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func (t *Service) Transfer(aStruct interface{}) (*xml.FilterHolder, error) {
4242
xFilterPtr = *(*unsafe.Pointer)(ownerAddr)
4343
fieldType = fieldType.Elem()
4444
} else {
45-
xFilterPtr = unsafe.Pointer(uintptr(ptr) + field.Offset)
45+
xFilterPtr = unsafe.Add(ptr, field.Offset)
4646
}
4747

4848
if fieldType.Kind() != reflect.Struct {

0 commit comments

Comments
 (0)