mirror of
https://github.com/ent/ent.git
synced 2026-03-05 19:35:23 +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.
|
||||
// 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
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ var (
|
||||
},
|
||||
Indexes: []*schema.Index{
|
||||
{
|
||||
Name: "name_fsize",
|
||||
Name: "file_name_size",
|
||||
Unique: false,
|
||||
Columns: []*schema.Column{FilesColumns[2], FilesColumns[1]},
|
||||
},
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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").
|
||||
|
||||
Reference in New Issue
Block a user