Add ability to search by language.
authorChris Jaekl <chris@localhost>
Tue, 31 Mar 2020 03:22:20 +0000 (23:22 -0400)
committerChris Jaekl <chris@localhost>
Tue, 31 Mar 2020 03:22:20 +0000 (23:22 -0400)
Note that this expects ISO language code (e.g., `de` for German)

app/index.html
js/src/SearchController.js
main/db.go
main/handler.go

index d26603de1ae54f166a7ea47813a319aa6a6d18ca..5871355dfbd3315fb697b18d169b48ce4bda4fad 100644 (file)
@@ -12,6 +12,7 @@
       <span class="term">Author: <input id="aut" type="text"/></span>
       <span class="term">Title: <input id="tit" type="text"/></span>
       <span class="term">Series: <input id="ser" type="text"/></span>
+      <span class="term">Language: <input id="lan" type="text"/></span>
     </form>
 
     <div class="pager">
index 54d76fab8edbf15af907a5af8b3959ff46db7609..6f48c6c828fc63ddb463f9a8fcd5ed2f5c897438 100644 (file)
@@ -5,7 +5,7 @@ var SearchController = (function () {
     var my = {},
         booksModel = undefined;
 
-    const terms = ['aut', 'tit', 'ser'];
+    const terms = ['aut', 'lan', 'ser', 'tit'];
 
     // ==============
     // Public methods
index b636cffaed938752386174a32f5e60db54d13800..d903b26209d2caf501b1bdf8767b51f5e6f44fcb 100644 (file)
@@ -20,6 +20,7 @@ type Book struct {
   DDC            string  // Dewey Decimal Classification
   Description    string  // Back cover / inside flap blurb, describing the book
   Genre          string  // e.g. "adventure", "historical", "mystery", "romance", "sf" (Science Fiction)
+  Language       string
   LCC            string  // Library of Congress Classification
   SeriesName     string  
   Title          string
@@ -29,7 +30,7 @@ type Book struct {
 // ---------------------------------------------------------------------------
 type Field string
 const (
-  Author, Series, Title Field = "aut", "ser", "tit"
+  Author, Language, Series, Title Field = "aut", "lan", "ser", "tit"
 )
 
 func (f Field) String() string {
@@ -97,7 +98,7 @@ func openDb(user, pass, dbName string) (*sql.DB) {
 }
 
 func queryBooksByIds(ids []int) []Book {
-  query := `SELECT s.age,a.grouping,a.reading,a.sort,b.cover,c.ddc,b.description,s.genre,c.lcc,s.descr,b.title,b.volume
+  query := `SELECT s.age,a.grouping,a.reading,a.sort,b.cover,c.ddc,b.description,s.genre,b.language,c.lcc,s.descr,b.title,b.volume
             FROM Authors a 
             INNER JOIN Books b ON a.id=b.author
             LEFT OUTER JOIN Classifications c ON c.id=b.classification
@@ -128,10 +129,10 @@ func queryBooksByIds(ids []int) []Book {
 
     row := ps.QueryRow(id)
 
-    var age, grouping, reading, sort, ddc, description, genre, lcc, name, title, volume sql.NullString
+    var age, grouping, reading, sort, ddc, description, genre, language, lcc, name, title, volume sql.NullString
     var cover sql.NullInt64
 
-    err = row.Scan(&age, &grouping, &reading, &sort, &cover, &ddc, &description, &genre, &lcc, &name, &title, &volume)
+    err = row.Scan(&age, &grouping, &reading, &sort, &cover, &ddc, &description, &genre, &language, &lcc, &name, &title, &volume)
     if err != nil {
       report("Error:  Failed to read book:" + strconv.Itoa(id) + ":", err)
     } else {
@@ -145,6 +146,7 @@ func queryBooksByIds(ids []int) []Book {
       b.DDC = nsVal(ddc)
       b.Description = nsVal(description)
       b.Genre = nsVal(genre)
+      b.Language = nsVal(language)
       b.LCC = nsVal(lcc)
       b.SeriesName = nsVal(name)
       b.Title = nsVal(title)
@@ -203,6 +205,8 @@ func queryIds(criteria []SearchTerm) []int {
     case Author:
       query += " UPPER(a.grouping) LIKE UPPER($" + strconv.Itoa(i + 1) + ")"
       text = strings.Replace(text, " ", "", -1)        // Remove spaces
+    case Language:
+      query += " UPPER(b.language) LIKE UPPER($" + strconv.Itoa(i + 1) + ")"
     case Series:
       query += " UPPER(s.descr) LIKE UPPER($" + strconv.Itoa(i + 1) + ")"
     case Title:
index cd35a7640c124d2690f390ff9d9f1c92ce2fc251..599f5d557bcde26ee40fbaed3e5eb8a0eb739771 100644 (file)
@@ -180,7 +180,7 @@ func handleInfo(w http.ResponseWriter, r *http.Request) {
 func handleSearch(w http.ResponseWriter, r *http.Request) {
   var err error
 
-  fields := []Field{Author, Title, Series}
+  fields := []Field{Author, Language, Series, Title}
 
   terms := make([]SearchTerm, len(fields))