1 28 29 package com.caucho.amber.query; 30 31 import com.caucho.util.CharBuffer; 32 33 import com.caucho.amber.table.LinkColumns; 34 import com.caucho.amber.table.ForeignColumn; 35 36 39 public class OneToManyJoinExpr extends JoinExpr { 40 private LinkColumns _linkColumns; 41 42 private FromItem _sourceFromItem; 43 private FromItem _targetFromItem; 44 45 48 public OneToManyJoinExpr(LinkColumns linkColumns, 49 FromItem source, 50 FromItem target) 51 { 52 _linkColumns = linkColumns; 53 54 _sourceFromItem = source; 55 _targetFromItem = target; 56 57 if (source == null || target == null) 58 throw new NullPointerException(); 59 } 60 61 64 public boolean isBoolean() 65 { 66 return true; 67 } 68 69 72 public AmberExpr bindSelect(QueryParser parser) 73 { 74 return this; 75 } 76 77 80 public boolean bindToFromItem() 81 { 82 if (_sourceFromItem.getJoinExpr() == null || 83 _sourceFromItem.getJoinExpr().equals(this)) { 84 _sourceFromItem.setJoinExpr(this); 85 return true; 86 } 87 88 ManyToOneJoinExpr manyToOne = new ManyToOneJoinExpr(_linkColumns, 89 _sourceFromItem, 90 _targetFromItem); 91 92 if (_targetFromItem.getJoinExpr() == null || 93 _targetFromItem.getJoinExpr().equals(manyToOne)) { 94 _targetFromItem.setJoinExpr(manyToOne); 95 96 return true; 97 } 98 else 99 return false; 100 } 101 102 105 FromItem getJoinTarget() 106 { 107 return _targetFromItem; 108 } 109 110 116 FromItem getJoinParent() 117 { 118 return _targetFromItem; 119 } 120 121 124 public AmberExpr replace(KeyColumnExpr id) 125 { 126 PathExpr parent = id.getParent(); 127 128 if (parent.getChildFromItem() != _targetFromItem) 129 return id; 130 131 ForeignColumn sourceColumn = _linkColumns.getSourceColumn(id.getColumn()); 132 133 if (sourceColumn == null) 134 throw new IllegalStateException(id.getColumn().getName()); 135 136 return new ColumnExpr(_sourceFromItem.getIdExpr(), sourceColumn); 137 } 138 139 142 public AmberExpr replace(IdExpr id) 143 { 144 return id; 145 } 146 147 150 public AmberExpr getWhere() 151 { 152 166 167 return null; 168 } 169 170 173 public void generateWhere(CharBuffer cb) 174 { 175 cb.append(_linkColumns.generateWhere(_sourceFromItem.getName(), 176 _targetFromItem.getName())); 177 } 178 179 182 public void generateJoin(CharBuffer cb) 183 { 184 cb.append(_linkColumns.generateJoin(_sourceFromItem.getName(), 185 _targetFromItem.getName())); 186 } 187 188 191 public boolean equals(Object o) 192 { 193 if (! (o instanceof OneToManyJoinExpr)) 194 return false; 195 196 OneToManyJoinExpr joinExpr = (OneToManyJoinExpr) o; 197 198 return (_linkColumns.equals(joinExpr._linkColumns) && 199 _targetFromItem.equals(joinExpr._targetFromItem) && 200 _sourceFromItem.equals(joinExpr._sourceFromItem)); 201 } 202 203 204 public String toString() 205 { 206 return ("OneToManyJoinExpr[" + _linkColumns + "," + 207 _targetFromItem + "," + _sourceFromItem + "]"); 208 } 209 } 210 | Popular Tags |