github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/pingcap/tidb/kv/index_iter_test.go (about)

     1  // Copyright 2015 PingCAP, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package kv_test
    15  
    16  import (
    17  	"io"
    18  	"testing"
    19  
    20  	. "github.com/insionng/yougam/libraries/pingcap/check"
    21  	"github.com/insionng/yougam/libraries/pingcap/tidb/kv"
    22  	"github.com/insionng/yougam/libraries/pingcap/tidb/store/localstore"
    23  	"github.com/insionng/yougam/libraries/pingcap/tidb/store/localstore/goleveldb"
    24  	"github.com/insionng/yougam/libraries/pingcap/tidb/terror"
    25  	"github.com/insionng/yougam/libraries/pingcap/tidb/util/testleak"
    26  	"github.com/insionng/yougam/libraries/pingcap/tidb/util/types"
    27  )
    28  
    29  func TestT(t *testing.T) {
    30  	TestingT(t)
    31  }
    32  
    33  var _ = Suite(&testIndexSuite{})
    34  
    35  type testIndexSuite struct {
    36  	s kv.Storage
    37  }
    38  
    39  func (s *testIndexSuite) SetUpSuite(c *C) {
    40  	path := "memory:"
    41  	d := localstore.Driver{Driver: goleveldb.MemoryDriver{}}
    42  	store, err := d.Open(path)
    43  	c.Assert(err, IsNil)
    44  	s.s = store
    45  }
    46  
    47  func (s *testIndexSuite) TearDownSuite(c *C) {
    48  	err := s.s.Close()
    49  	c.Assert(err, IsNil)
    50  }
    51  
    52  func (s *testIndexSuite) TestIndex(c *C) {
    53  	defer testleak.AfterTest(c)()
    54  	index := kv.NewKVIndex([]byte("i"), "test", 0, false)
    55  
    56  	// Test ununiq index.
    57  	txn, err := s.s.Begin()
    58  	c.Assert(err, IsNil)
    59  
    60  	values := types.MakeDatums(1, 2)
    61  	err = index.Create(txn, values, 1)
    62  	c.Assert(err, IsNil)
    63  
    64  	it, err := index.SeekFirst(txn)
    65  	c.Assert(err, IsNil)
    66  
    67  	getValues, h, err := it.Next()
    68  	c.Assert(err, IsNil)
    69  	c.Assert(getValues, HasLen, 2)
    70  	c.Assert(getValues[0].GetInt64(), Equals, int64(1))
    71  	c.Assert(getValues[1].GetInt64(), Equals, int64(2))
    72  	c.Assert(h, Equals, int64(1))
    73  	it.Close()
    74  
    75  	exist, _, err := index.Exist(txn, values, 100)
    76  	c.Assert(err, IsNil)
    77  	c.Assert(exist, IsFalse)
    78  
    79  	exist, _, err = index.Exist(txn, values, 1)
    80  	c.Assert(err, IsNil)
    81  	c.Assert(exist, IsTrue)
    82  
    83  	err = index.Delete(txn, values, 1)
    84  	c.Assert(err, IsNil)
    85  
    86  	it, err = index.SeekFirst(txn)
    87  	c.Assert(err, IsNil)
    88  
    89  	_, _, err = it.Next()
    90  	c.Assert(terror.ErrorEqual(err, io.EOF), IsTrue)
    91  	it.Close()
    92  
    93  	err = index.Create(txn, values, 0)
    94  	c.Assert(err, IsNil)
    95  
    96  	_, err = index.SeekFirst(txn)
    97  	c.Assert(err, IsNil)
    98  
    99  	_, hit, err := index.Seek(txn, values)
   100  	c.Assert(err, IsNil)
   101  	c.Assert(hit, IsTrue)
   102  
   103  	err = index.Drop(txn)
   104  	c.Assert(err, IsNil)
   105  
   106  	it, hit, err = index.Seek(txn, values)
   107  	c.Assert(err, IsNil)
   108  	c.Assert(hit, IsFalse)
   109  
   110  	_, _, err = it.Next()
   111  	c.Assert(terror.ErrorEqual(err, io.EOF), IsTrue)
   112  	it.Close()
   113  
   114  	it, err = index.SeekFirst(txn)
   115  	c.Assert(err, IsNil)
   116  
   117  	_, _, err = it.Next()
   118  	c.Assert(terror.ErrorEqual(err, io.EOF), IsTrue)
   119  	it.Close()
   120  
   121  	err = txn.Commit()
   122  	c.Assert(err, IsNil)
   123  
   124  	index = kv.NewKVIndex([]byte("j"), "test", 1, true)
   125  
   126  	// Test uniq index.
   127  	txn, err = s.s.Begin()
   128  	c.Assert(err, IsNil)
   129  
   130  	err = index.Create(txn, values, 1)
   131  	c.Assert(err, IsNil)
   132  
   133  	err = index.Create(txn, values, 2)
   134  	c.Assert(err, NotNil)
   135  
   136  	exist, h, err = index.Exist(txn, values, 1)
   137  	c.Assert(err, IsNil)
   138  	c.Assert(h, Equals, int64(1))
   139  	c.Assert(exist, IsTrue)
   140  
   141  	exist, h, err = index.Exist(txn, values, 2)
   142  	c.Assert(err, NotNil)
   143  	c.Assert(h, Equals, int64(1))
   144  	c.Assert(exist, IsTrue)
   145  
   146  	err = txn.Commit()
   147  	c.Assert(err, IsNil)
   148  }
   149  
   150  func (s *testIndexSuite) TestCombineIndexSeek(c *C) {
   151  	defer testleak.AfterTest(c)()
   152  	index := kv.NewKVIndex([]byte("i"), "test", 1, false)
   153  
   154  	txn, err := s.s.Begin()
   155  	c.Assert(err, IsNil)
   156  
   157  	values := types.MakeDatums("abc", "def")
   158  	err = index.Create(txn, values, 1)
   159  	c.Assert(err, IsNil)
   160  
   161  	index2 := kv.NewKVIndex([]byte("i"), "test", 1, false)
   162  	iter, hit, err := index2.Seek(txn, types.MakeDatums("abc", nil))
   163  	c.Assert(err, IsNil)
   164  	defer iter.Close()
   165  	c.Assert(hit, IsFalse)
   166  	_, h, err := iter.Next()
   167  	c.Assert(err, IsNil)
   168  	c.Assert(h, Equals, int64(1))
   169  }