Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

generics model support #2003

Open
wants to merge 2 commits into
base: v10
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions orm/table.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,14 @@ type Table struct {
func newTable(typ reflect.Type) *Table {
t := new(Table)
t.Type = typ
name := t.Type.Name()
index := strings.Index(name, "[")
if index > 0 {
name = name[:index]
}
t.zeroStruct = reflect.New(t.Type).Elem()
t.TypeName = internal.ToExported(t.Type.Name())
t.ModelName = internal.Underscore(t.Type.Name())
t.TypeName = internal.ToExported(name)
t.ModelName = internal.Underscore(name)
Comment on lines +98 to +105
Copy link
Collaborator

@elliotcourant elliotcourant Jul 2, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wouldn't an easier way to do this be to just define the name directly on the thing?

Like this:

type File struct {
	tableName string `pg:"files"`

	...

This way even if its a generic, the table name stays the same? With how you have it written, you're throwing out the generic argument entirely, so it would never be considered for the table name.

Copy link
Author

@cubatic45 cubatic45 Jul 3, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Directly defining the name works in some models without nested structure, but in some cases, it does not work.

Sometimes, we forget to use an alias.
example: https://go.dev/play/p/VJpB_c3cLkt

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh interesting, that is definitely a bug in my eyes then, the way table names are built should be consistent. Let me mess around a bit here.

Thank you very much for the code reproduction!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see now what is happening, the way we generate the alias is different than how we derive the actual table name. Thus why it is only affecting select queries oddly.

I think there is a more elegant solution to this, but let me mess around some more.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have you found a better solution?

tableName := tableNameInflector(t.ModelName)
t.setName(quoteIdent(tableName))
t.Alias = quoteIdent(t.ModelName)
Expand Down Expand Up @@ -292,7 +297,7 @@ func (t *Table) addFields(typ reflect.Type, baseIndex []int) {
}
}

//nolint
// nolint
func (t *Table) newField(f reflect.StructField, index []int) *Field {
pgTag := tagparser.Parse(f.Tag.Get("pg"))

Expand Down Expand Up @@ -944,7 +949,7 @@ func (t *Table) mustM2MRelation(field *Field, pgTag *tagparser.Tag) bool {
return true
}

//nolint
// nolint
func (t *Table) tryRelationSlice(field *Field, pgTag *tagparser.Tag) bool {
if t.tryM2MRelation(field, pgTag) {
internal.Deprecated.Printf(
Expand Down
17 changes: 17 additions & 0 deletions orm/table_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,23 @@ var _ = Describe("embedding with ignored field", func() {
})
})

type P[T any] struct {
Data T
}

var _ = Describe("generics model", func() {
var table *orm.Table

BeforeEach(func() {
strct := reflect.ValueOf(P[string]{})
table = orm.GetTable(strct.Type())
})
It("TypeName and ModelName", func() {
Expect(table.TypeName).To(BeEquivalentTo("P"))
Expect(table.ModelName).To(BeEquivalentTo("p"))
})
})

type Nameless struct {
tableName struct{} `pg:"_"`

Expand Down