github.com/mgulsoy/arnedb@v1.2.2-alpha/arnedb_test.go (about)

     1  package arnedb
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"testing"
     7  	"time"
     8  )
     9  
    10  type SampleNestedType struct {
    11  	IntegerValue int
    12  	StringValue  string
    13  	FloatValue   float64
    14  }
    15  
    16  type SampleRecordType struct {
    17  	Id         int
    18  	Name       string
    19  	Nested     SampleNestedType
    20  	ArrayValue []string
    21  }
    22  
    23  func TestOpen(t *testing.T) {
    24  	pDb, err := Open("/tmp/arnedb", "testdb")
    25  
    26  	if pDb == nil || err != nil {
    27  		t.Fatal("Open test failed with:", err)
    28  	}
    29  
    30  }
    31  
    32  func TestCollectionOperations(t *testing.T) {
    33  
    34  	_ = os.RemoveAll("/tmp/arnedb/testdb")
    35  
    36  	// Veritabanı open yapılır
    37  	pDb, err := Open("/tmp/arnedb", "testdb")
    38  	if pDb == nil || err != nil {
    39  		t.Fatal("Open test failed with:", err)
    40  	}
    41  
    42  	// Request a collection that is not present
    43  	nec := pDb.GetColl("non-existent")
    44  	if nec == nil {
    45  		t.Log("Request non-existent collection success")
    46  	}
    47  
    48  	// birinci adlı kolleksiyon oluşturulur
    49  	birinci, err := pDb.CreateColl("birinci")
    50  	if err != nil {
    51  		t.Error("Create birinci failed with:", err)
    52  	}
    53  
    54  	// ikinci adlı kolleksiyon oluşturulur
    55  	_, err = pDb.CreateColl("ikinci")
    56  	if err != nil {
    57  		t.Error("Create ikinci failed with:", err)
    58  	}
    59  
    60  	// üçüncü adlı kolleksiyon oluşturulur
    61  	ucuncu, err := pDb.CreateColl("üçüncü")
    62  	if err != nil {
    63  		t.Error("Create üçüncü failed with:", err)
    64  	}
    65  
    66  	err = pDb.DeleteColl("ikinci")
    67  	if err != nil {
    68  		t.Error("Delete ikinci failed with:", err)
    69  	}
    70  
    71  	// Olmayan bir tane kolleksiyon silmeyi deneriz.
    72  	err = pDb.DeleteColl("hebele")
    73  	if err != nil {
    74  		// bu beklenen bir sonuç
    75  		t.Log("Delete non-existent coll resulted with error as expected. Msg:", err)
    76  	}
    77  
    78  	// Kolleksiyona birkaç tane kayıt ekleriz
    79  	e1 := make(map[string]interface{})
    80  	e1["id"] = 34
    81  	e1["name"] = "deneme"
    82  	e1["user"] = "mert"
    83  	e1["unixtime"] = time.Now().Unix()
    84  
    85  	err = birinci.Add(e1)
    86  	if err != nil {
    87  		t.Fatal("Add(1) Failed with: ", err)
    88  	}
    89  
    90  	e2 := make(map[string]interface{})
    91  	e2["id"] = 35
    92  	e2["name"] = "hasan"
    93  	e2["user"] = "mert"
    94  	e2["unixtime"] = time.Now().Unix()
    95  	err = birinci.Add(e2)
    96  	if err != nil {
    97  		t.Fatal("Add(2) Failed with: ", err)
    98  	}
    99  
   100  	e3 := make(map[string]interface{})
   101  	e3["id"] = 36
   102  	e3["name"] = "Multiline\ndata"
   103  	e3["user"] = "sülüman"
   104  	e3["unixtime"] = time.Now().Unix()
   105  	err = birinci.Add(e3)
   106  	if err != nil {
   107  		t.Fatal("Add(3) Failed with: ", err)
   108  	}
   109  
   110  	e4 := make(map[string]interface{})
   111  	e4["id"] = 40
   112  	e4["name"] = "Mud,ata"
   113  	e4["user"] = "sülümanos 40"
   114  	e4["unixtime"] = time.Now().Unix()
   115  	err = birinci.Add(e4)
   116  	if err != nil {
   117  		t.Fatal("Add(4) Failed with: ", err)
   118  	}
   119  
   120  	// Get the count of 'birinci' collection
   121  	qCount := func(q RecordInstance) bool {
   122  		return true
   123  	}
   124  
   125  	bcount, err := birinci.Count(qCount)
   126  	if err != nil {
   127  		t.Error("Failed to get count: ", err.Error())
   128  	} else {
   129  		t.Log(fmt.Sprintf("Expected count: %d", bcount))
   130  	}
   131  
   132  	t1 := SampleRecordType{
   133  		Id:         12,
   134  		Name:       "First Sample Type Instance",
   135  		ArrayValue: []string{"one", "two", "three"},
   136  		Nested: SampleNestedType{
   137  			IntegerValue: 32,
   138  			StringValue:  "Nested string",
   139  			FloatValue:   32.45,
   140  		},
   141  	}
   142  
   143  	t2 := SampleRecordType{
   144  		Id:         13,
   145  		Name:       "Second Sample Type Instance",
   146  		ArrayValue: []string{"four", "five", "six"},
   147  		Nested: SampleNestedType{
   148  			IntegerValue: 52,
   149  			StringValue:  "Another nested string",
   150  			FloatValue:   12.3456,
   151  		},
   152  	}
   153  
   154  	// Veri sorgulanır:
   155  	// Hatalı sorgulama: Olmayan bir alan istenir
   156  	nper, err := birinci.GetFirst(func(instance RecordInstance) bool {
   157  		return instance["idc"].(float64) > 34
   158  	})
   159  	if err != nil {
   160  		t.Log("Non-existent field error recovery OK. Result:", nper, "  Error:", err)
   161  	}
   162  
   163  	// Normal Sorgulama
   164  	dd, err := birinci.GetFirst(func(instance RecordInstance) bool {
   165  		return instance["id"].(float64) > 34
   166  	})
   167  
   168  	if err != nil {
   169  		t.Fatal("Error querying:", err)
   170  	}
   171  	if dd == nil {
   172  		t.Error("No data returned")
   173  	}
   174  
   175  	t.Logf("GetFirst(id>34) query result: %+v", dd)
   176  
   177  	de, err := birinci.GetAll(func(instance RecordInstance) bool {
   178  		return instance["id"].(float64) > 34
   179  	})
   180  	if err != nil {
   181  		t.Fatal("Error querying:", err)
   182  	}
   183  
   184  	if de == nil {
   185  		t.Error("No data returned")
   186  	} else {
   187  		if len(de) == 0 {
   188  			t.Error("Empty GetAll result set.")
   189  		} else {
   190  			t.Log("GetAll query results:")
   191  			for _, item := range de {
   192  				t.Logf("\t\t id: %.0f", item["id"])
   193  			}
   194  		}
   195  	}
   196  
   197  	// kayıt silme işlemi 36 id'li kayıt silinir.
   198  	dn, err := birinci.DeleteFirst(func(instance RecordInstance) bool {
   199  		return instance["id"].(float64) == 36
   200  	})
   201  	if err != nil {
   202  		t.Fatal("Error querying:", err)
   203  	} else {
   204  		if dn == 1 {
   205  			t.Log("DeleteFirst operation successful.")
   206  		} else {
   207  			t.Error("DeleteFirst operation failed! n=", dn)
   208  		}
   209  	}
   210  
   211  	// Tümünü silme işlemi
   212  	n, err := birinci.DeleteAll(func(instance RecordInstance) bool {
   213  		return instance["id"].(float64) < 40
   214  	})
   215  	if err != nil {
   216  		t.Fatal("Error querying:", err)
   217  	} else {
   218  		t.Logf("DeleteAll operation removed %d records\n", n)
   219  	}
   220  
   221  	// silme işleminden sonra yeniden sorgulama
   222  	dd, err = birinci.GetFirst(func(instance RecordInstance) bool {
   223  		return instance["id"].(float64) > 35
   224  	})
   225  
   226  	if err != nil {
   227  		t.Fatal("Error querying:", err)
   228  	}
   229  
   230  	if dd == nil {
   231  		t.Error("No data returned")
   232  	}
   233  
   234  	t.Logf("GetFirst(id>34) after delete query result (expect id=40): %+v ", dd)
   235  
   236  	// Tümünü ekleme işlemi
   237  	dataArray := []RecordInstance{e1, e2, e3, e4}
   238  
   239  	nAddAll, err := birinci.AddAll(dataArray...)
   240  	if err != nil {
   241  		t.Error("Cannot 'AddAll'", err)
   242  	} else {
   243  		t.Logf("AddAll successful. %d records added.", nAddAll)
   244  	}
   245  
   246  	// Update
   247  	ff := func(instance RecordInstance) bool {
   248  		return instance["id"].(float64) == 34
   249  	}
   250  
   251  	e1["name"] = "ReplaceFirst yapıldı"
   252  	n, err = birinci.ReplaceFirst(ff, e1)
   253  	if err != nil {
   254  		t.Error("Cannot ReplaceFirst:", err)
   255  	} else {
   256  		if n == 1 {
   257  			t.Log("ReplaceFirst successful.")
   258  		} else {
   259  			t.Error("ReplaceFirst did not return 1 as expected!")
   260  		}
   261  	}
   262  
   263  	f2 := func(instance RecordInstance) bool {
   264  		return instance["user"] == "mert"
   265  	}
   266  	e2["user"] = "ReplaceAll Yapıldı"
   267  	n, err = birinci.ReplaceAll(f2, e2)
   268  	if err != nil {
   269  		t.Error("ReplaceAll failed! ", err)
   270  	} else {
   271  		if n == 0 {
   272  			t.Error("ReplaceAll returned 0 records updated. 2 expected")
   273  		} else {
   274  			t.Log("ReplaceAll successful.")
   275  		}
   276  	}
   277  
   278  	f36 := QueryPredicate(func(i RecordInstance) bool {
   279  		return i["id"].(float64) == 36
   280  	})
   281  	fUpdt := UpdateFunc(func(ptrRecord *RecordInstance) *RecordInstance {
   282  		(*ptrRecord)["user"] = "Updated Single"
   283  		return ptrRecord
   284  	})
   285  
   286  	n, err = birinci.UpdateFirst(f36, fUpdt)
   287  	if err != nil {
   288  		t.Error("UpdateFirst failed")
   289  	} else {
   290  		if n == 0 {
   291  			t.Error("UpdateFirst returned 0 records updated. 1 expected")
   292  		} else {
   293  			t.Log("UpdateFirst successful.")
   294  		}
   295  	}
   296  
   297  	f40 := QueryPredicate(func(i RecordInstance) bool {
   298  		return i["id"].(float64) == 40
   299  	})
   300  	fUpdt40 := UpdateFunc(func(ptrRecord *RecordInstance) *RecordInstance {
   301  		(*ptrRecord)["user"] = "Updated All"
   302  		return ptrRecord
   303  	})
   304  
   305  	n, err = birinci.UpdateAll(f40, fUpdt40)
   306  	if err != nil {
   307  		t.Error("UpdateAll failed")
   308  	} else {
   309  		if n == 0 {
   310  			t.Error("UpdateAll returned 0 records updated. 2 expected")
   311  		} else {
   312  			t.Log("UpdateAll successful.")
   313  		}
   314  	}
   315  
   316  	// typed structure tests
   317  	err = ucuncu.Add(t1)
   318  	if err != nil {
   319  		t.Fatal("Failed adding typed structure t1:", err.Error())
   320  	}
   321  
   322  	err = ucuncu.Add(t2)
   323  	if err != nil {
   324  		t.Fatal("Failed adding typed structure t2:", err.Error())
   325  	}
   326  
   327  	t.Log("t1 and t1 Add success")
   328  
   329  	recordAs, err := GetFirstAs[SampleRecordType](ucuncu, func(i *SampleRecordType) bool {
   330  		return i.Id == 13
   331  	})
   332  	if err != nil {
   333  		t.Fatal("Error on generics request:", err.Error())
   334  	} else {
   335  		if recordAs != nil {
   336  			t.Log("GetFirstAs: ", recordAs.Id, recordAs.Name, " Success")
   337  		} else {
   338  			t.Log("GetFirstAs: No records found. Success")
   339  		}
   340  
   341  	}
   342  
   343  	startMark := time.Now()
   344  	recordsAs, err := GetAllAs[SampleRecordType](ucuncu, func(i *SampleRecordType) bool {
   345  		return true // we want all
   346  	})
   347  	if err != nil {
   348  		t.Fatal("Error on generics get all: ", err.Error())
   349  	} else {
   350  		diff := time.Now().Sub(startMark)
   351  		t.Log("Success GetAllAs. Len: ", len(recordsAs), diff)
   352  	}
   353  
   354  	//Query typed structure
   355  	var rt1 SampleRecordType
   356  	var rtPredicate = func(instance interface{}) bool {
   357  		//fmt.Println("type of instance: ", reflect.TypeOf(instance))
   358  		i := instance.(*SampleRecordType) // this typecast is required
   359  		return i.Id == 13
   360  	}
   361  	found, err := ucuncu.GetFirstAsInterface(rtPredicate, &rt1)
   362  	if err != nil {
   363  		t.Fatal("Error on interface request:", err.Error())
   364  	}
   365  
   366  	if found {
   367  		t.Logf("Record found: %+v", rt1)
   368  	} else {
   369  		t.Log("Record not found.")
   370  	}
   371  
   372  	startMark = time.Now()
   373  	var rt2Predicate = func(instance interface{}) bool {
   374  		//fmt.Println("type of instance: ", reflect.TypeOf(instance))
   375  		//i := instance.(*SampleRecordType) // this typecast is required
   376  		return true
   377  	}
   378  
   379  	var resultCollection = make([]SampleRecordType, 0)
   380  	var rt2FoundCallback = func(instance interface{}) bool {
   381  		i := *instance.(*SampleRecordType)
   382  		resultCollection = append(resultCollection, i)
   383  		return true
   384  	}
   385  
   386  	n, err = ucuncu.GetAllAsInterface(rt2Predicate, rt2FoundCallback, &rt1)
   387  	if err != nil {
   388  		t.Fatal("Error on interface request:", err.Error())
   389  	}
   390  
   391  	if n > 0 {
   392  		diff := time.Now().Sub(startMark)
   393  		t.Logf("%d Records found: %T, %s", n, resultCollection, diff)
   394  		for _, k := range resultCollection {
   395  			t.Logf("\t ->%T : %+v", k, k)
   396  		}
   397  	} else {
   398  		t.Log("Record not found.")
   399  	}
   400  
   401  }
   402  
   403  func BenchmarkMemAndGenerics(b *testing.B) {
   404  	b.ReportAllocs()
   405  	pDb, err := Open("/tmp/arnedb", "testdb")
   406  	if pDb == nil || err != nil {
   407  		b.Fatal("Open test failed with:", err)
   408  	}
   409  
   410  	ucuncu := pDb.GetColl("üçüncü")
   411  	if ucuncu == nil {
   412  		b.Error("Create üçüncü failed with:", err)
   413  	}
   414  
   415  	recordAs, err := GetFirstAs[SampleRecordType](ucuncu, func(i *SampleRecordType) bool {
   416  		return i.Id == 36
   417  	})
   418  	if err != nil {
   419  		b.Fatal("Error on interface request:", err.Error())
   420  	} else {
   421  		b.Log("GetFirstAs: ", recordAs.Id, recordAs.Name, " Success")
   422  	}
   423  
   424  }