Looping over db intmap(person)

徘徊边缘 提交于 2019-12-12 19:41:45

问题


example:

type person = { name : string
                ; age : int
              }

db /person : intmap(person)

I know how to get a single person from the db, but how do I get them all? and print them in a html table?

Thx.


回答1:


I advise you to use Db.intmap_fold_range instead of InMap.fold. It will be faster than InMap.fold which need to build the all map in OPA before folding on it.

http://opalang.org/resources/doc/index.html#db.opa.html/!/value_stdlib.core.db.Db.intmap_fold_range

Here is an example for your type:

type person = { name : string
                ; age : int
              }

db /person : intmap(person)

add(name, age) =
  /person[age] <- { ~name; ~age }

fold_person(acc, id) =
 person = /person[id]
 <>{acc}</><li>{person.name} {person.age}</li>

start() =
  do add("name1", 1)
  do add("name2", 2)
  do add("name3", 3)
  Db.intmap_fold_range(
    @/person,
    fold_person,
    <></>, 0, none, /* acc, starting key, optional max */
    (_ -> true) /* check range */
  )

server = one_page_server("Hello", start)



回答2:


This should do it :

my_html_list() =
  List.map(
    person -> <li>{person.name}</li>,
    IntMap.To.val_list(/person)
  )

render() = <ul>{my_html_list()}</ul>

... and then call render() in your server page ...




回答3:


Simply put:

  • /person[i] gets element i from the database
  • /person gets the whole intmap from the database
  • !/person gives you a handle to the database, on which you could use, for example, Db.intmap_fold_range for optimised partial access



回答4:


Following @shomodj comment on my answer, this is my complete code to print the persons list (inspired by Cédrics code)

// Declare type person
type person = {
  name : string
  age : int
}

// Declare database
db /person : intmap(person)

// Add function
add(name, age) =
  /person[age] <- { ~name ~age }

// Add to database when server launches
do add("name1", 1)
do add("name2", 2)
do add("name3", 3)

// Build the persons <li> list
my_html_list() =
  List.map(
    person -> <li>{person.name}</li>,
    IntMap.To.val_list(/person)
  )

// Build the complete html list (with ul)
render() = <ul>{my_html_list()}</ul>

// Create the server
server = one_page_server("Hello", render)


来源:https://stackoverflow.com/questions/6649823/looping-over-db-intmapperson

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!