// go get github.com/lib/pq を忘れずに
// go run main10.go
/*
(1)golangの中でSQL文を作る時に、てっとり早く数値の部分を文字列にする方法
(2)golangの可変長配列の作り方と、面倒くさい場所の値をひっぱり出す方法
*/
package main
import (
"database/sql"
"fmt"
"log"
"math/rand"
_ "github.com/lib/pq"
)
func transfer_point(origin, destination int) (int, int) {
// utsu_tram_db3をオープン
db, err := sql.Open("postgres", "user=postgres password=password host=localhost port=15432 dbname=utsu_tram_db3 sslmode=disable")
if err != nil {
log.Fatal("OpenError: ", err)
}
defer db.Close()
// node番号 1200 から 12000 までのダイクストラ計算を行う
str := "SELECT seq, node, edge FROM pgr_dijkstra('SELECT gid as id, source, target, cost FROM ways'," + fmt.Sprint(origin) + "," + fmt.Sprint(destination) + ", directed:=false)"
rows, err := db.Query(str)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var seq, node, edge int
var add_node_num = []int{} // 可変長配列
for rows.Next() {
if err := rows.Scan(&seq, &node, &edge); err != nil {
fmt.Println(err)
}
// ルート分離は、0<x<70の値が出てきたら、駅のノードである、とする。
// 何しろ、私が地図を改ざんしたのだから間違いない
// で、その値を全部格納する
if node > 0 && node < 70 {
add_node_num = append(add_node_num, node)
}
}
if len(add_node_num) >= 4 { // 見つけることができたら最初から2番目と、最後から2番目の番号(0 < X < 70)を取り出す
first_node := add_node_num[1]
last_node := add_node_num[len(add_node_num)-2]
if (first_node > 0 && first_node < 70) || (last_node > 0 && last_node < 70) {
return first_node, last_node
} else {
log.Fatal("wrong node:", err)
}
//fmt.Println("first_node:", first_node, "last_node:", last_node)
} else { // 見つけることができなかったら
return -1, -1
//fmt.Println("No node")
}
return 0, 0 // ダミー用のリターン(ここには来ないはず)
}
func main() {
fmt.Println(transfer_point(21509, 11215))
for i := 0; i < 100; i++ {
a := rand.Intn(30000)
b := rand.Intn(30000)
//fmt.Println(sub_main(2200, 2400))
fmt.Println(a, b)
fmt.Println(transfer_point(rand.Intn(a), rand.Intn(b)))
}
}