[Monetdb-developers] "pseudo" nested BATs

Stefan Manegold Stefan.Manegold at cwi.nl
Wed Dec 15 00:38:24 CET 2004


Hi MonetDB developers and users,

sorry for this "blunt" posting, but I thought, the problem, respectively the
solution/recommendation that will hopefully be initiated by this question,
might be interesting for some more of you:

Triggered by a question from Agustin, I noticed that I (believe it or not
;-) apparently lack some knowledge of / experiences with MonetDB/MIL:

Consider you have a variable "a" holding a (possible transient) BAT, and
another variable "b" holding a second BAT, which happens to be a view of the
first one. Both BATs haven't been baptized ("rename()"), yet; hence they
still hold there default names:

	var a := new(void,int).seqbase(0 at 0).insert(nil,1).insert(nil,2).access(BAT_READ);
	var b := reverse(a);
	print(a);
#-----------------#
# h     tmp_29    # name
# void  int       # type
#-----------------#
[ 0 at 0,    1       ]
[ 1 at 0,    2       ]
	print(b);
#-----------------#
# t     tmp_29    # name
# int   void      # type
#-----------------#
[ 1,      0 at 0     ]
[ 2,      1 at 0     ]

Then, these BATs should be gathered in a "container"-BAT. Since (persistent)
nested BATs have disappeared (for good reasons!), we do this by gathering
the BAT's name in the container:

	var c := new(void,str).seqbase(10 at 0);
	c.insert(nil,bbpname(a)).insert(nil,bbpname(b));
	print(c);
#-------------------------#
# h	tmp_28		  # name
# void	str		  # type
#-------------------------#
[ 10 at 0,	  "tmp_29"	  ]
[ 11 at 0,	  "tmp_29"	  ]

Since the second BAT is only a view of the first one, they share not only
the same memory/storage, but also the same (bbp-)name; hence, they are not
distinguishable by (only) their (bbp-)names, and thus the container c actually
contains the first BAT twice iso each BAT once:

	print(bat(fetch(c,0)));
#-----------------#
# h	tmp_29	  # name
# void	int	  # type
#-----------------#
[ 0 at 0,	  1	  ]
[ 1 at 0,	  2	  ]
	print(bat(fetch(c,1)));
#-----------------#
# h	tmp_29	  # name
# void	int	  # type
#-----------------#
[ 0 at 0,	  1	  ]
[ 1 at 0,	  2	  ]
	print(bbpname(a));
[ "tmp_29" ]
	print(bbpname(b));
[ "tmp_29" ]

Obviously, the problem can be solved/avoided by baptizing the two BATs, and
hence making them unique "individuals":

	rename(a,"BAT_a");
	rename(b,"BAT_b");
	print(bbpname(a));
[ "BAT_a" ]
	print(bbpname(b));
[ "BAT_b" ]
	c.insert(nil,bbpname(a)).insert(nil,bbpname(b));
	print(c);
#-------------------------#
# h	tmp_28		  # name
# void	str		  # type
#-------------------------#
[ 10 at 0,	  "tmp_29"	  ]
[ 11 at 0,	  "tmp_29"	  ]
[ 12 at 0,	  "BAT_a"	  ]
[ 13 at 0,	  "BAT_b"	  ]
	print(bat(fetch(c,0)));
!ERROR: interpret_params: print(param 1): invalid BAT.
	print(bat(fetch(c,1)));
!ERROR: interpret_params: print(param 1): invalid BAT.
	print(bat(fetch(c,2)));
#-----------------#
# h	BAT_b	  # name
# void	int	  # type
#-----------------#
[ 0 at 0,	  1	  ]
[ 1 at 0,	  2	  ]
	print(bat(fetch(c,3)));
#-----------------#
# t	BAT_b	  # name
# int	void	  # type
#-----------------#
[ 1,	  0 at 0	  ]
[ 2,	  1 at 0	  ]


My question is now:

- Is this the only solution, or am I just not aware of another command iso
  bbpname() that would return unique "default" name for non-renamed view?

Of course, given the fact that only MonetDB itself has control over the
default "tmp_*" names, it is always recommendable to assign names that you
can control yourself, whenever you use a BAT's name as its only reference...

Stefan

-- 
| Dr. Stefan Manegold | mailto:Stefan.Manegold at cwi.nl |
| CWI,  P.O.Box 94079 | http://www.cwi.nl/~manegold/  |
| 1090 GB Amsterdam   | Tel.: +31 (20) 592-4212       |
| The Netherlands     | Fax : +31 (20) 592-4312       |




More information about the developers-list mailing list