Зацикливание на db intmap (человек) - PullRequest
2 голосов
/ 11 июля 2011

пример:

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

db /person : intmap(person)

Я знаю, как получить одного человека из БД, но как мне их всех получить? и распечатать их в HTML-таблицу?

Thx.

Ответы [ 4 ]

4 голосов
/ 11 июля 2011

Это должно сделать это:

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

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

... и затем вызовите render () на странице вашего сервера ...

3 голосов
/ 11 июля 2011

Проще говоря:

  • / person [i] получает элемент i из базы данных
  • / person получает всю intmap из базы данных
  • ! / Person дает вам дескриптор базы данных, в которой вы можете использовать, например, Db.intmap_fold_range для оптимизированного частичного доступа
2 голосов
/ 11 июля 2011

Я советую вам использовать Db.intmap_fold_range вместо InMap.fold. Это будет быстрее, чем InMap.fold, который должен построить всю карту в OPA, прежде чем сложить на ней.

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

Вот пример для вашего типа:

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)
1 голос
/ 12 июля 2011

После комментария @shomodj к моему ответу, это мой полный код для печати списка людей (на основе кода Cédrics)

// 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)
...