Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions server/handler/features.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package handler

import (
"net/http"

"github.com/go-chi/chi"
"github.com/src-d/code-annotation/server/repository"
"github.com/src-d/code-annotation/server/serializer"
)

// GetFeatures returns a function that returns a *serializer.Response
// with the list of features for blobId
func GetFeatures(repo *repository.Features) RequestProcessFunc {
return func(r *http.Request) (*serializer.Response, error) {
blobID := chi.URLParam(r, "blobId")

// in the future it should take file by blobID from DB
// and make API request to ML system
features, err := repo.GetAll(blobID)
if err != nil {
return nil, err
}

return serializer.NewFeaturesResponse(features), nil
}
}
6 changes: 6 additions & 0 deletions server/model/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@ type File struct {
Hash string
}

// Feature represents one name-value feature of file
type Feature struct {
Name string
Weight float64
}

// Role represents the position of a app User
type Role string

Expand Down
44 changes: 44 additions & 0 deletions server/repository/features.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package repository

import (
"database/sql"
"fmt"

"github.com/src-d/code-annotation/server/model"
)

// Features repository
type Features struct {
db *sql.DB
}

// NewFeatures returns a new Features repository
func NewFeatures(db *sql.DB) *Features {
return &Features{db: db}
}

const selectFeaturesSQL = `SELECT name, weight FROM features WHERE blob_id=$1`

// GetAll returns a list of all features for blobID
func (repo *Features) GetAll(blobID string) ([]*model.Feature, error) {
rows, err := repo.db.Query(selectFeaturesSQL, blobID)
if err != nil {
return nil, fmt.Errorf("Error getting features from the DB: %v", err)
}
defer rows.Close()

results := make([]*model.Feature, 0)

for rows.Next() {
var f model.Feature
rows.Scan(&f.Name, &f.Weight)

results = append(results, &f)
}

if err := rows.Err(); err != nil {
return nil, fmt.Errorf("DB error: %v", err)
}

return results, nil
}
3 changes: 3 additions & 0 deletions server/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ func Router(
experimentRepo := repository.NewExperiments(db)
assignmentRepo := repository.NewAssignments(db)
filePairRepo := repository.NewFilePairs(db)
featureRepo := repository.NewFeatures(db)

// cors options
corsOptions := cors.Options{
Expand Down Expand Up @@ -63,6 +64,8 @@ func Router(

r.Get("/file-pairs/{pairId}", handler.Get(handler.GetFilePairDetails(filePairRepo)))
})

r.Get("/features/{blobId}", handler.Get(handler.GetFeatures(featureRepo)))
})

r.Get("/static/*", handler.FrontendStatics(staticsPath, false))
Expand Down
14 changes: 14 additions & 0 deletions server/serializer/serializers.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,20 @@ func NewUserResponse(u *model.User) *Response {
return newResponse(userResponse{u.ID, u.Login, u.Username, u.AvatarURL})
}

type featureResponse struct {
Name string `json:"name"`
Weight float64 `json:"weight"`
}

// NewFeaturesResponse returns a Response for the passed Features
func NewFeaturesResponse(fs []*model.Feature) *Response {
features := make([]featureResponse, len(fs))
for i, f := range fs {
features[i] = featureResponse(*f)
}
return newResponse(features)
}

type countResponse struct {
Count int `json:"count"`
}
Expand Down