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  }