Skip to content

Commit c30dd76

Browse files
authored
Merge pull request #18 from jfontan/add-repositories-table
Add repositories table
2 parents 76dd6f1 + 0cac89c commit c30dd76

File tree

4 files changed

+161
-12
lines changed

4 files changed

+161
-12
lines changed

database.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ import (
66

77
const (
88
// TODO 'references' is a reserved keyword into the parser
9-
referencesTableName = "refs"
10-
commitsTableName = "commits"
11-
tagsTableName = "tags"
12-
blobsTableName = "blobs"
13-
treeEntriesTableName = "tree_entries"
14-
objectsTableName = "objects"
9+
referencesTableName = "refs"
10+
commitsTableName = "commits"
11+
tagsTableName = "tags"
12+
blobsTableName = "blobs"
13+
treeEntriesTableName = "tree_entries"
14+
objectsTableName = "objects"
15+
repositoriesTableName = "repositories"
1516
)
1617

1718
type Database struct {
@@ -22,6 +23,7 @@ type Database struct {
2223
ter sql.Table
2324
br sql.Table
2425
or sql.Table
26+
rer sql.Table
2527
}
2628

2729
func NewDatabase(name string, pool *RepositoryPool) sql.Database {
@@ -33,6 +35,7 @@ func NewDatabase(name string, pool *RepositoryPool) sql.Database {
3335
br: newBlobsTable(pool),
3436
ter: newTreeEntriesTable(pool),
3537
or: newObjectsTable(pool),
38+
rer: newRepositoriesTable(pool),
3639
}
3740
}
3841

@@ -42,11 +45,12 @@ func (d *Database) Name() string {
4245

4346
func (d *Database) Tables() map[string]sql.Table {
4447
return map[string]sql.Table{
45-
commitsTableName: d.cr,
46-
tagsTableName: d.tr,
47-
referencesTableName: d.rr,
48-
blobsTableName: d.br,
49-
treeEntriesTableName: d.ter,
50-
objectsTableName: d.or,
48+
commitsTableName: d.cr,
49+
tagsTableName: d.tr,
50+
referencesTableName: d.rr,
51+
blobsTableName: d.br,
52+
treeEntriesTableName: d.ter,
53+
objectsTableName: d.or,
54+
repositoriesTableName: d.rer,
5155
}
5256
}

database_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func TestDatabase_Tables(t *testing.T) {
4141
tagsTableName,
4242
blobsTableName,
4343
objectsTableName,
44+
repositoriesTableName,
4445
}
4546
sort.Strings(expected)
4647

repositories.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package gitquery
2+
3+
import (
4+
"io"
5+
6+
"gopkg.in/src-d/go-mysql-server.v0/sql"
7+
)
8+
9+
type repositoriesTable struct {
10+
pool *RepositoryPool
11+
}
12+
13+
func newRepositoriesTable(pool *RepositoryPool) sql.Table {
14+
return &repositoriesTable{pool: pool}
15+
}
16+
17+
func (repositoriesTable) Resolved() bool {
18+
return true
19+
}
20+
21+
func (repositoriesTable) Name() string {
22+
return repositoriesTableName
23+
}
24+
25+
func (repositoriesTable) Schema() sql.Schema {
26+
return sql.Schema{
27+
{Name: "id", Type: sql.Text, Nullable: false},
28+
}
29+
}
30+
31+
func (r *repositoriesTable) TransformUp(f func(sql.Node) sql.Node) sql.Node {
32+
return f(r)
33+
}
34+
35+
func (r *repositoriesTable) TransformExpressionsUp(
36+
f func(sql.Expression) sql.Expression) sql.Node {
37+
38+
return r
39+
}
40+
41+
func (r repositoriesTable) RowIter() (sql.RowIter, error) {
42+
iter := &repositoriesIter{}
43+
44+
rowRepoIter, err := NewRowRepoIter(r.pool, iter)
45+
if err != nil {
46+
return nil, err
47+
}
48+
49+
return rowRepoIter, nil
50+
}
51+
52+
func (repositoriesTable) Children() []sql.Node {
53+
return nil
54+
}
55+
56+
type repositoriesIter struct {
57+
visited bool
58+
id string
59+
}
60+
61+
func (i *repositoriesIter) NewIterator(repo *Repository) (RowRepoIter, error) {
62+
return &repositoriesIter{
63+
visited: false,
64+
id: repo.ID,
65+
}, nil
66+
}
67+
68+
func (i *repositoriesIter) Next() (sql.Row, error) {
69+
if i.visited {
70+
return nil, io.EOF
71+
}
72+
73+
i.visited = true
74+
return sql.NewRow(i.id), nil
75+
}
76+
77+
func (i *repositoriesIter) Close() error {
78+
return nil
79+
}

repositories_test.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package gitquery
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/require"
7+
"gopkg.in/src-d/go-git-fixtures.v3"
8+
"gopkg.in/src-d/go-mysql-server.v0/sql"
9+
)
10+
11+
func TestRepositoriesTable_Name(t *testing.T) {
12+
require := require.New(t)
13+
14+
f := fixtures.Basic().One()
15+
table := getTable(require, f, repositoriesTableName)
16+
require.Equal(repositoriesTableName, table.Name())
17+
}
18+
19+
func TestRepositoriesTable_Children(t *testing.T) {
20+
require := require.New(t)
21+
22+
f := fixtures.Basic().One()
23+
table := getTable(require, f, repositoriesTableName)
24+
require.Equal(0, len(table.Children()))
25+
}
26+
27+
func TestRepositoriesTable_RowIter(t *testing.T) {
28+
require := require.New(t)
29+
30+
repoIDs := []string{
31+
"one", "two", "three", "four", "five", "six",
32+
"seven", "eight", "nine",
33+
}
34+
35+
pool := NewRepositoryPool()
36+
37+
for _, id := range repoIDs {
38+
pool.Add(id, nil)
39+
}
40+
41+
db := NewDatabase(repositoriesTableName, &pool)
42+
require.NotNil(db)
43+
44+
tables := db.Tables()
45+
table, ok := tables[repositoriesTableName]
46+
47+
require.True(ok)
48+
require.NotNil(table)
49+
50+
rows, err := sql.NodeToRows(table)
51+
require.Nil(err)
52+
require.Len(rows, len(repoIDs))
53+
54+
idArray := make([]string, len(repoIDs))
55+
for i, row := range rows {
56+
idArray[i] = row[0].(string)
57+
}
58+
require.ElementsMatch(idArray, repoIDs)
59+
60+
schema := table.Schema()
61+
for idx, row := range rows {
62+
err := schema.CheckRow(row)
63+
require.Nil(err, "row %d doesn't conform to schema", idx)
64+
}
65+
}

0 commit comments

Comments
 (0)