github.com/unigraph-dev/dgraph@v1.1.1-0.20200923154953-8b52b426f765/x/keys_test.go (about)

     1  /*
     2   * Copyright 2016-2018 Dgraph Labs, Inc. and Contributors
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *     http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package x
    18  
    19  import (
    20  	"fmt"
    21  	"math"
    22  	"sort"
    23  	"testing"
    24  
    25  	"github.com/stretchr/testify/require"
    26  )
    27  
    28  func TestDataKey(t *testing.T) {
    29  	var uid uint64
    30  	for uid = 0; uid < 1001; uid++ {
    31  		// Use the uid to derive the attribute so it has variable length and the test
    32  		// can verify that multiple sizes of attr work correctly.
    33  		sattr := fmt.Sprintf("attr:%d", uid)
    34  		key := DataKey(sattr, uid)
    35  		pk, err := Parse(key)
    36  		require.NoError(t, err)
    37  
    38  		require.True(t, pk.IsData())
    39  		require.Equal(t, sattr, pk.Attr)
    40  		require.Equal(t, uid, pk.Uid)
    41  		require.Equal(t, uint64(0), pk.StartUid)
    42  	}
    43  
    44  	keys := make([]string, 0, 1024)
    45  	for uid = 1024; uid >= 1; uid-- {
    46  		key := DataKey("testing.key", uid)
    47  		keys = append(keys, string(key))
    48  	}
    49  	// Test that sorting is as expected.
    50  	sort.Strings(keys)
    51  	require.True(t, sort.StringsAreSorted(keys))
    52  	for i, key := range keys {
    53  		exp := DataKey("testing.key", uint64(i+1))
    54  		require.Equal(t, string(exp), key)
    55  	}
    56  }
    57  
    58  func TestParseDataKeysWithStartUid(t *testing.T) {
    59  	var uid uint64
    60  	startUid := uint64(math.MaxUint64)
    61  	for uid = 0; uid < 1001; uid++ {
    62  		sattr := fmt.Sprintf("attr:%d", uid)
    63  		key := DataKey(sattr, uid)
    64  		key, err := GetSplitKey(key, startUid)
    65  		require.NoError(t, err)
    66  		pk, err := Parse(key)
    67  		require.NoError(t, err)
    68  
    69  		require.True(t, pk.IsData())
    70  		require.Equal(t, sattr, pk.Attr)
    71  		require.Equal(t, uid, pk.Uid)
    72  		require.Equal(t, pk.HasStartUid, true)
    73  		require.Equal(t, startUid, pk.StartUid)
    74  	}
    75  }
    76  
    77  func TestIndexKey(t *testing.T) {
    78  	var uid uint64
    79  	for uid = 0; uid < 1001; uid++ {
    80  		sattr := fmt.Sprintf("attr:%d", uid)
    81  		sterm := fmt.Sprintf("term:%d", uid)
    82  
    83  		key := IndexKey(sattr, sterm)
    84  		pk, err := Parse(key)
    85  		require.NoError(t, err)
    86  
    87  		require.True(t, pk.IsIndex())
    88  		require.Equal(t, sattr, pk.Attr)
    89  		require.Equal(t, sterm, pk.Term)
    90  	}
    91  }
    92  
    93  func TestIndexKeyWithStartUid(t *testing.T) {
    94  	var uid uint64
    95  	startUid := uint64(math.MaxUint64)
    96  	for uid = 0; uid < 1001; uid++ {
    97  		sattr := fmt.Sprintf("attr:%d", uid)
    98  		sterm := fmt.Sprintf("term:%d", uid)
    99  
   100  		key := IndexKey(sattr, sterm)
   101  		key, err := GetSplitKey(key, startUid)
   102  		require.NoError(t, err)
   103  		pk, err := Parse(key)
   104  		require.NoError(t, err)
   105  
   106  		require.True(t, pk.IsIndex())
   107  		require.Equal(t, sattr, pk.Attr)
   108  		require.Equal(t, sterm, pk.Term)
   109  		require.Equal(t, pk.HasStartUid, true)
   110  		require.Equal(t, startUid, pk.StartUid)
   111  	}
   112  }
   113  
   114  func TestReverseKey(t *testing.T) {
   115  	var uid uint64
   116  	for uid = 0; uid < 1001; uid++ {
   117  		sattr := fmt.Sprintf("attr:%d", uid)
   118  
   119  		key := ReverseKey(sattr, uid)
   120  		pk, err := Parse(key)
   121  		require.NoError(t, err)
   122  
   123  		require.True(t, pk.IsReverse())
   124  		require.Equal(t, sattr, pk.Attr)
   125  		require.Equal(t, uid, pk.Uid)
   126  	}
   127  }
   128  
   129  func TestReverseKeyWithStartUid(t *testing.T) {
   130  	var uid uint64
   131  	startUid := uint64(math.MaxUint64)
   132  	for uid = 0; uid < 1001; uid++ {
   133  		sattr := fmt.Sprintf("attr:%d", uid)
   134  
   135  		key := ReverseKey(sattr, uid)
   136  		key, err := GetSplitKey(key, startUid)
   137  		require.NoError(t, err)
   138  		pk, err := Parse(key)
   139  		require.NoError(t, err)
   140  
   141  		require.True(t, pk.IsReverse())
   142  		require.Equal(t, sattr, pk.Attr)
   143  		require.Equal(t, uid, pk.Uid)
   144  		require.Equal(t, pk.HasStartUid, true)
   145  		require.Equal(t, startUid, pk.StartUid)
   146  	}
   147  }
   148  
   149  func TestCountKey(t *testing.T) {
   150  	var count uint32
   151  	for count = 0; count < 1001; count++ {
   152  		sattr := fmt.Sprintf("attr:%d", count)
   153  
   154  		key := CountKey(sattr, count, true)
   155  		pk, err := Parse(key)
   156  		require.NoError(t, err)
   157  
   158  		require.True(t, pk.IsCountOrCountRev())
   159  		require.Equal(t, sattr, pk.Attr)
   160  		require.Equal(t, count, pk.Count)
   161  	}
   162  }
   163  
   164  func TestCountKeyWithStartUid(t *testing.T) {
   165  	var count uint32
   166  	startUid := uint64(math.MaxUint64)
   167  	for count = 0; count < 1001; count++ {
   168  		sattr := fmt.Sprintf("attr:%d", count)
   169  
   170  		key := CountKey(sattr, count, true)
   171  		key, err := GetSplitKey(key, startUid)
   172  		require.NoError(t, err)
   173  		pk, err := Parse(key)
   174  		require.NoError(t, err)
   175  
   176  		require.True(t, pk.IsCountOrCountRev())
   177  		require.Equal(t, sattr, pk.Attr)
   178  		require.Equal(t, count, pk.Count)
   179  		require.Equal(t, pk.HasStartUid, true)
   180  		require.Equal(t, startUid, pk.StartUid)
   181  	}
   182  }
   183  
   184  func TestSchemaKey(t *testing.T) {
   185  	var uid uint64
   186  	for uid = 0; uid < 1001; uid++ {
   187  		sattr := fmt.Sprintf("attr:%d", uid)
   188  
   189  		key := SchemaKey(sattr)
   190  		pk, err := Parse(key)
   191  		require.NoError(t, err)
   192  
   193  		require.True(t, pk.IsSchema())
   194  		require.Equal(t, sattr, pk.Attr)
   195  	}
   196  }