func trForceNode(c *cmdapp.Command, nod *jdh.Node, txLs *list.List) { vals := new(jdh.Values) vals.Add(jdh.NodChildren, nod.Id) l, err := localDB.List(jdh.Nodes, vals) if err != nil { fmt.Fprintf(os.Stderr, "%s\n", c.ErrStr(err)) os.Exit(1) } childs := 0 for { desc := &jdh.Node{} if err := l.Scan(desc); err != nil { if err == io.EOF { break } fmt.Fprintf(os.Stderr, "%s\n", c.ErrStr(err)) os.Exit(1) } trForceNode(c, desc, txLs) childs++ } if childs > 1 { return } if len(nod.Taxon) == 0 { return } tax := taxon(c, localDB, nod.Taxon) if tax.IsValid { return } par := taxon(c, localDB, tax.Parent) todel := false for e := txLs.Front(); e != nil; e = e.Next() { tId := e.Value.(string) if tId == par.Id { todel = true break } } if todel { fmt.Fprintf(os.Stdout, "%s: deleted\n", tax.Name) if !repFlag { vals.Reset() vals.Add(jdh.KeyId, nod.Id) localDB.Exec(jdh.Delete, jdh.Nodes, vals) } return } fmt.Fprintf(os.Stdout, "%s: changed to: %s\n", tax.Name, par.Name) if !repFlag { vals.Reset() vals.Add(jdh.KeyId, nod.Id) vals.Add(jdh.NodTaxon, par.Id) localDB.Exec(jdh.Set, jdh.Nodes, vals) txLs.PushBack(par.Id) } }
func newTxList(tax *jdh.Taxon, db jdh.DB, syns bool) *txList { ls := &txList{ db: db, tax: tax, syns: syns, } id := "" if tax == nil { ls.tax = &jdh.Taxon{ Id: "0", Name: "root", } } else { id = tax.Id } vals := new(jdh.Values) vals.Add(jdh.TaxChildren, id) pl, err := db.List(jdh.Taxonomy, vals) if err != nil { return ls } for { d := &jdh.Taxon{} if err := pl.Scan(d); err != nil { break } ls.desc = append(ls.desc, d) } if !syns { return ls } vals.Reset() vals.Add(jdh.TaxSynonyms, id) pl, err = db.List(jdh.Taxonomy, vals) if err != nil { return ls } for { s := &jdh.Taxon{} if err := pl.Scan(s); err != nil { break } ls.desc = append(ls.desc, s) } return ls }
func raMkFetch(c *cmdapp.Command, spDB jdh.DB, tax *jdh.Taxon, prevRank, rank jdh.Rank, size float64) { r := tax.Rank if r == jdh.Unranked { r = prevRank } defer func() { l := getTaxDesc(c, localDB, tax.Id, true) raMkNav(c, l, spDB, r, rank, size) }() if len(tax.Id) == 0 { return } if r < rank { return } vals := new(jdh.Values) if spDB != localDB { eid := searchExtern(extDBFlag, tax.Extern) if len(eid) == 0 { return } vals.Add(jdh.SpeTaxonParent, eid) } else { vals.Add(jdh.SpeTaxonParent, tax.Id) } vals.Add(jdh.SpeGeoref, "true") inDB := true ras := raMkGetRas(c, tax.Id, size) if len(ras.Id) == 0 { inDB = false ras = &jdh.Raster{ Taxon: tax.Id, Cols: uint(360 / size), Source: jdh.ExplicitPoints, } } l := speList(c, spDB, vals) for { spe := &jdh.Specimen{} if err := l.Scan(spe); err != nil { if err == io.EOF { break } fmt.Fprintf(os.Stderr, "%s\n", c.ErrStr(err)) os.Exit(1) } if !spe.Georef.IsValid() { continue } if validFlag && (len(spe.Georef.Validation) == 0) { continue } azm, inc := spe.Georef.Point.Lon+180, 90-spe.Georef.Point.Lat x, y := int(azm/size), int(inc/size) if inDB { vals.Reset() vals.Add(jdh.KeyId, ras.Id) vals.Add(jdh.RasPixel, fmt.Sprintf("%d,%d,1", x, y)) localDB.Exec(jdh.Set, jdh.RasDistros, vals) continue } if ras.Raster == nil { ras.Raster = pixlist.NewPixList() } pt := image.Pt(x, y) ras.Raster.Set(pt, 1) } if inDB || (ras.Raster == nil) { return } localDB.Exec(jdh.Add, jdh.RasDistros, ras) }
// TxSyncMatch implements the match option of tx.sync. func txSyncMatch(c *cmdapp.Command, tax *jdh.Taxon) { defer func() { l := getTaxDesc(c, localDB, tax.Id, true) txSyncMatchNav(c, l) l = getTaxDesc(c, localDB, tax.Id, false) txSyncMatchNav(c, l) }() if len(tax.Id) == 0 { return } eid := searchExtern(extDBFlag, tax.Extern) if len(eid) > 0 { return } var pEids []string args := new(jdh.Values) args.Add(jdh.TaxParents, tax.Id) pl, err := localDB.List(jdh.Taxonomy, args) if err != nil { fmt.Fprintf(os.Stderr, "%s\n", c.ErrStr(err)) os.Exit(1) } for { p := &jdh.Taxon{} if err := pl.Scan(p); err != nil { if err == io.EOF { break } fmt.Fprintf(os.Stderr, "%s\n", c.ErrStr(err)) os.Exit(1) } pe := searchExtern(extDBFlag, p.Extern) if len(pEids) == 0 { continue } pEids = append(pEids, pe) } args.Reset() args.Add(jdh.TaxName, tax.Name) l, err := extDB.List(jdh.Taxonomy, args) if err != nil { fmt.Fprintf(os.Stderr, "%s\n", c.ErrStr(err)) os.Exit(1) } var extTax *jdh.Taxon for { et := &jdh.Taxon{} if err := l.Scan(et); err != nil { if err == io.EOF { break } fmt.Fprintf(os.Stderr, "%s\n", c.ErrStr(err)) os.Exit(1) } if len(pEids) > 0 { if !isInParentList(c, extDB, et.Id, pEids) { continue } } if (len(tax.Authority) > 0) && (len(et.Authority) > 0) { if tax.Authority != et.Authority { continue } } if extTax == nil { extTax = et continue } // The name is ambiguous fmt.Fprintf(os.Stderr, "taxon name %s is ambiguous in %s\n", tax.Name, extDBFlag) l.Close() return } if extTax == nil { return } args.Reset() args.Add(jdh.KeyId, tax.Id) args.Add(jdh.KeyExtern, extDBFlag+":"+extTax.Id) localDB.Exec(jdh.Set, jdh.Taxonomy, args) }
func txDelRun(c *cmdapp.Command, args []string) { openLocal(c) var tax *jdh.Taxon if len(idFlag) > 0 { tax = taxon(c, localDB, idFlag) if len(tax.Id) == 0 { return } } else if len(args) > 0 { if len(args) > 2 { fmt.Fprintf(os.Stderr, "%s\n", c.ErrStr("too many arguments")) os.Exit(1) } pName := "" if len(args) > 1 { pName = args[1] } tax = pickTaxName(c, localDB, args[0], pName) if len(tax.Id) == 0 { return } } else { fmt.Fprintf(os.Stderr, "%s\n", c.ErrStr("expectiong taxon name or id")) c.Usage() } vals := new(jdh.Values) if colpFlag { if len(tax.Parent) > 0 { vals.Add(jdh.KeyId, tax.Id) vals.Add(jdh.TaxSynonym, "") if _, err := localDB.Exec(jdh.Set, jdh.Taxonomy, vals); err != nil { fmt.Fprintf(os.Stderr, "%s\n", c.ErrStr(err)) os.Exit(1) } } else { l := getTaxDesc(c, localDB, tax.Id, true) for { desc := &jdh.Taxon{} if err := l.Scan(desc); err != nil { if err == io.EOF { break } fmt.Fprintf(os.Stderr, "%s\n", c.ErrStr(err)) os.Exit(1) } vals.Reset() vals.Add(jdh.KeyId, desc.Id) vals.Add(jdh.TaxParent, "") if _, err := localDB.Exec(jdh.Set, jdh.Taxonomy, vals); err != nil { fmt.Fprintf(os.Stderr, "%s\n", c.ErrStr(err)) os.Exit(1) } } } } vals.Reset() vals.Add(jdh.KeyId, tax.Id) if _, err := localDB.Exec(jdh.Delete, jdh.Taxonomy, vals); err != nil { fmt.Fprintf(os.Stderr, "%s\n", c.ErrStr(err)) os.Exit(1) } localDB.Exec(jdh.Commit, "", nil) }