예제 #1
0
파일: tr.force.go 프로젝트: js-arias/jdh
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)
	}
}
예제 #2
0
파일: taxonomy.go 프로젝트: js-arias/jdh
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
}
예제 #3
0
파일: ra.mk.go 프로젝트: js-arias/jdh
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)
}
예제 #4
0
파일: tx.sync.go 프로젝트: js-arias/jdh
// 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)
}
예제 #5
0
파일: tx.del.go 프로젝트: js-arias/jdh
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)
}