1 28 29 package com.caucho.amber.expr; 30 31 import com.caucho.amber.field.AmberField; 32 import com.caucho.amber.query.FromItem; 33 import com.caucho.amber.query.QueryParseException; 34 import com.caucho.amber.query.QueryParser; 35 import com.caucho.amber.type.RelatedType; 36 import com.caucho.util.L10N; 37 38 41 public class ManyToOneSchemaExpr extends SchemaExpr { 42 private static final L10N L = new L10N(CollectionSchemaExpr.class); 43 44 private ManyToOneExpr _expr; 45 private String _name; 46 47 50 public ManyToOneSchemaExpr(ManyToOneExpr expr, String name) 51 { 52 _expr = expr; 53 _name = name; 54 } 55 56 59 public String getTailName() 60 { 61 return _name; 62 } 63 64 67 public SchemaExpr createField(QueryParser parser, String name) 68 throws QueryParseException 69 { 70 RelatedType type = _expr.getTargetType(); 71 72 AmberField field = type.getField(name); 73 74 if (field == null) 75 throw parser.error(L.l("{0}: '{1}' is an unknown field.", 76 type.getBeanClass().getName(), 77 name)); 78 79 AmberExpr fieldExpr = _expr.createField(parser, name); 80 81 if (fieldExpr instanceof ManyToOneExpr) 82 return new ManyToOneSchemaExpr((ManyToOneExpr) fieldExpr, name); 83 87 else if (fieldExpr instanceof OneToManyExpr) 88 return new OneToManySchemaExpr((OneToManyExpr) fieldExpr); 89 throw parser.error(L.l("{0}: '{1}' must be a collection.", 90 type.getBeanClass().getName(), 91 name)); 92 } 93 94 97 public FromItem addFromItem(QueryParser parser, String id) 98 throws QueryParseException 99 { 100 _expr = (ManyToOneExpr) _expr.bindSelect(parser, id); 101 102 FromItem fromItem = _expr.bindSubPath(parser); 103 104 return fromItem; 105 } 106 } 107 | Popular Tags |