mirror of
https://github.com/ent/ent.git
synced 2026-04-28 05:30:56 +03:00
schema/index: add storage-key option for indexes
Summary: Pull Request resolved: https://github.com/facebookincubator/ent/pull/172 Reviewed By: alexsn Differential Revision: D18571700 fbshipit-source-id: 2b8dbcc7c36be01ba383c48f982f59361a68c621
This commit is contained in:
committed by
Facebook Github Bot
parent
829de26c4f
commit
3c6661fce8
@@ -340,7 +340,7 @@ func (t Type) TagTypes() []string {
|
|||||||
// AddIndex adds a new index for the type.
|
// AddIndex adds a new index for the type.
|
||||||
// It fails if the schema index is invalid.
|
// It fails if the schema index is invalid.
|
||||||
func (t *Type) AddIndex(idx *load.Index) error {
|
func (t *Type) AddIndex(idx *load.Index) error {
|
||||||
index := &Index{Unique: idx.Unique}
|
index := &Index{Name: idx.StorageKey, Unique: idx.Unique}
|
||||||
if len(idx.Fields) == 0 && len(idx.Edges) == 0 {
|
if len(idx.Fields) == 0 && len(idx.Edges) == 0 {
|
||||||
return fmt.Errorf("missing fields or edges")
|
return fmt.Errorf("missing fields or edges")
|
||||||
}
|
}
|
||||||
@@ -373,7 +373,10 @@ func (t *Type) AddIndex(idx *load.Index) error {
|
|||||||
index.Columns = append(index.Columns, edge.Rel.Column())
|
index.Columns = append(index.Columns, edge.Rel.Column())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
index.Name += strings.Join(index.Columns, "_")
|
// If no storage-key was defined for this index, generate one.
|
||||||
|
if idx.StorageKey == "" {
|
||||||
|
index.Name += strings.Join(index.Columns, "_")
|
||||||
|
}
|
||||||
t.Indexes = append(t.Indexes, index)
|
t.Indexes = append(t.Indexes, index)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ var (
|
|||||||
},
|
},
|
||||||
Indexes: []*schema.Index{
|
Indexes: []*schema.Index{
|
||||||
{
|
{
|
||||||
Name: "name_fsize",
|
Name: "file_name_size",
|
||||||
Unique: false,
|
Unique: false,
|
||||||
Columns: []*schema.Column{FilesColumns[2], FilesColumns[1]},
|
Columns: []*schema.Column{FilesColumns[2], FilesColumns[1]},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -50,7 +50,8 @@ func (File) Edges() []ent.Edge {
|
|||||||
func (File) Indexes() []ent.Index {
|
func (File) Indexes() []ent.Index {
|
||||||
return []ent.Index{
|
return []ent.Index{
|
||||||
// non-unique index should not prevent duplicates.
|
// non-unique index should not prevent duplicates.
|
||||||
index.Fields("name", "size"),
|
index.Fields("name", "size").
|
||||||
|
StorageKey("file_name_size"),
|
||||||
// unique index prevents duplicates records.
|
// unique index prevents duplicates records.
|
||||||
index.Fields("name", "user").
|
index.Fields("name", "user").
|
||||||
Unique(),
|
Unique(),
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -64,9 +64,10 @@ type Edge struct {
|
|||||||
|
|
||||||
// Index represents an ent.Index that was loaded from a complied user package.
|
// Index represents an ent.Index that was loaded from a complied user package.
|
||||||
type Index struct {
|
type Index struct {
|
||||||
Unique bool `json:"unique,omitempty"`
|
Unique bool `json:"unique,omitempty"`
|
||||||
Edges []string `json:"edges,omitempty"`
|
Edges []string `json:"edges,omitempty"`
|
||||||
Fields []string `json:"fields,omitempty"`
|
Fields []string `json:"fields,omitempty"`
|
||||||
|
StorageKey string `json:"storage_key,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEdge creates an loaded edge from edge descriptor.
|
// NewEdge creates an loaded edge from edge descriptor.
|
||||||
@@ -141,9 +142,10 @@ func MarshalSchema(schema ent.Interface) (b []byte, err error) {
|
|||||||
for _, idx := range indexes {
|
for _, idx := range indexes {
|
||||||
idx := idx.Descriptor()
|
idx := idx.Descriptor()
|
||||||
s.Indexes = append(s.Indexes, &Index{
|
s.Indexes = append(s.Indexes, &Index{
|
||||||
Edges: idx.Edges,
|
Edges: idx.Edges,
|
||||||
Fields: idx.Fields,
|
Fields: idx.Fields,
|
||||||
Unique: idx.Unique,
|
Unique: idx.Unique,
|
||||||
|
StorageKey: idx.StorageKey,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return json.Marshal(s)
|
return json.Marshal(s)
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ func (User) Indexes() []ent.Index {
|
|||||||
Unique(),
|
Unique(),
|
||||||
index.Fields("name").
|
index.Fields("name").
|
||||||
Edges("parent").
|
Edges("parent").
|
||||||
|
StorageKey("user_parent_name").
|
||||||
Unique(),
|
Unique(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -123,6 +124,7 @@ func TestMarshalSchema(t *testing.T) {
|
|||||||
require.True(t, schema.Indexes[0].Unique)
|
require.True(t, schema.Indexes[0].Unique)
|
||||||
require.Equal(t, []string{"name"}, schema.Indexes[1].Fields)
|
require.Equal(t, []string{"name"}, schema.Indexes[1].Fields)
|
||||||
require.Equal(t, []string{"parent"}, schema.Indexes[1].Edges)
|
require.Equal(t, []string{"parent"}, schema.Indexes[1].Edges)
|
||||||
|
require.Equal(t, "user_parent_name", schema.Indexes[1].StorageKey)
|
||||||
require.True(t, schema.Indexes[1].Unique)
|
require.True(t, schema.Indexes[1].Unique)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,9 +6,10 @@ package index
|
|||||||
|
|
||||||
// A Descriptor for index configuration.
|
// A Descriptor for index configuration.
|
||||||
type Descriptor struct {
|
type Descriptor struct {
|
||||||
Unique bool // unique index.
|
Unique bool // unique index.
|
||||||
Edges []string // edge columns.
|
Edges []string // edge columns.
|
||||||
Fields []string // field columns.
|
Fields []string // field columns.
|
||||||
|
StorageKey string // custom index name.
|
||||||
}
|
}
|
||||||
|
|
||||||
// Builder for indexes on vertex columns and edges in the graph.
|
// Builder for indexes on vertex columns and edges in the graph.
|
||||||
@@ -90,6 +91,12 @@ func (b *Builder) Unique() *Builder {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StorageKey sets the storage key of the index. In SQL dialects, it's the index name.
|
||||||
|
func (b *Builder) StorageKey(key string) *Builder {
|
||||||
|
b.desc.StorageKey = key
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
// Descriptor implements the ent.Descriptor interface.
|
// Descriptor implements the ent.Descriptor interface.
|
||||||
func (b *Builder) Descriptor() *Descriptor {
|
func (b *Builder) Descriptor() *Descriptor {
|
||||||
return b.desc
|
return b.desc
|
||||||
|
|||||||
@@ -14,9 +14,11 @@ import (
|
|||||||
|
|
||||||
func TestIndex(t *testing.T) {
|
func TestIndex(t *testing.T) {
|
||||||
idx := index.Fields("name", "address").
|
idx := index.Fields("name", "address").
|
||||||
|
StorageKey("user_index").
|
||||||
Descriptor()
|
Descriptor()
|
||||||
require.Empty(t, idx.Edges)
|
require.Empty(t, idx.Edges)
|
||||||
require.False(t, idx.Unique)
|
require.False(t, idx.Unique)
|
||||||
|
require.Equal(t, "user_index", idx.StorageKey)
|
||||||
require.Equal(t, []string{"name", "address"}, idx.Fields)
|
require.Equal(t, []string{"name", "address"}, idx.Fields)
|
||||||
|
|
||||||
idx = index.Fields("name", "address").
|
idx = index.Fields("name", "address").
|
||||||
@@ -24,6 +26,7 @@ func TestIndex(t *testing.T) {
|
|||||||
Descriptor()
|
Descriptor()
|
||||||
require.Empty(t, idx.Edges)
|
require.Empty(t, idx.Edges)
|
||||||
require.True(t, idx.Unique)
|
require.True(t, idx.Unique)
|
||||||
|
require.Empty(t, idx.StorageKey)
|
||||||
require.Equal(t, []string{"name", "address"}, idx.Fields)
|
require.Equal(t, []string{"name", "address"}, idx.Fields)
|
||||||
|
|
||||||
idx = index.Fields("name", "address").
|
idx = index.Fields("name", "address").
|
||||||
|
|||||||
Reference in New Issue
Block a user