github.com/Go-GraphQL-Group/GraphQL-Service@v0.0.0-20181226133140-0967350219a7/db/boltOp.go (about) 1 package db 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "regexp" 7 8 model2 "github.com/Go-GraphQL-Group/GraphQL-Service/model" 9 model1 "github.com/Go-GraphQL-Group/SW-Crawler/model" 10 "github.com/boltdb/bolt" 11 ) 12 13 const peopleBucket = "People" 14 const filmsBucket = "Film" 15 const planetsBucket = "Planet" 16 const speciesBucket = "Specie" 17 const starshipsBucket = "Starship" 18 const vehiclesBucket = "Vehicle" 19 20 // 正则替换 21 const origin = "http://localhost:8080/query/+[a-zA-Z_]+/" 22 23 const replace = "" 24 25 const preURL = "http://localhost:8080/query/" 26 27 // convert database model to graphql model 28 29 func convertPeople(people1 *model1.People) *model2.People { 30 people2 := &model2.People{} 31 people2.ID = people1.ID 32 people2.Name = people1.Name 33 people2.BirthYear = &people1.Birth_year 34 people2.EyeColor = &people1.Eye_color 35 people2.Gender = &people1.Gender 36 people2.HairColor = &people1.Hair_color 37 people2.Height = &people1.Heigth 38 people2.Mass = &people1.Mass 39 people2.SkinColor = &people1.Skin_color 40 return people2 41 } 42 43 func convertPlanet(planet1 *model1.Planet) *model2.Planet { 44 planet2 := &model2.Planet{} 45 planet2.ID = planet1.ID 46 planet2.Name = planet1.Name 47 planet2.Diameter = &planet1.Diameter 48 planet2.RotationPeriod = &planet1.Rotation_period 49 planet2.OrbitalPeriod = &planet1.Orbital_period 50 planet2.Gravity = &planet1.Gravity 51 planet2.Population = &planet1.Population 52 planet2.Climate = &planet1.Climate 53 planet2.Terrain = &planet1.Terrain 54 planet2.SurfaceWater = &planet1.Surface_water 55 return planet2 56 } 57 58 func convertFilm(film1 *model1.Film) *model2.Film { 59 film2 := &model2.Film{} 60 film2.ID = film1.ID 61 film2.Title = film1.Title 62 film2.EpisodeID = &film1.Episode_id 63 film2.OpeningCrawl = &film1.Opening_crawl 64 film2.Director = &film1.Director 65 film2.Producer = &film1.Producer 66 film2.ReleaseDate = &film1.Release_data 67 return film2 68 } 69 70 func convertSpecie(specie1 *model1.Species) *model2.Specie { 71 specie2 := &model2.Specie{} 72 specie2.ID = specie1.ID 73 specie2.Name = specie1.Name 74 specie2.Classification = &specie1.Classification 75 specie2.AverageHeight = &specie1.Average_height 76 specie2.AverageLifespan = &specie1.Average_lifespan 77 specie2.EyeColors = &specie1.Eye_colors 78 specie2.HairColors = &specie1.Hair_colors 79 specie2.SkinColors = &specie1.Skin_colors 80 specie2.Language = &specie1.Language 81 specie2.Designation = &specie1.Designation 82 return specie2 83 } 84 85 func convertStarship(starship1 *model1.Starship) *model2.Starship { 86 starship2 := &model2.Starship{} 87 starship2.ID = starship1.ID 88 starship2.Name = starship1.Name 89 starship2.Model = &starship1.Model 90 starship2.StarshipClass = &starship1.Starship_class 91 starship2.Manufacturer = &starship1.Manufacturer 92 starship2.CostInCredits = &starship1.Cost_in_credits 93 starship2.Length = &starship1.Length 94 starship2.Crew = &starship1.Crew 95 starship2.Passengers = &starship1.Passenger 96 starship2.MaxAtmospheringSpeed = &starship1.Max_atmosphering_speed 97 starship2.HyperdriveRating = &starship1.Hyperdrive_rating 98 starship2.MGLT = &starship1.MGLT 99 starship2.CargoCapacity = &starship1.Cargo_capacity 100 starship2.Consumables = &starship1.Consumables 101 return starship2 102 } 103 104 func convertVehicle(vehicle1 *model1.Vehicle) *model2.Vehicle { 105 vehicle2 := &model2.Vehicle{} 106 vehicle2.ID = vehicle1.ID 107 vehicle2.Name = vehicle1.Name 108 vehicle2.Model = &vehicle1.Model 109 vehicle2.Manufacturer = &vehicle1.Manufacturer 110 vehicle2.Length = &vehicle1.Length 111 vehicle2.CostInCredits = &vehicle1.Cost_in_credits 112 vehicle2.Crew = &vehicle1.Crew 113 vehicle2.Passengers = &vehicle1.Passenger 114 vehicle2.MaxAtmospheringSpeed = &vehicle1.Max_atmosphering_speed 115 vehicle2.CargoCapacity = &vehicle1.Cargo_capacity 116 vehicle2.Consumables = &vehicle1.Consumables 117 return vehicle2 118 } 119 120 func GetPeopleByID(ID string, db *bolt.DB) (error, *model2.People) { 121 var err error 122 if db == nil { 123 db, err = bolt.Open("data/data.db", 0600, nil) 124 CheckErr(err) 125 defer db.Close() 126 } 127 people1 := &model2.People{} 128 129 people := &model1.People{} 130 err = db.View(func(tx *bolt.Tx) error { 131 peoBuck := tx.Bucket([]byte(peopleBucket)) 132 v := peoBuck.Get([]byte(ID)) 133 134 if v == nil { 135 return err 136 } 137 138 // 正则替换 139 re, _ := regexp.Compile(origin) 140 rep := re.ReplaceAllString(string(v), replace) 141 err = json.Unmarshal([]byte(rep), people) 142 CheckErr(err) 143 people1 = convertPeople(people) 144 145 // Home 146 homeId := people.Homeworld 147 homeId = homeId[0 : len(homeId)-1] 148 homeBuck := tx.Bucket([]byte(planetsBucket)) 149 planet := homeBuck.Get([]byte(homeId)) 150 planet1 := &model1.Planet{} 151 err = json.Unmarshal([]byte(planet), planet1) 152 people1.Homeworld = convertPlanet(planet1) 153 154 // films 155 for _, it := range people.Films { 156 it = it[0 : len(it)-1] 157 filmBuck := tx.Bucket([]byte(filmsBucket)) 158 film := filmBuck.Get([]byte(it)) 159 film1 := &model1.Film{} 160 err = json.Unmarshal([]byte(film), film1) 161 CheckErr(err) 162 people1.Films = append(people1.Films, convertFilm(film1)) 163 } 164 165 // species 166 for _, it := range people.Species { 167 it = it[0 : len(it)-1] 168 specBuck := tx.Bucket([]byte(speciesBucket)) 169 specie := specBuck.Get([]byte(it)) 170 specie1 := &model1.Species{} 171 err = json.Unmarshal([]byte(specie), specie1) 172 CheckErr(err) 173 people1.Species = append(people1.Species, convertSpecie(specie1)) 174 } 175 176 // vehicles 177 for _, it := range people.Vehicles { 178 it = it[0 : len(it)-1] 179 vehBuck := tx.Bucket([]byte(vehiclesBucket)) 180 vehicle := vehBuck.Get([]byte(it)) 181 vehicle1 := &model1.Vehicle{} 182 err = json.Unmarshal([]byte(vehicle), vehicle1) 183 CheckErr(err) 184 people1.Vehicles = append(people1.Vehicles, convertVehicle(vehicle1)) 185 } 186 187 // starships 188 for _, it := range people.Starships { 189 it = it[0 : len(it)-1] 190 starBuck := tx.Bucket([]byte(starshipsBucket)) 191 starship := starBuck.Get([]byte(it)) 192 starship1 := &model1.Starship{} 193 err = json.Unmarshal([]byte(starship), starship1) 194 CheckErr(err) 195 people1.Starships = append(people1.Starships, convertStarship(starship1)) 196 } 197 198 people.Url = preURL + "people/" + people.Url 199 return nil 200 }) 201 return err, people1 202 } 203 204 func GetFilmByID(ID string, db *bolt.DB) (error, *model2.Film) { 205 var err error 206 if db == nil { 207 db, err = bolt.Open("data/data.db", 0600, nil) 208 CheckErr(err) 209 defer db.Close() 210 } 211 212 film1 := &model2.Film{} 213 film := &model1.Film{} 214 err = db.View(func(tx *bolt.Tx) error { 215 filmBuck := tx.Bucket([]byte(filmsBucket)) 216 v := filmBuck.Get([]byte(ID)) 217 218 if v == nil { 219 return err 220 } 221 222 // 正则替换 223 re, _ := regexp.Compile(origin) 224 rep := re.ReplaceAllString(string(v), replace) 225 err = json.Unmarshal([]byte(rep), film) 226 CheckErr(err) 227 228 film1 = convertFilm(film) 229 230 // character 231 for _, it := range film.Character { 232 it = it[0 : len(it)-1] 233 peoBuck := tx.Bucket([]byte(peopleBucket)) 234 people := peoBuck.Get([]byte(it)) 235 people1 := &model1.People{} 236 err = json.Unmarshal([]byte(people), people1) 237 CheckErr(err) 238 film1.Characters = append(film1.Characters, convertPeople(people1)) 239 } 240 241 // planet 242 for _, it := range film.Planets { 243 it = it[0 : len(it)-1] 244 plaBuck := tx.Bucket([]byte(planetsBucket)) 245 planet := plaBuck.Get([]byte(it)) 246 planet1 := &model1.Planet{} 247 err = json.Unmarshal([]byte(planet), planet1) 248 CheckErr(err) 249 film1.Planets = append(film1.Planets, convertPlanet(planet1)) 250 } 251 252 // starship 253 for _, it := range film.Starships { 254 it = it[0 : len(it)-1] 255 starBuck := tx.Bucket([]byte(starshipsBucket)) 256 starship := starBuck.Get([]byte(it)) 257 starship1 := &model1.Starship{} 258 err = json.Unmarshal([]byte(starship), starship1) 259 CheckErr(err) 260 film1.Starships = append(film1.Starships, convertStarship(starship1)) 261 } 262 263 // vehicle 264 for _, it := range film.Vehicles { 265 it = it[0 : len(it)-1] 266 vehBuck := tx.Bucket([]byte(vehiclesBucket)) 267 vehicle := vehBuck.Get([]byte(it)) 268 vehicle1 := &model1.Vehicle{} 269 err = json.Unmarshal([]byte(vehicle), vehicle1) 270 CheckErr(err) 271 film1.Vehicles = append(film1.Vehicles, convertVehicle(vehicle1)) 272 } 273 274 // specie 275 for _, it := range film.Species { 276 it = it[0 : len(it)-1] 277 specBuck := tx.Bucket([]byte(speciesBucket)) 278 specie := specBuck.Get([]byte(it)) 279 specie1 := &model1.Species{} 280 err = json.Unmarshal([]byte(specie), specie1) 281 CheckErr(err) 282 film1.Species = append(film1.Species, convertSpecie(specie1)) 283 } 284 285 film.Url = preURL + "films/" + film.Url 286 return nil 287 }) 288 return err, film1 289 } 290 291 func GetPlanetByID(ID string, db *bolt.DB) (error, *model2.Planet) { 292 var err error 293 if db == nil { 294 db, err = bolt.Open("data/data.db", 0600, nil) 295 CheckErr(err) 296 defer db.Close() 297 } 298 299 planet1 := &model2.Planet{} 300 planet := &model1.Planet{} 301 err = db.View(func(tx *bolt.Tx) error { 302 plaBuck := tx.Bucket([]byte(planetsBucket)) 303 v := plaBuck.Get([]byte(ID)) 304 305 if v == nil { 306 return err 307 } 308 309 // 正则替换 310 re, _ := regexp.Compile(origin) 311 rep := re.ReplaceAllString(string(v), replace) 312 err = json.Unmarshal([]byte(rep), planet) 313 CheckErr(err) 314 planet1 = convertPlanet(planet) 315 316 // resident 317 for _, it := range planet.Residents { 318 it = it[0 : len(it)-1] 319 peoBuck := tx.Bucket([]byte(peopleBucket)) 320 people := peoBuck.Get([]byte(it)) 321 people1 := &model1.People{} 322 err = json.Unmarshal([]byte(people), people1) 323 CheckErr(err) 324 planet1.Residents = append(planet1.Residents, convertPeople(people1)) 325 } 326 327 // film 328 for _, it := range planet.Films { 329 it = it[0 : len(it)-1] 330 filmBuck := tx.Bucket([]byte(filmsBucket)) 331 film := filmBuck.Get([]byte(it)) 332 film1 := &model1.Film{} 333 err = json.Unmarshal([]byte(film), film1) 334 CheckErr(err) 335 planet1.Films = append(planet1.Films, convertFilm(film1)) 336 } 337 return nil 338 }) 339 return err, planet1 340 } 341 342 func GetSpeciesByID(ID string, db *bolt.DB) (error, *model2.Specie) { 343 var err error 344 if db == nil { 345 db, err = bolt.Open("data/data.db", 0600, nil) 346 CheckErr(err) 347 defer db.Close() 348 } 349 350 specie1 := &model2.Specie{} 351 specie := &model1.Species{} 352 err = db.View(func(tx *bolt.Tx) error { 353 specBuck := tx.Bucket([]byte(speciesBucket)) 354 v := specBuck.Get([]byte(ID)) 355 356 if v == nil { 357 return err 358 } 359 360 // 正则替换 361 re, _ := regexp.Compile(origin) 362 rep := re.ReplaceAllString(string(v), replace) 363 // 替换后结果 364 // fmt.Println("After regexp: " + rep) 365 366 err = json.Unmarshal([]byte(rep), specie) 367 CheckErr(err) 368 369 specie1 = convertSpecie(specie) 370 371 // Home 372 homeId := specie.Homeworld 373 homeId = homeId[0 : len(homeId)-1] 374 homeBuck := tx.Bucket([]byte(planetsBucket)) 375 planet := homeBuck.Get([]byte(homeId)) 376 planet1 := &model1.Planet{} 377 err = json.Unmarshal([]byte(planet), planet1) 378 CheckErr(err) 379 specie1.Homeworld = convertPlanet(planet1) 380 381 // people 382 for _, it := range specie.People { 383 it = it[0 : len(it)-1] 384 peoBuck := tx.Bucket([]byte(peopleBucket)) 385 people := peoBuck.Get([]byte(it)) 386 people1 := &model1.People{} 387 err = json.Unmarshal([]byte(people), people1) 388 CheckErr(err) 389 specie1.People = append(specie1.People, convertPeople(people1)) 390 } 391 392 // film 393 for _, it := range specie.Films { 394 it = it[0 : len(it)-1] 395 filmBuck := tx.Bucket([]byte(filmsBucket)) 396 film := filmBuck.Get([]byte(it)) 397 film1 := &model1.Film{} 398 err = json.Unmarshal([]byte(film), film1) 399 CheckErr(err) 400 specie1.Films = append(specie1.Films, convertFilm(film1)) 401 } 402 return nil 403 }) 404 return err, specie1 405 } 406 407 func GetStarshipByID(ID string, db *bolt.DB) (error, *model2.Starship) { 408 var err error 409 if db == nil { 410 db, err = bolt.Open("data/data.db", 0600, nil) 411 CheckErr(err) 412 defer db.Close() 413 } 414 415 starship1 := &model2.Starship{} 416 starship := &model1.Starship{} 417 err = db.View(func(tx *bolt.Tx) error { 418 starBuck := tx.Bucket([]byte(starshipsBucket)) 419 v := starBuck.Get([]byte(ID)) 420 421 if v == nil { 422 return err 423 } 424 425 // 正则替换 426 re, _ := regexp.Compile(origin) 427 rep := re.ReplaceAllString(string(v), replace) 428 // 替换后结果 429 // fmt.Println("After regexp: " + rep) 430 431 err = json.Unmarshal([]byte(rep), starship) 432 CheckErr(err) 433 starship1 = convertStarship(starship) 434 435 // people 436 for _, it := range starship.Pilots { 437 it = it[0 : len(it)-1] 438 peoBuck := tx.Bucket([]byte(peopleBucket)) 439 people := peoBuck.Get([]byte(it)) 440 people1 := &model1.People{} 441 err = json.Unmarshal([]byte(people), people1) 442 CheckErr(err) 443 starship1.Pilots = append(starship1.Pilots, convertPeople(people1)) 444 } 445 446 // film 447 for _, it := range starship.Films { 448 it = it[0 : len(it)-1] 449 filmBuck := tx.Bucket([]byte(filmsBucket)) 450 film := filmBuck.Get([]byte(it)) 451 film1 := &model1.Film{} 452 err = json.Unmarshal([]byte(film), film1) 453 CheckErr(err) 454 starship1.Films = append(starship1.Films, convertFilm(film1)) 455 } 456 return nil 457 }) 458 return err, starship1 459 } 460 461 func GetVehicleByID(ID string, db *bolt.DB) (error, *model2.Vehicle) { 462 var err error 463 if db == nil { 464 db, err = bolt.Open("data/data.db", 0600, nil) 465 CheckErr(err) 466 defer db.Close() 467 } 468 469 vehicle1 := &model2.Vehicle{} 470 vehicle := &model1.Vehicle{} 471 err = db.View(func(tx *bolt.Tx) error { 472 vehicBuck := tx.Bucket([]byte(vehiclesBucket)) 473 v := vehicBuck.Get([]byte(ID)) 474 475 if v == nil { 476 return err 477 } 478 479 // 正则替换 480 re, _ := regexp.Compile(origin) 481 rep := re.ReplaceAllString(string(v), replace) 482 // 替换后结果 483 // fmt.Println("After regexp: " + rep) 484 485 err = json.Unmarshal([]byte(rep), vehicle) 486 CheckErr(err) 487 488 vehicle1 = convertVehicle(vehicle) 489 490 // people 491 for _, it := range vehicle.Pilots { 492 it = it[0 : len(it)-1] 493 peoBuck := tx.Bucket([]byte(peopleBucket)) 494 people := peoBuck.Get([]byte(it)) 495 people1 := &model1.People{} 496 err = json.Unmarshal([]byte(people), people1) 497 CheckErr(err) 498 vehicle1.Pilots = append(vehicle1.Pilots, convertPeople(people1)) 499 } 500 501 // film 502 for _, it := range vehicle.Films { 503 it = it[0 : len(it)-1] 504 filmBuck := tx.Bucket([]byte(filmsBucket)) 505 film := filmBuck.Get([]byte(it)) 506 film1 := &model1.Film{} 507 err = json.Unmarshal([]byte(film), film1) 508 CheckErr(err) 509 vehicle1.Films = append(vehicle1.Films, convertFilm(film1)) 510 511 } 512 return nil 513 }) 514 return err, vehicle1 515 } 516 517 // err 518 func CheckErr(err error) { 519 if err != nil { 520 fmt.Println("Error occur: ", err) 521 // os.Exit(1) 522 } 523 }