Advertisement
Guest User

regex

a guest
Oct 17th, 2019
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 5.44 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "encoding/json"
  5.     "fmt"
  6.     "log"
  7.     "regexp"
  8.     "strconv"
  9.     "strings"
  10.  
  11.     "github.com/dgraph-io/badger"
  12.     //"io/ioutil"
  13.     //"os"
  14. )
  15.  
  16. //struct for Story
  17. type Story struct {
  18.     Title       string `json:"title"`
  19.     Url         string `json:"url"`
  20.     Text        string `json:"text"`
  21.     Dead       bool  `json:"dead"`
  22.     By          string `json:"by"`
  23.     Score       string `json:"score"`
  24.     Time        string `json:"time"`
  25.     Timestamp   string `json:"timestamp"`
  26.     Type        string `json:"type"`
  27.     Id          string `json:"id"`
  28.     Parent      string `json:"parent"`
  29.     Descendants string `json:"descendants"`
  30.     Ranking     string `json:"ranking"`
  31.     Deleted     bool `json:"deleted"`
  32. }
  33.  
  34. func (h Story) encodeStory() []byte {
  35.     data, err := json.Marshal(h)
  36.     if err != nil {
  37.         panic(err)
  38.     }
  39.  
  40.     return data
  41. }
  42.  
  43. func decodeStory(data []byte) (Story, error) {
  44.     var h Story
  45.     err := json.Unmarshal(data, &h)
  46.     return h, err
  47. }
  48.  
  49. type Ids struct {
  50.     Ids []int `json:"ids"`
  51. }
  52.  
  53. func (h Ids) encodeIds() []byte {
  54.     data, err := json.Marshal(h)
  55.     if err != nil {
  56.         panic(err)
  57.     }
  58.  
  59.     return data
  60. }
  61.  
  62. func decodeIds(data []byte) (Ids, error) {
  63.     var h Ids
  64.     err := json.Unmarshal(data, &h)
  65.     return h, err
  66. }
  67.  
  68. func main() {
  69.  
  70.     // Open the Badger database located in the /tmp/badger directory.
  71.     // Will be created if it doesn't exist.
  72.  
  73.     db, err := badger.Open(badger.DefaultOptions("./data/badger"))
  74.     if err != nil {
  75.         log.Fatal(err)
  76.     }
  77.     defer db.Close()
  78.  
  79.     dbTest, err := badger.Open(badger.DefaultOptions("./data/regex2"))
  80.     if err != nil {
  81.         log.Fatal(err)
  82.     }
  83.     defer dbTest.Close()
  84.  
  85.     err = dbTest.DropAll()
  86.     if err != nil {
  87.         fmt.Println("Error while dropping the database")
  88.     }
  89.  
  90.     var batch int = 500000
  91.  
  92.     var keyCount int = 0
  93.  
  94.     idMap := make(map[string]Ids)
  95.  
  96.     reg, err := regexp.Compile("[^a-zA-Z0-9]+")
  97.     if err != nil {
  98.         log.Println(err)
  99.     }
  100.  
  101.     txn := db.NewTransaction(true)
  102.     defer txn.Discard()
  103.  
  104.     err = db.View(func(txn *badger.Txn) error {
  105.  
  106.         opts := badger.DefaultIteratorOptions
  107.         opts.PrefetchSize = 10
  108.         it := txn.NewIterator(opts)
  109.         defer it.Close()
  110.         for it.Rewind(); it.Valid(); it.Next() {
  111.  
  112.             item := it.Item()
  113.  
  114.             err := item.Value(func(v []byte) error {
  115.                 var s Story
  116.                 s, err1 := decodeStory(v)
  117.  
  118.                 //check for errors
  119.                 if err1 != nil {
  120.                     log.Fatal(err)
  121.                 }
  122.  
  123.                 //fmt.Println(s.Title)
  124.  
  125.                 word := strings.Fields(s.Title)
  126.  
  127.                 //var ids []string
  128.  
  129.                 for _, v := range word {
  130.  
  131.                     v := reg.ReplaceAllString(v, "")
  132.  
  133.                     err = dbTest.View(func(txn *badger.Txn) error {
  134.                         item, err := txn.Get([]byte("_index::title::" + strings.ToLower(v)))
  135.                         if err != nil {
  136.                                 return err
  137.                         }
  138.  
  139.                         //if val found retrieve val
  140.  
  141.                         val, err := item.ValueCopy(nil)
  142.                         if err != nil {
  143.                             return err
  144.                         }
  145.  
  146.                         ids, err1 := decodeIds(val)
  147.  
  148.                         if err1 != nil {
  149.                             log.Fatal("Error decoding")
  150.                         }
  151.  
  152.                         idInt, err1 := strconv.Atoi(s.Id)
  153.  
  154.                         if err1 != nil {
  155.                             fmt.Println("error")
  156.                         }
  157.  
  158.                         ids.Ids = append(ids.Ids, idInt)
  159.  
  160.                         //make a single transaction
  161.  
  162.                         // Start a writable transaction.
  163.                         txn1 := dbTest.NewTransaction(true)
  164.                         defer txn1.Discard()
  165.  
  166.                         // Use the transaction...
  167.                         err = txn1.Set([]byte("_index::title::"+strings.ToLower(v)), ids.encodeIds())
  168.                         if err != nil {
  169.                             return err
  170.                         }
  171.  
  172.                         // Commit the transaction and check for error.
  173.                         if err := txn1.Commit(); err != nil {
  174.                             if err != nil {
  175.                                 fmt.Println(err)
  176.                             }
  177.                         }
  178.  
  179.                         return nil
  180.                     })
  181.  
  182.                     //if val not found set a new key
  183.                     if err != nil {
  184.  
  185.                         newIDInt, err2 := strconv.Atoi(s.Id)
  186.  
  187.                         if err2 != nil {
  188.                             fmt.Println(err2)
  189.                         }
  190.  
  191.                         var id []int
  192.  
  193.                         id = append(id, newIDInt)
  194.  
  195.                         idMap["_index::title::"+strings.ToLower(v)] = Ids{
  196.                             Ids: id,
  197.                         }
  198.  
  199.                         keyCount++
  200.  
  201.                         if keyCount > batch {
  202.                             keyCount = 0
  203.                             //write batch
  204.                             wb := dbTest.NewWriteBatch()
  205.                             defer wb.Cancel()
  206.  
  207.                             for k, v := range idMap {
  208.  
  209.                                 err := wb.Set([]byte(k), v.encodeIds())
  210.  
  211.                                 if err != nil {
  212.                                     log.Fatal(err)
  213.                                 }
  214.                             }
  215.                             fmt.Println("batch commit")
  216.  
  217.                             err1 := wb.Flush()
  218.  
  219.                             if err1 != nil {
  220.                                 log.Fatal(err1)
  221.                             }
  222.  
  223.                             //reinitialize idMap
  224.                             idMap = make(map[string]Ids)
  225.  
  226.                         }
  227.  
  228.                     }
  229.  
  230.                 }
  231.  
  232.                 return nil
  233.             })
  234.  
  235.             if err != nil {
  236.                 return err
  237.             }
  238.  
  239.         }
  240.         //write batch for remaining words
  241.         wb := dbTest.NewWriteBatch()
  242.         defer wb.Cancel()
  243.  
  244.         for k, v := range idMap {
  245.  
  246.             err := wb.Set([]byte(k), v.encodeIds())
  247.  
  248.             if err != nil {
  249.                 log.Fatal(err)
  250.             }
  251.         }
  252.         fmt.Println("batch commit remaining")
  253.         err1 := wb.Flush()
  254.  
  255.         if err1 != nil {
  256.             log.Fatal(err1)
  257.         }
  258.  
  259.         return nil
  260.     })
  261.  
  262.     //error handle for View
  263.     if err != nil {
  264.         log.Fatal(err)
  265.     }
  266.  
  267.     wb := dbTest.NewWriteBatch()
  268.     defer wb.Cancel()
  269.  
  270.     for k, v := range idMap {
  271.  
  272.         err := wb.Set([]byte(k), v.encodeIds())
  273.  
  274.         if err != nil {
  275.             log.Fatal(err)
  276.         }
  277.     }
  278.  
  279.     /*
  280.        err = dbTest.View(func(txn *badger.Txn) error {
  281.            item, err := txn.Get([]byte("_index::title::nuclear"))
  282.            if err != nil {
  283.                return err
  284.            }
  285.            val, err := item.ValueCopy(nil)
  286.            if err != nil {
  287.                return err
  288.            }
  289.            fmt.Printf("%s\n", string(val))
  290.            return nil
  291.        })
  292.  
  293.        if err != nil {
  294.            fmt.Println("NotFound")
  295.        }
  296.     */
  297.  
  298. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement