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:
Ariel Mashraki
2019-11-18 07:53:33 -08:00
committed by Facebook Github Bot
parent 829de26c4f
commit 3c6661fce8
8 changed files with 33 additions and 15 deletions

View File

@@ -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
} }

View File

@@ -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]},
}, },

View File

@@ -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

View File

@@ -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)

View File

@@ -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)
} }
} }

View File

@@ -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

View File

@@ -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").