Newbie questions about Pliant

Newbie questions about Pliant

db question: classes <-> students

Trying to understand how to use the Db engine,
with a classes/students example (n-n relationships)
Message posted by reitman on 2004/06/11 21:03:39
I tried to code a classes/students example in order to understand how things work.  

It the following program I had to comment out Set:Student in Class type, 
because it was crushing durint creation of the db
object.  With it commented out I get a syntax error in 
'register_student_in_class' function:

------
boris@einstein:~$ pliant db_example.pli
AA
BB
----------------------------------------------------------------
Failed to compile :>   ((Data Class) r  'class')
  compile file:db_example.pli (internals) 35 26
-------




Here is the program:

---------------------------
module "/pliant/appli/database.pli"

type Student
  later

type Class
  #field Set:Student students
  field Str name

type Student
  field Set:Class classes
  field Str name

type MyDatabase
  field Set:Student students
  field Set:Class classes

console "AA" eol
(gvar Database:MyDatabase db) load "file:/home/boris/db_example.pdb"  mount "/borisreitman/db_example"
console "BB" eol  # if Set:Student line in Class type is enabled, crashes before here

gvar ( Data Set:Student )  students :> db:data:students
gvar ( Data Set:Class )    classes  :> db:data:classes

##

function register_student_in_class student class
  arg Data:Student student
  arg Data:Class class

  var Str tmp_id

  # add class to student
  tmp_id := generate_id
  student:classes create tmp_id
  student:classes tmp_id :> class

  # add student to class
  tmp_id := generate_id
  class:students create tmp_id
  class:students tmp_id :> student

function create_student name -> student
  arg Str name
  arg Data:Student student
  var Str id := generate_id
  console "generate id = " id eol
  students create id
  student :> students id
  student name := name

function create_class name -> class
  arg Str name
  arg Data:Class class
  var Str id := generate_id
  classes create id
  class :> classes id
  class name := name

function dump_class class
  arg Data:Class class
  console "Students in class: " class:name eol
  each student class:students
    console student:name eol

function main
  var Data:Student student1 :> create_student "student1"
  var Data:Class class1 :> create_student "class1"

  #register_student_in_class student1 class1
  #dump_class class

  # now, change student name
  #student1 name := "studentA"

  # dump class1 again, expect change of name for student1
  #dump_class

main
------------------------------------------

How would I fix it up so that if I uncomment all the commented
code then things work as expected ?

Thanks,
Boris
Message posted by hubert.tonneau on 2004/06/11 21:56:55
If you want to implement n-n relation, then you have to use pointers (I mean
store the record key):

type Class
  field Set:Str students # we store the key of the student
  field Str name

type Student
  field Set:Str classes # we store the key of the class
  field Str name

type MyDatabase
  field Set:Student students
  field Set:Class classes

Then you can add a fiew methods and meta to hide the pointers at application level,
but the effective storage model will remain this one.