Skip to content

Commit

Permalink
delete variants by dataset id endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
v-rocheleau committed Aug 28, 2023
1 parent 93b5dad commit b324c00
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/api/contexts/contexts.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ type (
Genotype constants.GenotypeQuery
SampleIds []string
Dataset uuid.UUID
DataType string
PositionBounds
}

Expand Down
3 changes: 3 additions & 0 deletions src/api/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,9 @@ func main() {
e.GET("/datasets/:dataset/data-types", variantsMvc.GetDatasetDataTypes,
// middleware
gam.MandateDatasetPathParam)
e.DELETE("/datasets/:dataset/data-types/:dataType", variantsMvc.ClearDataset,
gam.MandateDatasetPathParam,
gam.MandateDataTypePathParam)

// TODO: refactor (deduplicate) --
e.GET("/variants/ingestion/run", variantsMvc.VariantsIngest,
Expand Down
15 changes: 15 additions & 0 deletions src/api/middleware/datasetMiddleware.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,21 @@ func MandateDatasetPathParam(next echo.HandlerFunc) echo.HandlerFunc {
}
}

func MandateDataTypePathParam(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
dataType := c.Param("dataType")
if dataType != "variant" {
fmt.Printf("Invalid data-type provided: %s\n", dataType)
return c.JSON(http.StatusBadRequest, errors.CreateSimpleBadRequest(
fmt.Sprintf("invalid data-type %s - please provide a valid data-type (e.g. \"variant\")", dataType),
))
}
gc := c.(*contexts.GohanContext)
gc.DataType = dataType
return next(gc)
}
}

/*
Echo middleware to ensure a `dataset` HTTP query parameter is valid if provided
*/
Expand Down
35 changes: 35 additions & 0 deletions src/api/mvc/variants/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,41 @@ func GetDatasetSummary(c echo.Context) error {
}
}

func ClearDataset(c echo.Context) error {
gc := c.(*contexts.GohanContext)
cfg := gc.Config
es := gc.Es7Client

dataset := gc.Dataset
dataType := gc.DataType
fmt.Printf("[%s] - ClearDataset hit: [%s] - [%s]!\n", time.Now(), dataset.String(), dataType)

var (
deletionCount = 0.0
g = new(errgroup.Group)
)
// request #1
g.Go(func() error {
deleteResponse, delErr := esRepo.DeleteVariantsByDatasetId(cfg, es, dataset.String())

if delErr != nil {
fmt.Printf("Failed to delete dataset %s variants\n", dataset)
return delErr
}

deletionCount = deleteResponse["deleted"].(float64)

return nil
})

if err := g.Wait(); err == nil {
fmt.Printf("Deleted %f variants from dataset %s\n", deletionCount, dataset)
return c.NoContent(http.StatusNoContent)
} else {
return c.JSON(http.StatusInternalServerError, errors.CreateSimpleInternalServerError("Something went wrong.. Please try again later!"))
}
}

type DataTypeSummary struct {
Id string `json:"id"`
Label string `json:"label"`
Expand Down
56 changes: 56 additions & 0 deletions src/api/repositories/elasticsearch/variants.go
Original file line number Diff line number Diff line change
Expand Up @@ -668,6 +668,62 @@ func GetVariantsBucketsByKeywordAndDataset(cfg *models.Config, es *elasticsearch
return result, nil
}

func DeleteVariantsByDatasetId(cfg *models.Config, es *elasticsearch.Client, dataset string) (map[string]interface{}, error) {

var buf bytes.Buffer
query := map[string]interface{}{
"query": map[string]interface{}{
"match": map[string]interface{}{
"dataset": dataset,
},
},
}

if err := json.NewEncoder(&buf).Encode(query); err != nil {
log.Fatalf("Error encoding query: %s\n", query)
}

if cfg.Debug {
// view the outbound elasticsearch query
myString := string(buf.Bytes()[:])
fmt.Println(myString)
}

// Perform the delete request.
deleteRes, deleteErr := es.DeleteByQuery(
[]string{wildcardVariantsIndex},
bytes.NewReader(buf.Bytes()),
)
if deleteErr != nil {
fmt.Printf("Error getting response: %s\n", deleteErr)
return nil, deleteErr
}

defer deleteRes.Body.Close()

resultString := deleteRes.String()
if cfg.Debug {
fmt.Println(resultString)
}

// Prepare an empty interface
result := make(map[string]interface{})

// Unmarshal or Decode the JSON to the empty interface.
// Known bug: response comes back with a preceding '[200 OK] ' which needs trimming
bracketString, jsonBodyString := utils.GetLeadingStringInBetweenSquareBrackets(resultString)
if !strings.Contains(bracketString, "200") {
return nil, fmt.Errorf("failed to get documents by id : got '%s'", bracketString)
}
umErr := json.Unmarshal([]byte(jsonBodyString), &result)
if umErr != nil {
fmt.Printf("Error unmarshalling variant deletion response: %s\n", umErr)
return nil, umErr
}

return result, nil
}

// -- internal use only --
func addAllelesToShouldMap(alleles []string, genotype c.GenotypeQuery, allelesShouldMap []map[string]interface{}) ([]map[string]interface{}, int) {
minimumShouldMatch := 0
Expand Down

0 comments on commit b324c00

Please sign in to comment.