diff --git a/README.md b/README.md index 7e41a4c..e181109 100644 --- a/README.md +++ b/README.md @@ -214,7 +214,7 @@ var dest []struct { Films []struct { model.Film Language model.Language - Category []model.Category + Categories []model.Category } } ``` @@ -263,7 +263,7 @@ fmt.Println(string(jsonText)) "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 8, "Name": "Family", @@ -298,7 +298,7 @@ fmt.Println(string(jsonText)) "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 6, "Name": "Documentary", @@ -319,8 +319,8 @@ In that case we can reuse above statement `stmt`, and just change our destinatio var dest2 []struct { model.Category - Film []model.Film - Actor []model.Actor + Films []model.Film + Actors []model.Actor } err = stmt.Query(db, &dest2) @@ -335,7 +335,7 @@ handleError(err) "CategoryID": 8, "Name": "Family", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 499, "Title": "King Evolution", @@ -367,7 +367,7 @@ handleError(err) "Fulltext": "'bake':1 'cleopatra':2 'drama':5 'forens':8 'husband':12 'monasteri':20 'must':14 'overcom':15 'psychologist':9 'stun':4 'waitress':17" } ], - "Actor": [ + "Actors": [ { "ActorID": 1, "FirstName": "Penelope", @@ -418,6 +418,14 @@ handleError(err) Complete code example can be found at [./examples/quick-start/quick-start.go](./examples/quick-start/quick-start.go) + +This example represent probably the most common use case, but Jet offers much more. Like subqueries, INSERT, UPDATE, DELETE, LOCK statements and much more. +Detail info can be found at project wiki page. + +# Benefits + +TODO: + # Contributing # Versioning diff --git a/examples/quick-start/quick-start.go b/examples/quick-start/quick-start.go index 31d1fde..daaf209 100644 --- a/examples/quick-start/quick-start.go +++ b/examples/quick-start/quick-start.go @@ -57,8 +57,8 @@ func main() { model.Actor Films []struct { model.Film - Language model.Language - Category []model.Category + Language model.Language + Categories []model.Category } } @@ -72,8 +72,8 @@ func main() { var dest2 []struct { model.Category - Film []model.Film - Actor []model.Actor + Films []model.Film + Actors []model.Actor } err = stmt.Query(db, &dest2) diff --git a/execution/execution.go b/execution/execution.go index ecde8d7..587d489 100644 --- a/execution/execution.go +++ b/execution/execution.go @@ -139,7 +139,7 @@ func mapRowToSlice(scanContext *scanContext, groupKey string, slicePtrValue refl if isGoBaseType(sliceElemType) { index := 0 if structField != nil { - tableName, columnName := getRefTableNameFrom(structField) + tableName, columnName := getRefAlias(structField) index = scanContext.columnIndex(tableName, columnName) if index < 0 { @@ -297,7 +297,7 @@ func mapRowToStruct(scanContext *scanContext, groupKey string, structPtrValue re structType := structPtrValue.Type().Elem() structValue := structPtrValue.Elem() - tableName, _ := getRefTableNameFrom(structField) + tableName, _ := getRefAlias(structField) if tableName == "" { tableName = structType.Name() @@ -365,30 +365,26 @@ func mapRowToStruct(scanContext *scanContext, groupKey string, structPtrValue re return } -func getRefTableNameFrom(structField *reflect.StructField) (table, column string) { +func getRefAlias(structField *reflect.StructField) (table, column string) { if structField == nil { return } - sqlTag := structField.Tag.Get("sql") + aliasTag := structField.Tag.Get("alias") - if sqlTag != "" { - tagInfo := tagInfo(sqlTag) - - return tagInfo.table, tagInfo.column + if aliasTag == "" { + return } - if !structField.Anonymous { - return structField.Name, "" + aliasParts := strings.Split(aliasTag, ".") + + table = aliasParts[0] + + if len(aliasParts) > 1 { + column = aliasParts[1] } - fieldType := indirectType(structField.Type) - - if fieldType.Kind() == reflect.Slice { - fieldType = fieldType.Elem() - } - - return fieldType.Name(), "" + return } func initializeValueIfNilPtr(value reflect.Value) { @@ -612,7 +608,7 @@ func (s *scanContext) constructGroupKey(groupKeyInfo groupKeyInfo) string { } func (s *scanContext) getGroupKeyInfo(structType reflect.Type, structField *reflect.StructField) groupKeyInfo { - tableName, _ := getRefTableNameFrom(structField) + tableName, _ := getRefAlias(structField) if tableName == "" { tableName = structType.Name() @@ -638,7 +634,7 @@ func (s *scanContext) getGroupKeyInfo(structType reflect.Type, structField *refl if len(subType.indexes) != 0 || len(subType.subTypes) != 0 { ret.subTypes = append(ret.subTypes, subType) } - } else if tagInfo(field.Tag.Get("sql")).isPrimaryKey { + } else if isPrimaryKey(field) { index := s.columnIndex(tableName, field.Name) if index < 0 { @@ -741,35 +737,11 @@ func (s *scanContext) rowElemValuePtr(index int) reflect.Value { return newElem } -type sqlTagInfo struct { - isPrimaryKey bool - table string - column string -} +func isPrimaryKey(field reflect.StructField) bool { -func tagInfo(tag string) sqlTagInfo { - sqlTags := strings.Split(tag, ",") - tagMap := map[string]string{} + sqlTag := field.Tag.Get("sql") - for _, tag := range sqlTags { - tagParts := strings.Split(tag, ":") - - tagKey := tagParts[0] - tagValue := "" - if len(tagParts) > 1 { - tagValue = tagParts[1] - } - - tagMap[tagKey] = tagValue - } - - _, isPrimaryKey := tagMap["primary_key"] - - return sqlTagInfo{ - isPrimaryKey: isPrimaryKey, - table: tagMap["table"], - column: tagMap["column"], - } + return sqlTag == "primary_key" } func indirectType(reflectType reflect.Type) reflect.Type { diff --git a/tests/chinook_db_test.go b/tests/chinook_db_test.go index 86fb40b..1576dfc 100644 --- a/tests/chinook_db_test.go +++ b/tests/chinook_db_test.go @@ -83,7 +83,7 @@ func TestJoinEverything(t *testing.T) { Genre model.Genre // track genre MediaType model.MediaType // track media type - Playlists []model.Playlist `sql:"table:Playlist"` // list of playlist where track is used + Playlists []model.Playlist // list of playlist where track is used Invoices []struct { // list of invoices where track occurs model.Invoice @@ -94,7 +94,7 @@ func TestJoinEverything(t *testing.T) { Employee *struct { // employee data for customer if exists model.Employee - Manager *model.Employee + Manager *model.Employee `alias:"Manager"` } } } diff --git a/tests/sample_test.go b/tests/sample_test.go index 9264cd6..93590c1 100644 --- a/tests/sample_test.go +++ b/tests/sample_test.go @@ -5,15 +5,15 @@ import ( "github.com/davecgh/go-spew/spew" . "github.com/go-jet/jet" "github.com/go-jet/jet/tests/.gentestdata/jetdb/test_sample/model" - "github.com/go-jet/jet/tests/.gentestdata/jetdb/test_sample/table" + . "github.com/go-jet/jet/tests/.gentestdata/jetdb/test_sample/table" "gotest.tools/assert" "testing" ) func TestUUIDType(t *testing.T) { - query := table.AllTypes. - SELECT(table.AllTypes.AllColumns). - WHERE(table.AllTypes.UUID.EQ(String("a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11"))) + query := AllTypes. + SELECT(AllTypes.AllColumns). + WHERE(AllTypes.UUID.EQ(String("a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11"))) queryStr, args, err := query.Sql() @@ -28,8 +28,8 @@ func TestUUIDType(t *testing.T) { } func TestEnumType(t *testing.T) { - query := table.Person. - SELECT(table.Person.AllColumns) + query := Person. + SELECT(Person.AllColumns) queryStr, args, err := query.Sql() @@ -56,3 +56,63 @@ func TestEnumType(t *testing.T) { spew.Dump(result2) } + +func TestSelecSelfJoin1(t *testing.T) { + + var expectedSql = ` +SELECT employee.employee_id AS "employee.employee_id", + employee.first_name AS "employee.first_name", + employee.last_name AS "employee.last_name", + employee.employment_date AS "employee.employment_date", + employee.manager_id AS "employee.manager_id", + manager.employee_id AS "manager.employee_id", + manager.first_name AS "manager.first_name", + manager.last_name AS "manager.last_name", + manager.employment_date AS "manager.employment_date", + manager.manager_id AS "manager.manager_id" +FROM test_sample.employee + LEFT JOIN test_sample.employee AS manager ON (manager.employee_id = employee.manager_id) +ORDER BY employee.employee_id; +` + + manager := Employee.AS("manager") + query := Employee. + LEFT_JOIN(manager, manager.EmployeeID.EQ(Employee.ManagerID)). + SELECT( + Employee.AllColumns, + manager.AllColumns, + ). + ORDER_BY(Employee.EmployeeID) + + assertStatementSql(t, query, expectedSql) + + type Manager model.Employee + + var dest []struct { + model.Employee + + Manager *Manager + } + + err := query.Query(db, &dest) + + assert.NilError(t, err) + assert.Equal(t, len(dest), 8) + assert.DeepEqual(t, dest[0].Employee, model.Employee{ + EmployeeID: 1, + FirstName: "Windy", + LastName: "Hays", + EmploymentDate: timestampWithTimeZone("1999-01-08 04:05:06.1 +0100 CET", 1), + ManagerID: nil, + }) + + assert.Assert(t, dest[0].Manager == nil) + + assert.DeepEqual(t, dest[7].Employee, model.Employee{ + EmployeeID: 8, + FirstName: "Salley", + LastName: "Lester", + EmploymentDate: timestampWithTimeZone("1999-01-08 04:05:06 +0100 CET", 1), + ManagerID: int32Ptr(3), + }) +} diff --git a/tests/scan_test.go b/tests/scan_test.go index 7c0e36d..75fc8f7 100644 --- a/tests/scan_test.go +++ b/tests/scan_test.go @@ -144,7 +144,7 @@ func TestScanToStruct(t *testing.T) { t.Run("custom struct", func(t *testing.T) { type Inventory struct { - InventoryID *int32 `sql:"unique"` + InventoryID *int32 `sql:"primary_key"` FilmID int16 StoreID *int16 } @@ -373,8 +373,8 @@ func TestScanToNestedStruct(t *testing.T) { model.Film Language model.Language - Language2 *model.Language - Language3 *Language3 `sql:"table:language"` + Language2 *model.Language `alias:"Language.*"` + Language3 *Language3 `alias:"language"` Lang struct { model.Language } @@ -394,7 +394,7 @@ func TestScanToNestedStruct(t *testing.T) { assert.DeepEqual(t, dest.Film.Language, language1) assert.DeepEqual(t, dest.Film.Lang.Language, language1) assert.DeepEqual(t, dest.Film.Lang2.Language, language1) - assert.DeepEqual(t, dest.Film.Language2, (*model.Language)(nil)) + assert.DeepEqual(t, dest.Film.Language2, &language1) assert.DeepEqual(t, model.Language(*dest.Film.Language3), language1) }) } @@ -439,14 +439,18 @@ func TestScanToSlice(t *testing.T) { query := Inventory. INNER_JOIN(Film, Inventory.FilmID.EQ(Film.FilmID)). INNER_JOIN(Store, Inventory.StoreID.EQ(Store.StoreID)). - SELECT(Inventory.AllColumns, Film.AllColumns, Store.AllColumns). + SELECT( + Inventory.AllColumns, + Film.AllColumns, + Store.AllColumns, + ). ORDER_BY(Inventory.InventoryID). LIMIT(10) t.Run("struct with slice of ints", func(t *testing.T) { var dest struct { model.Film - IDs []int32 `sql:"table:inventory,column:inventory_id"` + IDs []int32 `alias:"inventory.inventory_id"` } err := query.Query(db, &dest) @@ -463,7 +467,7 @@ func TestScanToSlice(t *testing.T) { t.Run("slice of structs with slice of ints", func(t *testing.T) { var dest []struct { model.Film - IDs []int32 `sql:"table:inventory,column:inventory_id"` + IDs []int32 `alias:"Inventory.inventory_id"` } err := query.Query(db, &dest) @@ -479,7 +483,7 @@ func TestScanToSlice(t *testing.T) { t.Run("slice of structs with slice of pointer to ints", func(t *testing.T) { var dest []struct { model.Film - IDs []*int32 `sql:"table:inventory,column:inventory_id"` + IDs []*int32 `alias:"inventory.InventoryId"` } err := query.Query(db, &dest) diff --git a/tests/select_test.go b/tests/select_test.go index 0ed8a0c..13cc679 100644 --- a/tests/select_test.go +++ b/tests/select_test.go @@ -7,8 +7,6 @@ import ( "github.com/go-jet/jet/tests/.gentestdata/jetdb/dvds/enum" "github.com/go-jet/jet/tests/.gentestdata/jetdb/dvds/model" . "github.com/go-jet/jet/tests/.gentestdata/jetdb/dvds/table" - model2 "github.com/go-jet/jet/tests/.gentestdata/jetdb/test_sample/model" - . "github.com/go-jet/jet/tests/.gentestdata/jetdb/test_sample/table" "gotest.tools/assert" "testing" ) @@ -490,61 +488,6 @@ LIMIT 1000; assert.NilError(t, err) } -func TestSelecSelfJoin1(t *testing.T) { - - var expectedSql = ` -SELECT employee.employee_id AS "employee.employee_id", - employee.first_name AS "employee.first_name", - employee.last_name AS "employee.last_name", - employee.employment_date AS "employee.employment_date", - employee.manager_id AS "employee.manager_id", - manager.employee_id AS "manager.employee_id", - manager.first_name AS "manager.first_name", - manager.last_name AS "manager.last_name", - manager.employment_date AS "manager.employment_date", - manager.manager_id AS "manager.manager_id" -FROM test_sample.employee - LEFT JOIN test_sample.employee AS manager ON (manager.employee_id = employee.manager_id) -ORDER BY employee.employee_id; -` - - manager := Employee.AS("manager") - query := Employee. - LEFT_JOIN(manager, manager.EmployeeID.EQ(Employee.ManagerID)). - SELECT(Employee.AllColumns, manager.AllColumns). - ORDER_BY(Employee.EmployeeID) - - assertStatementSql(t, query, expectedSql) - - var dest []struct { - model2.Employee - - Manager *model2.Employee - } - - err := query.Query(db, &dest) - - assert.NilError(t, err) - assert.Equal(t, len(dest), 8) - assert.DeepEqual(t, dest[0].Employee, model2.Employee{ - EmployeeID: 1, - FirstName: "Windy", - LastName: "Hays", - EmploymentDate: timestampWithTimeZone("1999-01-08 04:05:06.1 +0100 CET", 1), - ManagerID: nil, - }) - - assert.Assert(t, dest[0].Manager == nil) - - assert.DeepEqual(t, dest[7].Employee, model2.Employee{ - EmployeeID: 8, - FirstName: "Salley", - LastName: "Lester", - EmploymentDate: timestampWithTimeZone("1999-01-08 04:05:06 +0100 CET", 1), - ManagerID: int32Ptr(3), - }) -} - func TestSelectSelfJoin(t *testing.T) { expectedSql := ` SELECT f1.film_id AS "f1.film_id", @@ -647,63 +590,6 @@ LIMIT 1000; assert.DeepEqual(t, films[0], thesameLengthFilms{"Alien Center", "Iron Moon", 46}) } -// -//type Manager staff -// -//type staff struct { -// StaffID int32 `sql:"unique"` -// FirstName string -// LastName string -// //Address *model.Address -// //Email *string -// //StoreID int16 -// //Active bool -// //Username string -// //Password *string -// //LastUpdate time.Time -// *Manager //`sqlbuilder:"manager"` -//} -// -//func TestSelectSelfReferenceType(t *testing.T) { -// -// expectedSql := ` -//SELECT DISTINCT staff.staff_id AS "staff.staff_id", -// staff.first_name AS "staff.first_name", -// staff.last_name AS "staff.last_name", -// address.address_id AS "address.address_id", -// address.address AS "address.address", -// address.address2 AS "address.address2", -// address.district AS "address.district", -// address.city_id AS "address.city_id", -// address.postal_code AS "address.postal_code", -// address.phone AS "address.phone", -// address.last_update AS "address.last_update", -// manager.staff_id AS "manager.staff_id", -// manager.first_name AS "manager.first_name" -//FROM dvds.staff -// JOIN dvds.address ON staff.address_id = address.address_id -// JOIN dvds.staff AS manager ON staff.staff_id = manager.staff_id; -//` -// manager := Staff.AS("manager") -// -// query := Staff. -// innerJoin(Address, Staff.AddressID.EQ(Address.AddressID)). -// innerJoin(manager, Staff.StaffID.EQ(manager.StaffID)). -// SELECT(Staff.StaffID, Staff.FirstName, Staff.LastName, Address.AllColumns, manager.StaffID, manager.FirstName). -// DISTINCT() -// -// assertStatementSql(t, query, expectedSql) -// -// staffs := []staff{} -// -// err := query.Query(db, &staffs) -// -// assert.NilError(t, err) -// -// fmt.Println(query.DebugSql()) -// //spew.Dump(staffs) -//} - func TestSubQuery(t *testing.T) { expectedQuery := ` SELECT actor.actor_id AS "actor.actor_id", @@ -1219,7 +1105,7 @@ FOR` } } -func TestForQuickStart(t *testing.T) { +func TestQuickStart(t *testing.T) { var expectedSql = ` SELECT actor.actor_id AS "actor.actor_id", @@ -1286,24 +1172,90 @@ ORDER BY actor.actor_id ASC, film.film_id ASC; Language model.Language - Category []model.Category + Categories []model.Category } } err := stmt.Query(db, &dest) assert.NilError(t, err) + //jsonSave("./testdata/quick-start-dest.json", dest) assertJson(t, "./testdata/quick-start-dest.json", dest) var dest2 []struct { model.Category - Film []model.Film - Actor []model.Actor + Films []model.Film + Actors []model.Actor } err = stmt.Query(db, &dest2) assert.NilError(t, err) + //jsonSave("./testdata/quick-start-dest2.json", dest2) + assertJson(t, "./testdata/quick-start-dest2.json", dest2) +} + +func TestQuickStartWithSubQueries(t *testing.T) { + filmLogerThan180 := Film. + SELECT(Film.AllColumns). + WHERE(Film.Length.GT(Int(180))). + AsTable("films") + + filmId := Film.FilmID.From(filmLogerThan180) + filmLanguageId := Film.LanguageID.From(filmLogerThan180) + + categoriesNotAction := Category. + SELECT(Category.AllColumns). + WHERE(Category.Name.NOT_EQ(String("Action"))). + AsTable("categories") + + categoryId := Category.CategoryID.From(categoriesNotAction) + + stmt := Actor. + INNER_JOIN(FilmActor, Actor.ActorID.EQ(FilmActor.ActorID)). + INNER_JOIN(filmLogerThan180, filmId.EQ(FilmActor.FilmID)). + INNER_JOIN(Language, Language.LanguageID.EQ(filmLanguageId)). + INNER_JOIN(FilmCategory, FilmCategory.FilmID.EQ(filmId)). + INNER_JOIN(categoriesNotAction, categoryId.EQ(FilmCategory.CategoryID)). + SELECT( + Actor.AllColumns, + filmLogerThan180.AllColumns(), + Language.AllColumns, + categoriesNotAction.AllColumns(), + ).ORDER_BY( + Actor.ActorID.ASC(), + filmId.ASC(), + ) + + var dest []struct { + model.Actor + + Films []struct { + model.Film + + Language model.Language + + Categories []model.Category + } + } + + err := stmt.Query(db, &dest) + assert.NilError(t, err) + + //jsonSave("./testdata/quick-start-dest.json", dest) + assertJson(t, "./testdata/quick-start-dest.json", dest) + + var dest2 []struct { + model.Category + + Films []model.Film + Actors []model.Actor + } + + err = stmt.Query(db, &dest2) + assert.NilError(t, err) + + //jsonSave("./testdata/quick-start-dest2.json", dest2) assertJson(t, "./testdata/quick-start-dest2.json", dest2) } diff --git a/tests/testdata/quick-start-dest.json b/tests/testdata/quick-start-dest.json index 7ce04d9..050a6fb 100644 --- a/tests/testdata/quick-start-dest.json +++ b/tests/testdata/quick-start-dest.json @@ -24,7 +24,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 8, "Name": "Family", @@ -59,7 +59,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 6, "Name": "Documentary", @@ -94,7 +94,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -129,7 +129,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 13, "Name": "New", @@ -156,7 +156,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 11, "Name": "Horror", @@ -183,7 +183,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 14, "Name": "Sci-Fi", @@ -210,7 +210,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -245,7 +245,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -272,7 +272,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 13, "Name": "New", @@ -307,7 +307,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -342,7 +342,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -369,7 +369,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 14, "Name": "Sci-Fi", @@ -404,7 +404,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 14, "Name": "Sci-Fi", @@ -431,7 +431,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -466,7 +466,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -501,7 +501,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 5, "Name": "Comedy", @@ -528,7 +528,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 7, "Name": "Drama", @@ -555,7 +555,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -590,7 +590,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 8, "Name": "Family", @@ -625,7 +625,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -660,7 +660,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -695,7 +695,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -722,7 +722,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -757,7 +757,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 13, "Name": "New", @@ -784,7 +784,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -819,7 +819,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 6, "Name": "Documentary", @@ -854,7 +854,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -881,7 +881,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 6, "Name": "Documentary", @@ -916,7 +916,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 7, "Name": "Drama", @@ -951,7 +951,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 5, "Name": "Comedy", @@ -986,7 +986,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 14, "Name": "Sci-Fi", @@ -1021,7 +1021,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -1048,7 +1048,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 8, "Name": "Family", @@ -1083,7 +1083,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -1118,7 +1118,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 11, "Name": "Horror", @@ -1153,7 +1153,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -1188,7 +1188,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -1223,7 +1223,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 11, "Name": "Horror", @@ -1250,7 +1250,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 11, "Name": "Horror", @@ -1285,7 +1285,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 4, "Name": "Classics", @@ -1320,7 +1320,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -1347,7 +1347,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 13, "Name": "New", @@ -1382,7 +1382,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -1409,7 +1409,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -1436,7 +1436,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -1471,7 +1471,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -1506,7 +1506,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 6, "Name": "Documentary", @@ -1541,7 +1541,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -1576,7 +1576,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -1611,7 +1611,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 13, "Name": "New", @@ -1646,7 +1646,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -1681,7 +1681,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 13, "Name": "New", @@ -1716,7 +1716,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 13, "Name": "New", @@ -1743,7 +1743,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -1778,7 +1778,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -1805,7 +1805,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -1840,7 +1840,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 11, "Name": "Horror", @@ -1867,7 +1867,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -1902,7 +1902,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -1929,7 +1929,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -1956,7 +1956,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -1991,7 +1991,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -2026,7 +2026,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 11, "Name": "Horror", @@ -2061,7 +2061,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -2096,7 +2096,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 8, "Name": "Family", @@ -2131,7 +2131,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 16, "Name": "Travel", @@ -2166,7 +2166,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -2201,7 +2201,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 16, "Name": "Travel", @@ -2236,7 +2236,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 5, "Name": "Comedy", @@ -2271,7 +2271,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -2306,7 +2306,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -2333,7 +2333,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 7, "Name": "Drama", @@ -2368,7 +2368,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 13, "Name": "New", @@ -2395,7 +2395,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -2430,7 +2430,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 6, "Name": "Documentary", @@ -2465,7 +2465,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -2500,7 +2500,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -2535,7 +2535,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -2570,7 +2570,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 5, "Name": "Comedy", @@ -2597,7 +2597,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -2624,7 +2624,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 7, "Name": "Drama", @@ -2659,7 +2659,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -2686,7 +2686,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 14, "Name": "Sci-Fi", @@ -2721,7 +2721,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 7, "Name": "Drama", @@ -2756,7 +2756,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 7, "Name": "Drama", @@ -2791,7 +2791,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -2818,7 +2818,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -2853,7 +2853,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -2880,7 +2880,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 5, "Name": "Comedy", @@ -2915,7 +2915,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 16, "Name": "Travel", @@ -2950,7 +2950,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 5, "Name": "Comedy", @@ -2977,7 +2977,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -3012,7 +3012,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 16, "Name": "Travel", @@ -3047,7 +3047,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -3082,7 +3082,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -3109,7 +3109,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 5, "Name": "Comedy", @@ -3136,7 +3136,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 6, "Name": "Documentary", @@ -3171,7 +3171,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -3206,7 +3206,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -3241,7 +3241,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 6, "Name": "Documentary", @@ -3276,7 +3276,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 14, "Name": "Sci-Fi", @@ -3311,7 +3311,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -3346,7 +3346,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -3381,7 +3381,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -3416,7 +3416,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -3443,7 +3443,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 8, "Name": "Family", @@ -3478,7 +3478,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 13, "Name": "New", @@ -3513,7 +3513,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -3540,7 +3540,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -3575,7 +3575,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -3610,7 +3610,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 5, "Name": "Comedy", @@ -3645,7 +3645,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -3680,7 +3680,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -3715,7 +3715,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -3750,7 +3750,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -3785,7 +3785,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -3820,7 +3820,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -3855,7 +3855,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -3882,7 +3882,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -3917,7 +3917,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -3944,7 +3944,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -3971,7 +3971,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -3998,7 +3998,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 16, "Name": "Travel", @@ -4033,7 +4033,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 7, "Name": "Drama", @@ -4068,7 +4068,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -4103,7 +4103,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -4138,7 +4138,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 4, "Name": "Classics", @@ -4165,7 +4165,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 14, "Name": "Sci-Fi", @@ -4200,7 +4200,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -4227,7 +4227,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -4262,7 +4262,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -4297,7 +4297,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -4324,7 +4324,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -4351,7 +4351,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -4386,7 +4386,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 11, "Name": "Horror", @@ -4413,7 +4413,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -4440,7 +4440,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 11, "Name": "Horror", @@ -4467,7 +4467,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 6, "Name": "Documentary", @@ -4502,7 +4502,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 7, "Name": "Drama", @@ -4537,7 +4537,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -4572,7 +4572,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 13, "Name": "New", @@ -4607,7 +4607,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 4, "Name": "Classics", @@ -4634,7 +4634,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -4661,7 +4661,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 6, "Name": "Documentary", @@ -4696,7 +4696,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -4731,7 +4731,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 7, "Name": "Drama", @@ -4766,7 +4766,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -4801,7 +4801,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -4828,7 +4828,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -4863,7 +4863,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -4898,7 +4898,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 4, "Name": "Classics", @@ -4925,7 +4925,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -4952,7 +4952,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 6, "Name": "Documentary", @@ -4987,7 +4987,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 16, "Name": "Travel", @@ -5022,7 +5022,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 16, "Name": "Travel", @@ -5057,7 +5057,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -5084,7 +5084,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -5119,7 +5119,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 16, "Name": "Travel", @@ -5154,7 +5154,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 13, "Name": "New", @@ -5189,7 +5189,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 13, "Name": "New", @@ -5224,7 +5224,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 11, "Name": "Horror", @@ -5251,7 +5251,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 14, "Name": "Sci-Fi", @@ -5286,7 +5286,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 16, "Name": "Travel", @@ -5313,7 +5313,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -5348,7 +5348,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 16, "Name": "Travel", @@ -5383,7 +5383,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -5418,7 +5418,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -5445,7 +5445,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 6, "Name": "Documentary", @@ -5480,7 +5480,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 9, "Name": "Foreign", @@ -5507,7 +5507,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 8, "Name": "Family", @@ -5542,7 +5542,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 5, "Name": "Comedy", @@ -5577,7 +5577,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -5612,7 +5612,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -5647,7 +5647,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 12, "Name": "Music", @@ -5682,7 +5682,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -5717,7 +5717,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -5744,7 +5744,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 16, "Name": "Travel", @@ -5779,7 +5779,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -5806,7 +5806,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 15, "Name": "Sports", @@ -5841,7 +5841,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 7, "Name": "Drama", @@ -5876,7 +5876,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 13, "Name": "New", @@ -5911,7 +5911,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -5938,7 +5938,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 8, "Name": "Family", @@ -5965,7 +5965,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 10, "Name": "Games", @@ -5992,7 +5992,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 14, "Name": "Sci-Fi", @@ -6019,7 +6019,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", @@ -6054,7 +6054,7 @@ "Name": "English ", "LastUpdate": "2006-02-15T10:02:19Z" }, - "Category": [ + "Categories": [ { "CategoryID": 2, "Name": "Animation", diff --git a/tests/testdata/quick-start-dest2.json b/tests/testdata/quick-start-dest2.json index 4b601e7..095bd0c 100644 --- a/tests/testdata/quick-start-dest2.json +++ b/tests/testdata/quick-start-dest2.json @@ -3,7 +3,7 @@ "CategoryID": 8, "Name": "Family", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 499, "Title": "King Evolution", @@ -35,7 +35,7 @@ "Fulltext": "'bake':1 'cleopatra':2 'drama':5 'forens':8 'husband':12 'monasteri':20 'must':14 'overcom':15 'psychologist':9 'stun':4 'waitress':17" } ], - "Actor": [ + "Actors": [ { "ActorID": 1, "FirstName": "Penelope", @@ -84,7 +84,7 @@ "CategoryID": 6, "Name": "Documentary", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 996, "Title": "Young Language", @@ -116,7 +116,7 @@ "Fulltext": "'ancient':20 'awe':5 'awe-inspir':4 'confront':16 'epistl':7 'feminist':13 'inspir':6 'japan':21 'must':15 'pioneer':18 'teacher':10 'turn':2 'wife':1" } ], - "Actor": [ + "Actors": [ { "ActorID": 3, "FirstName": "Ed", @@ -189,7 +189,7 @@ "CategoryID": 12, "Name": "Music", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 721, "Title": "Reds Pocus", @@ -236,7 +236,7 @@ "Fulltext": "'car':8 'confront':14 'duck':2 'fate':4 'monasteri':19 'must':13 'reflect':5 'scalawag':1 'teacher':11 'waitress':16" } ], - "Actor": [ + "Actors": [ { "ActorID": 4, "FirstName": "Jennifer", @@ -339,7 +339,7 @@ "CategoryID": 13, "Name": "New", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 340, "Title": "Frontier Cabin", @@ -386,7 +386,7 @@ "Fulltext": "'abandon':19 'boat':8,16 'documentari':5 'fun':20 'hous':21 'man':11 'meet':14 'must':13 'runaway':1 'tenenbaum':2 'thought':4" } ], - "Actor": [ + "Actors": [ { "ActorID": 5, "FirstName": "Johnny", @@ -471,7 +471,7 @@ "CategoryID": 11, "Name": "Horror", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 535, "Title": "Love Suicides", @@ -503,7 +503,7 @@ "Fulltext": "'analyz':1 'chef':12 'desert':21 'display':5 'explor':8 'feminist':17 'hoosier':2 'must':14 'overcom':15 'pastri':11 'sahara':20 'thought':4" } ], - "Actor": [ + "Actors": [ { "ActorID": 5, "FirstName": "Johnny", @@ -552,7 +552,7 @@ "CategoryID": 14, "Name": "Sci-Fi", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 817, "Title": "Soldiers Evolution", @@ -569,7 +569,7 @@ "Fulltext": "'confront':15 'evolut':2 'first':20 'lacklustur':4 'man':21 'must':14 'panorama':5 'pioneer':12 'shark':9 'soldier':1 'space':22 'station':23 'student':17" } ], - "Actor": [ + "Actors": [ { "ActorID": 5, "FirstName": "Johnny", @@ -630,7 +630,7 @@ "CategoryID": 15, "Name": "Sports", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 841, "Title": "Star Operation", @@ -677,7 +677,7 @@ "Fulltext": "'ancient':19 'china':20 'control':2 'documentari':5 'face':14 'feminist':11 'husband':8 'mad':16 'must':13 'scientist':17 'smoochi':1 'thrill':4" } ], - "Actor": [ + "Actors": [ { "ActorID": 5, "FirstName": "Johnny", @@ -774,7 +774,7 @@ "CategoryID": 2, "Name": "Animation", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 510, "Title": "Lawless Vision", @@ -851,7 +851,7 @@ "Fulltext": "'ancient':18 'battl':14 'boat':11 'china':19 'drama':5 'feminist':16 'must':13 'pond':1 'seattl':2 'stun':4 'teacher':8" } ], - "Actor": [ + "Actors": [ { "ActorID": 9, "FirstName": "Joe", @@ -996,7 +996,7 @@ "CategoryID": 10, "Name": "Games", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 597, "Title": "Moonwalker Fool", @@ -1058,7 +1058,7 @@ "Fulltext": "'battl':15 'california':19 'chicago':1 'cow':9 'fate':4 'mad':8 'must':14 'north':2 'student':17 'waitress':12 'yarn':5" } ], - "Actor": [ + "Actors": [ { "ActorID": 11, "FirstName": "Zero", @@ -1209,7 +1209,7 @@ "CategoryID": 5, "Name": "Comedy", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 182, "Title": "Control Anthem", @@ -1256,7 +1256,7 @@ "Fulltext": "'ancient':21 'car':10 'fast':5 'fast-pac':4 'japan':22 'kill':17 'mad':13 'must':16 'pace':6 'scientist':14 'searcher':1 'tale':7 'wait':2 'woman':19" } ], - "Actor": [ + "Actors": [ { "ActorID": 19, "FirstName": "Bob", @@ -1317,7 +1317,7 @@ "CategoryID": 7, "Name": "Drama", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 473, "Title": "Jacket Frisco", @@ -1334,7 +1334,7 @@ "Fulltext": "'baloon':20 'chef':17 'conquer':14 'frisco':2 'husband':11 'insight':4 'jacket':1 'must':13 'pastri':16 'reflect':5 'woman':8" } ], - "Actor": [ + "Actors": [ { "ActorID": 19, "FirstName": "Bob", @@ -1401,7 +1401,7 @@ "CategoryID": 9, "Name": "Foreign", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 435, "Title": "Hotel Happiness", @@ -1478,7 +1478,7 @@ "Fulltext": "'ancient':22 'break':2 'charact':7 'chef':20 'crystal':1 'explor':14 'face':17 'fast':5 'fast-pac':4 'feminist':11 'japan':23 'must':16 'pace':6 'pastri':19 'studi':8" } ], - "Actor": [ + "Actors": [ { "ActorID": 23, "FirstName": "Sandra", @@ -1617,7 +1617,7 @@ "CategoryID": 4, "Name": "Classics", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 180, "Title": "Conspiracy Spirit", @@ -1634,7 +1634,7 @@ "Fulltext": "'abandon':21 'awe':5 'awe-inspir':4 'conquer':16 'conspiraci':1 'crocodil':18 'frisbe':13 'inspir':6 'mine':22 'must':15 'shaft':23 'spirit':2 'stori':7 'student':10" } ], - "Actor": [ + "Actors": [ { "ActorID": 43, "FirstName": "Kirk", @@ -1665,7 +1665,7 @@ "CategoryID": 16, "Name": "Travel", "LastUpdate": "2006-02-15T09:46:27Z", - "Film": [ + "Films": [ { "FilmID": 609, "Title": "Muscle Bright", @@ -1697,7 +1697,7 @@ "Fulltext": "'baloon':21 'brotherhood':2 'chase':15 'epistl':5 'forens':17 'hunter':12 'must':14 'psychologist':18 'sumo':8 'sweet':1 'unbeliev':4 'wrestler':9" } ], - "Actor": [ + "Actors": [ { "ActorID": 72, "FirstName": "Sean",