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.
// It fails if the schema index is invalid.
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 {
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.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)
return nil
}

View File

@@ -124,7 +124,7 @@ var (
},
Indexes: []*schema.Index{
{
Name: "name_fsize",
Name: "file_name_size",
Unique: false,
Columns: []*schema.Column{FilesColumns[2], FilesColumns[1]},
},

View File

@@ -50,7 +50,8 @@ func (File) Edges() []ent.Edge {
func (File) Indexes() []ent.Index {
return []ent.Index{
// non-unique index should not prevent duplicates.
index.Fields("name", "size"),
index.Fields("name", "size").
StorageKey("file_name_size"),
// unique index prevents duplicates records.
index.Fields("name", "user").
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.
type Index struct {
Unique bool `json:"unique,omitempty"`
Edges []string `json:"edges,omitempty"`
Fields []string `json:"fields,omitempty"`
Unique bool `json:"unique,omitempty"`
Edges []string `json:"edges,omitempty"`
Fields []string `json:"fields,omitempty"`
StorageKey string `json:"storage_key,omitempty"`
}
// 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 {
idx := idx.Descriptor()
s.Indexes = append(s.Indexes, &Index{
Edges: idx.Edges,
Fields: idx.Fields,
Unique: idx.Unique,
Edges: idx.Edges,
Fields: idx.Fields,
Unique: idx.Unique,
StorageKey: idx.StorageKey,
})
}
return json.Marshal(s)

View File

@@ -56,6 +56,7 @@ func (User) Indexes() []ent.Index {
Unique(),
index.Fields("name").
Edges("parent").
StorageKey("user_parent_name").
Unique(),
}
}
@@ -123,6 +124,7 @@ func TestMarshalSchema(t *testing.T) {
require.True(t, schema.Indexes[0].Unique)
require.Equal(t, []string{"name"}, schema.Indexes[1].Fields)
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)
}
}

View File

@@ -6,9 +6,10 @@ package index
// A Descriptor for index configuration.
type Descriptor struct {
Unique bool // unique index.
Edges []string // edge columns.
Fields []string // field columns.
Unique bool // unique index.
Edges []string // edge columns.
Fields []string // field columns.
StorageKey string // custom index name.
}
// Builder for indexes on vertex columns and edges in the graph.
@@ -90,6 +91,12 @@ func (b *Builder) Unique() *Builder {
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.
func (b *Builder) Descriptor() *Descriptor {
return b.desc

View File

@@ -14,9 +14,11 @@ import (
func TestIndex(t *testing.T) {
idx := index.Fields("name", "address").
StorageKey("user_index").
Descriptor()
require.Empty(t, idx.Edges)
require.False(t, idx.Unique)
require.Equal(t, "user_index", idx.StorageKey)
require.Equal(t, []string{"name", "address"}, idx.Fields)
idx = index.Fields("name", "address").
@@ -24,6 +26,7 @@ func TestIndex(t *testing.T) {
Descriptor()
require.Empty(t, idx.Edges)
require.True(t, idx.Unique)
require.Empty(t, idx.StorageKey)
require.Equal(t, []string{"name", "address"}, idx.Fields)
idx = index.Fields("name", "address").