github.com/RevenueMonster/sqlike@v1.0.6/examples/index.go (about)

     1  package examples
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/RevenueMonster/sqlike/sqlike"
     8  	"github.com/RevenueMonster/sqlike/sqlike/indexes"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  // IndexExamples :
    13  func IndexExamples(ctx context.Context, t *testing.T, db *sqlike.Database) {
    14  	var (
    15  		err  error
    16  		idxs []sqlike.Index
    17  		ok   bool
    18  	)
    19  
    20  	table := db.Table("Index")
    21  
    22  	{
    23  
    24  		err = table.DropIfExists(ctx)
    25  		require.NoError(t, err)
    26  	}
    27  
    28  	// Migrate and create unique index with `unique_index` tag
    29  	{
    30  		err = table.Migrate(ctx, indexStruct{})
    31  		require.NoError(t, err)
    32  	}
    33  
    34  	// Create one index
    35  	{
    36  		idx := table.Indexes()
    37  		err = idx.CreateOne(
    38  			ctx,
    39  			indexes.Index{
    40  				Columns: indexes.Columns("ID"),
    41  			})
    42  		require.NoError(t, err)
    43  		idxs, err = idx.List(ctx)
    44  		require.NoError(t, err)
    45  		require.True(t, len(idxs) > 1)
    46  	}
    47  
    48  	// Auto build indexes using yaml file
    49  	{
    50  		table := db.Table("NormalStruct")
    51  		err = table.DropIfExists(ctx)
    52  		require.NoError(t, err)
    53  
    54  		table.MustMigrate(ctx, normalStruct{})
    55  
    56  		err = db.BuildIndexes(ctx)
    57  		require.NoError(t, err)
    58  		idxs, err = table.Indexes().List(ctx)
    59  		require.NoError(t, err)
    60  		require.Contains(t, idxs, sqlike.Index{
    61  			// Name:      "IX-SID@ASC;Emoji@ASC;Bool@DESC",
    62  			Name:     "eb8bc4a93ee6af77e2ec575e12935e6d",
    63  			Type:     "BTREE",
    64  			IsUnique: false,
    65  		})
    66  		require.Contains(t, idxs, sqlike.Index{
    67  			Name:     "test_idx",
    68  			Type:     "BTREE",
    69  			IsUnique: false,
    70  		})
    71  	}
    72  
    73  	// Auto build indexes using folder
    74  	{
    75  		table1 := db.Table("SimpleStruct")
    76  		table2 := db.Table("TempGeneratedStruct")
    77  
    78  		err = table1.DropIfExists(ctx)
    79  		require.NoError(t, err)
    80  		err = table2.DropIfExists(ctx)
    81  		require.NoError(t, err)
    82  
    83  		table1.MustMigrate(ctx, simpleStruct{})
    84  		table2.MustMigrate(ctx, generatedStruct{})
    85  
    86  		err = table1.Indexes().DropAll(ctx)
    87  		require.NoError(t, err)
    88  
    89  		err = table2.Indexes().DropAll(ctx)
    90  		require.NoError(t, err)
    91  
    92  		err = db.BuildIndexes(ctx, "./indexes")
    93  		require.NoError(t, err)
    94  		idxs, err = table1.Indexes().List(ctx)
    95  		require.NoError(t, err)
    96  		require.True(t, len(idxs) == 6)
    97  
    98  		idxs, err = table2.Indexes().List(ctx)
    99  		require.NoError(t, err)
   100  		require.True(t, len(idxs) == 1)
   101  	}
   102  
   103  	table = db.Table("NormalStruct")
   104  
   105  	// Create multiple indexes
   106  	{
   107  		idxs := []indexes.Index{
   108  			{
   109  				Name:    "Bool_Int",
   110  				Type:    indexes.BTree,
   111  				Columns: indexes.Columns("Bool", "Int"),
   112  			},
   113  			{
   114  				Name:    "DateTime_Timestamp",
   115  				Type:    indexes.BTree,
   116  				Columns: indexes.Columns("DateTime", "Timestamp"),
   117  			},
   118  		}
   119  
   120  		iv := table.Indexes()
   121  		err = iv.Create(ctx, idxs)
   122  		require.NoError(t, err)
   123  		ok, _ = table.HasIndexByName(ctx, "Bool_Int")
   124  		require.True(t, ok)
   125  		ok, _ = table.HasIndexByName(ctx, "DateTime_Timestamp")
   126  		require.True(t, ok)
   127  		err = iv.CreateIfNotExists(ctx, idxs)
   128  		require.NoError(t, err)
   129  	}
   130  
   131  }