1 RedQueryBuilderFactory.create({
  2 	targetId : 'rqbVisitor',
  3 	meta : {
  4 		tables : [ {
  5 			"name" : "PERSON",
  6 			"label" : "Person",
  7 			"columns" : [ {
  8 				"name" : "NAME",
  9 				"label" : "Name",
 10 				"type" : "STRING",
 11 				"size" : 10
 12 			}, {
 13 				"name" : "DOB",
 14 				"label" : "Date of birth",
 15 				"type" : "DATE"
 16 			}, {
 17 				"name" : "SEX",
 18 				"label" : "Sex",
 19 				"type" : "STRING",
 20 				"editor" : "SELECT"
 21 			}, {
 22 				"name" : "CATEGORY",
 23 				"label" : "Category",
 24 				"type" : "REF",
 25 			}  ],
 26 			fks : []
 27 		} ],
 28 
 29 		types : [ {
 30 			"name" : "STRING",
 31 			"editor" : "TEXT",
 32 			"operators" : [ {
 33 				"name" : "=",
 34 				"label" : "is",
 35 				"cardinality" : "ONE"
 36 			}, {
 37 				"name" : "<>",
 38 				"label" : "is not",
 39 				"cardinality" : "ONE"
 40 			}, {
 41 				"name" : "LIKE",
 42 				"label" : "like",
 43 				"cardinality" : "ONE"
 44 			}, {
 45 				"name" : "<",
 46 				"label" : "less than",
 47 				"cardinality" : "ONE"
 48 			}, {
 49 				"name" : ">",
 50 				"label" : "greater than",
 51 				"cardinality" : "ONE"
 52 			} ]
 53 		}, {
 54 			"name" : "DATE",
 55 			"editor" : "DATE",
 56 			"operators" : [ {
 57 				"name" : "=",
 58 				"label" : "is",
 59 				"cardinality" : "ONE"
 60 			}, {
 61 				"name" : "<>",
 62 				"label" : "is not",
 63 				"cardinality" : "ONE"
 64 			}, {
 65 				"name" : "<",
 66 				"label" : "before",
 67 				"cardinality" : "ONE"
 68 			}, {
 69 				"name" : ">",
 70 				"label" : "after",
 71 				"cardinality" : "ONE"
 72 			} ]
 73 		}, {
 74 			"name" : "REF",
 75 			"editor" : "SELECT",
 76 			"operators" : [ {
 77 				"name" : "IN",
 78 				"label" : "any of",
 79 				"cardinality" : "MULTI"
 80 			}]
 81 		}  ]
 82 	},
 83 	onLoad : function(instance) {
 84 		// XXX this really how you get it?
 85 		this.instance = instance;
 86 	},
 87 	onSqlChange : function(sql, args) {
 88 		var visitor = new rqb.Visitor();
 89 		visitor.visit = function(ctx) {
 90 			if (ctx.asHasMessages()) {
 91 				var msg = new rqb.Message('Hello ' + ctx.asHasValue().getValue());
 92 				ctx.asHasMessages().showMessage(msg);
 93 			}
 94 		}
 95 		this.instance.accept(visitor);
 96 	},
 97 	enumerate : function(request, response) {
 98 		if (request.columnName == 'CATEGORY') {
 99 			response([{value:'A', label:'Small'}, {value:'B', label:'Medium'}]);
100 		} else {
101 			response([{value:'M', label:'Male'}, {value:'F', label:'Female'}]);
102 		}
103 	},
104 	editors : [ {
105 		name : 'DATE',
106 		format : 'dd.MM.yyyy'
107 	} ]
108 });