root / trunk / web / dojo / dojox / data / QueryReadStore.js @ 13
History | View | Annotate | Download (5.87 KB)
| 1 | 9 | andrej.cim | /*
|
|---|---|---|---|
| 2 | Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
||
| 3 | Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||
| 4 | see: http://dojotoolkit.org/license for details
|
||
| 5 | */
|
||
| 6 | |||
| 7 | |||
| 8 | if(!dojo._hasResource["dojox.data.QueryReadStore"]){ |
||
| 9 | dojo._hasResource["dojox.data.QueryReadStore"]=true; |
||
| 10 | dojo.provide("dojox.data.QueryReadStore");
|
||
| 11 | dojo.require("dojo.string");
|
||
| 12 | dojo.require("dojo.data.util.sorter");
|
||
| 13 | dojo.declare("dojox.data.QueryReadStore",null,{url:"",requestMethod:"get",_className:"dojox.data.QueryReadStore",_items:[],_lastServerQuery:null,_numRows:-1,lastRequestHash:null,doClientPaging:false,doClientSorting:false,_itemsByIdentity:null,_identifier:null,_features:{"dojo.data.api.Read":true,"dojo.data.api.Identity":true},_labelAttr:"label",constructor:function(_1){ |
||
| 14 | dojo.mixin(this,_1);
|
||
| 15 | },getValue:function(_2,_3,_4){ |
||
| 16 | this._assertIsItem(_2);
|
||
| 17 | if(!dojo.isString(_3)){
|
||
| 18 | throw new Error(this._className+".getValue(): Invalid attribute, string expected!"); |
||
| 19 | } |
||
| 20 | if(!this.hasAttribute(_2,_3)){ |
||
| 21 | if(_4){
|
||
| 22 | return _4;
|
||
| 23 | } |
||
| 24 | } |
||
| 25 | return _2.i[_3];
|
||
| 26 | },getValues:function(_5,_6){ |
||
| 27 | this._assertIsItem(_5);
|
||
| 28 | var _7=[];
|
||
| 29 | if(this.hasAttribute(_5,_6)){ |
||
| 30 | _7.push(_5.i[_6]); |
||
| 31 | } |
||
| 32 | return _7;
|
||
| 33 | },getAttributes:function(_8){ |
||
| 34 | this._assertIsItem(_8);
|
||
| 35 | var _9=[];
|
||
| 36 | for(var i in _8.i){ |
||
| 37 | _9.push(i); |
||
| 38 | } |
||
| 39 | return _9;
|
||
| 40 | },hasAttribute:function(_a,_b){ |
||
| 41 | return this.isItem(_a)&&typeof _a.i[_b]!="undefined"; |
||
| 42 | },containsValue:function(_c,_d,_e){ |
||
| 43 | var _f=this.getValues(_c,_d); |
||
| 44 | var len=_f.length;
|
||
| 45 | for(var i=0;i<len;i++){ |
||
| 46 | if(_f[i]==_e){
|
||
| 47 | return true; |
||
| 48 | } |
||
| 49 | } |
||
| 50 | return false; |
||
| 51 | },isItem:function(_10){ |
||
| 52 | if(_10){
|
||
| 53 | return typeof _10.r!="undefined"&&_10.r==this; |
||
| 54 | } |
||
| 55 | return false; |
||
| 56 | },isItemLoaded:function(_11){ |
||
| 57 | return this.isItem(_11); |
||
| 58 | },loadItem:function(_12){ |
||
| 59 | if(this.isItemLoaded(_12.item)){ |
||
| 60 | return;
|
||
| 61 | } |
||
| 62 | },fetch:function(_13){ |
||
| 63 | _13=_13||{};
|
||
| 64 | if(!_13.store){
|
||
| 65 | _13.store=this;
|
||
| 66 | } |
||
| 67 | var _14=this; |
||
| 68 | var _15=function(_16,_17){ |
||
| 69 | if(_17.onError){
|
||
| 70 | var _18=_17.scope||dojo.global;
|
||
| 71 | _17.onError.call(_18,_16,_17); |
||
| 72 | } |
||
| 73 | }; |
||
| 74 | var _19=function(_1a,_1b,_1c){ |
||
| 75 | var _1d=_1b.abort||null; |
||
| 76 | var _1e=false; |
||
| 77 | var _1f=_1b.start?_1b.start:0; |
||
| 78 | if(_14.doClientPaging==false){ |
||
| 79 | _1f=0;
|
||
| 80 | } |
||
| 81 | var _20=_1b.count?(_1f+_1b.count):_1a.length;
|
||
| 82 | _1b.abort=function(){ |
||
| 83 | _1e=true;
|
||
| 84 | if(_1d){
|
||
| 85 | _1d.call(_1b); |
||
| 86 | } |
||
| 87 | }; |
||
| 88 | var _21=_1b.scope||dojo.global;
|
||
| 89 | if(!_1b.store){
|
||
| 90 | _1b.store=_14; |
||
| 91 | } |
||
| 92 | if(_1b.onBegin){
|
||
| 93 | _1b.onBegin.call(_21,_1c,_1b); |
||
| 94 | } |
||
| 95 | if(_1b.sort&&_14.doClientSorting){
|
||
| 96 | _1a.sort(dojo.data.util.sorter.createSortFunction(_1b.sort,_14)); |
||
| 97 | } |
||
| 98 | if(_1b.onItem){
|
||
| 99 | for(var i=_1f;(i<_1a.length)&&(i<_20);++i){ |
||
| 100 | var _22=_1a[i];
|
||
| 101 | if(!_1e){
|
||
| 102 | _1b.onItem.call(_21,_22,_1b); |
||
| 103 | } |
||
| 104 | } |
||
| 105 | } |
||
| 106 | if(_1b.onComplete&&!_1e){
|
||
| 107 | var _23=null; |
||
| 108 | if(!_1b.onItem){
|
||
| 109 | _23=_1a.slice(_1f,_20); |
||
| 110 | } |
||
| 111 | _1b.onComplete.call(_21,_23,_1b); |
||
| 112 | } |
||
| 113 | }; |
||
| 114 | this._fetchItems(_13,_19,_15);
|
||
| 115 | return _13;
|
||
| 116 | },getFeatures:function(){ |
||
| 117 | return this._features; |
||
| 118 | },close:function(_24){ |
||
| 119 | },getLabel:function(_25){ |
||
| 120 | if(this._labelAttr&&this.isItem(_25)){ |
||
| 121 | return this.getValue(_25,this._labelAttr); |
||
| 122 | } |
||
| 123 | return undefined; |
||
| 124 | },getLabelAttributes:function(_26){ |
||
| 125 | if(this._labelAttr){ |
||
| 126 | return [this._labelAttr]; |
||
| 127 | } |
||
| 128 | return null; |
||
| 129 | },_xhrFetchHandler:function(_27,_28,_29,_2a){ |
||
| 130 | _27=this._filterResponse(_27);
|
||
| 131 | if(_27.label){
|
||
| 132 | this._labelAttr=_27.label;
|
||
| 133 | } |
||
| 134 | var _2b=_27.numRows||-1; |
||
| 135 | this._items=[];
|
||
| 136 | dojo.forEach(_27.items,function(e){
|
||
| 137 | this._items.push({i:e,r:this}); |
||
| 138 | },this);
|
||
| 139 | var _2c=_27.identifier;
|
||
| 140 | this._itemsByIdentity={};
|
||
| 141 | if(_2c){
|
||
| 142 | this._identifier=_2c;
|
||
| 143 | var i;
|
||
| 144 | for(i=0;i<this._items.length;++i){ |
||
| 145 | var _2d=this._items[i].i; |
||
| 146 | var _2e=_2d[_2c];
|
||
| 147 | if(!this._itemsByIdentity[_2e]){ |
||
| 148 | this._itemsByIdentity[_2e]=_2d;
|
||
| 149 | }else{
|
||
| 150 | throw new Error(this._className+": The json data as specified by: ["+this.url+"] is malformed. Items within the list have identifier: ["+_2c+"]. Value collided: ["+_2e+"]"); |
||
| 151 | } |
||
| 152 | } |
||
| 153 | }else{
|
||
| 154 | this._identifier=Number;
|
||
| 155 | for(i=0;i<this._items.length;++i){ |
||
| 156 | this._items[i].n=i;
|
||
| 157 | } |
||
| 158 | } |
||
| 159 | _2b=this._numRows=(_2b===-1)?this._items.length:_2b; |
||
| 160 | _29(this._items,_28,_2b);
|
||
| 161 | this._numRows=_2b;
|
||
| 162 | },_fetchItems:function(_2f,_30,_31){ |
||
| 163 | var _32=_2f.serverQuery||_2f.query||{};
|
||
| 164 | if(!this.doClientPaging){ |
||
| 165 | _32.start=_2f.start||0;
|
||
| 166 | if(_2f.count){
|
||
| 167 | _32.count=_2f.count; |
||
| 168 | } |
||
| 169 | } |
||
| 170 | if(!this.doClientSorting&&_2f.sort){ |
||
| 171 | var _33=[];
|
||
| 172 | dojo.forEach(_2f.sort,function(_34){
|
||
| 173 | if(_34&&_34.attribute){
|
||
| 174 | _33.push((_34.descending?"-":"")+_34.attribute); |
||
| 175 | } |
||
| 176 | }); |
||
| 177 | _32.sort=_33.join(",");
|
||
| 178 | } |
||
| 179 | if(this.doClientPaging&&this._lastServerQuery!==null&&dojo.toJson(_32)==dojo.toJson(this._lastServerQuery)){ |
||
| 180 | this._numRows=(this._numRows===-1)?this._items.length:this._numRows; |
||
| 181 | _30(this._items,_2f,this._numRows); |
||
| 182 | }else{
|
||
| 183 | var _35=this.requestMethod.toLowerCase()=="post"?dojo.xhrPost:dojo.xhrGet; |
||
| 184 | var _36=_35({url:this.url,handleAs:"json-comment-optional",content:_32}); |
||
| 185 | _36.addCallback(dojo.hitch(this,function(_37){ |
||
| 186 | this._xhrFetchHandler(_37,_2f,_30,_31);
|
||
| 187 | })); |
||
| 188 | _36.addErrback(function(_38){
|
||
| 189 | _31(_38,_2f); |
||
| 190 | }); |
||
| 191 | this.lastRequestHash=new Date().getTime()+"-"+String(Math.random()).substring(2); |
||
| 192 | this._lastServerQuery=dojo.mixin({},_32);
|
||
| 193 | } |
||
| 194 | },_filterResponse:function(_39){ |
||
| 195 | return _39;
|
||
| 196 | },_assertIsItem:function(_3a){ |
||
| 197 | if(!this.isItem(_3a)){ |
||
| 198 | throw new Error(this._className+": Invalid item argument."); |
||
| 199 | } |
||
| 200 | },_assertIsAttribute:function(_3b){ |
||
| 201 | if(typeof _3b!=="string"){ |
||
| 202 | throw new Error(this._className+": Invalid attribute argument ('"+_3b+"')."); |
||
| 203 | } |
||
| 204 | },fetchItemByIdentity:function(_3c){ |
||
| 205 | if(this._itemsByIdentity){ |
||
| 206 | var _3d=this._itemsByIdentity[_3c.identity]; |
||
| 207 | if(!(_3d===undefined)){ |
||
| 208 | if(_3c.onItem){
|
||
| 209 | var _3e=_3c.scope?_3c.scope:dojo.global;
|
||
| 210 | _3c.onItem.call(_3e,{i:_3d,r:this});
|
||
| 211 | } |
||
| 212 | return;
|
||
| 213 | } |
||
| 214 | } |
||
| 215 | var _3f=function(_40,_41){ |
||
| 216 | var _42=_3c.scope?_3c.scope:dojo.global;
|
||
| 217 | if(_3c.onError){
|
||
| 218 | _3c.onError.call(_42,_40); |
||
| 219 | } |
||
| 220 | }; |
||
| 221 | var _43=function(_44,_45){ |
||
| 222 | var _46=_3c.scope?_3c.scope:dojo.global;
|
||
| 223 | try{
|
||
| 224 | var _47=null; |
||
| 225 | if(_44&&_44.length==1){ |
||
| 226 | _47=_44[0];
|
||
| 227 | } |
||
| 228 | if(_3c.onItem){
|
||
| 229 | _3c.onItem.call(_46,_47); |
||
| 230 | } |
||
| 231 | } |
||
| 232 | catch(error){
|
||
| 233 | if(_3c.onError){
|
||
| 234 | _3c.onError.call(_46,error); |
||
| 235 | } |
||
| 236 | } |
||
| 237 | }; |
||
| 238 | var _48={serverQuery:{id:_3c.identity}}; |
||
| 239 | this._fetchItems(_48,_43,_3f);
|
||
| 240 | },getIdentity:function(_49){ |
||
| 241 | var _4a=null; |
||
| 242 | if(this._identifier===Number){ |
||
| 243 | _4a=_49.n; |
||
| 244 | }else{
|
||
| 245 | _4a=_49.i[this._identifier];
|
||
| 246 | } |
||
| 247 | return _4a;
|
||
| 248 | },getIdentityAttributes:function(_4b){ |
||
| 249 | return [this._identifier]; |
||
| 250 | }}); |
||
| 251 | } |