blob: eec2c92d72658d541d02893b1f2a7050c8d3b30c [file] [log] [blame]
/*
Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
if(!dojo._hasResource["dojox.data.QueryReadStore"]){
dojo._hasResource["dojox.data.QueryReadStore"]=true;
dojo.provide("dojox.data.QueryReadStore");
dojo.require("dojo.string");
dojo.require("dojo.data.util.sorter");
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){
dojo.mixin(this,_1);
},getValue:function(_2,_3,_4){
this._assertIsItem(_2);
if(!dojo.isString(_3)){
throw new Error(this._className+".getValue(): Invalid attribute, string expected!");
}
if(!this.hasAttribute(_2,_3)){
if(_4){
return _4;
}
}
return _2.i[_3];
},getValues:function(_5,_6){
this._assertIsItem(_5);
var _7=[];
if(this.hasAttribute(_5,_6)){
_7.push(_5.i[_6]);
}
return _7;
},getAttributes:function(_8){
this._assertIsItem(_8);
var _9=[];
for(var i in _8.i){
_9.push(i);
}
return _9;
},hasAttribute:function(_a,_b){
return this.isItem(_a)&&typeof _a.i[_b]!="undefined";
},containsValue:function(_c,_d,_e){
var _f=this.getValues(_c,_d);
var len=_f.length;
for(var i=0;i<len;i++){
if(_f[i]==_e){
return true;
}
}
return false;
},isItem:function(_10){
if(_10){
return typeof _10.r!="undefined"&&_10.r==this;
}
return false;
},isItemLoaded:function(_11){
return this.isItem(_11);
},loadItem:function(_12){
if(this.isItemLoaded(_12.item)){
return;
}
},fetch:function(_13){
_13=_13||{};
if(!_13.store){
_13.store=this;
}
var _14=this;
var _15=function(_16,_17){
if(_17.onError){
var _18=_17.scope||dojo.global;
_17.onError.call(_18,_16,_17);
}
};
var _19=function(_1a,_1b,_1c){
var _1d=_1b.abort||null;
var _1e=false;
var _1f=_1b.start?_1b.start:0;
if(_14.doClientPaging==false){
_1f=0;
}
var _20=_1b.count?(_1f+_1b.count):_1a.length;
_1b.abort=function(){
_1e=true;
if(_1d){
_1d.call(_1b);
}
};
var _21=_1b.scope||dojo.global;
if(!_1b.store){
_1b.store=_14;
}
if(_1b.onBegin){
_1b.onBegin.call(_21,_1c,_1b);
}
if(_1b.sort&&_14.doClientSorting){
_1a.sort(dojo.data.util.sorter.createSortFunction(_1b.sort,_14));
}
if(_1b.onItem){
for(var i=_1f;(i<_1a.length)&&(i<_20);++i){
var _22=_1a[i];
if(!_1e){
_1b.onItem.call(_21,_22,_1b);
}
}
}
if(_1b.onComplete&&!_1e){
var _23=null;
if(!_1b.onItem){
_23=_1a.slice(_1f,_20);
}
_1b.onComplete.call(_21,_23,_1b);
}
};
this._fetchItems(_13,_19,_15);
return _13;
},getFeatures:function(){
return this._features;
},close:function(_24){
},getLabel:function(_25){
if(this._labelAttr&&this.isItem(_25)){
return this.getValue(_25,this._labelAttr);
}
return undefined;
},getLabelAttributes:function(_26){
if(this._labelAttr){
return [this._labelAttr];
}
return null;
},_xhrFetchHandler:function(_27,_28,_29,_2a){
_27=this._filterResponse(_27);
if(_27.label){
this._labelAttr=_27.label;
}
var _2b=_27.numRows||-1;
this._items=[];
dojo.forEach(_27.items,function(e){
this._items.push({i:e,r:this});
},this);
var _2c=_27.identifier;
this._itemsByIdentity={};
if(_2c){
this._identifier=_2c;
var i;
for(i=0;i<this._items.length;++i){
var _2d=this._items[i].i;
var _2e=_2d[_2c];
if(!this._itemsByIdentity[_2e]){
this._itemsByIdentity[_2e]=_2d;
}else{
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+"]");
}
}
}else{
this._identifier=Number;
for(i=0;i<this._items.length;++i){
this._items[i].n=i;
}
}
_2b=this._numRows=(_2b===-1)?this._items.length:_2b;
_29(this._items,_28,_2b);
this._numRows=_2b;
},_fetchItems:function(_2f,_30,_31){
var _32=_2f.serverQuery||_2f.query||{};
if(!this.doClientPaging){
_32.start=_2f.start||0;
if(_2f.count){
_32.count=_2f.count;
}
}
if(!this.doClientSorting){
if(_2f.sort){
var _33=_2f.sort[0];
if(_33&&_33.attribute){
var _34=_33.attribute;
if(_33.descending){
_34="-"+_34;
}
_32.sort=_34;
}
}
}
if(this.doClientPaging&&this._lastServerQuery!==null&&dojo.toJson(_32)==dojo.toJson(this._lastServerQuery)){
this._numRows=(this._numRows===-1)?this._items.length:this._numRows;
_30(this._items,_2f,this._numRows);
}else{
var _35=this.requestMethod.toLowerCase()=="post"?dojo.xhrPost:dojo.xhrGet;
var _36=_35({url:this.url,handleAs:"json-comment-optional",content:_32});
_36.addCallback(dojo.hitch(this,function(_37){
this._xhrFetchHandler(_37,_2f,_30,_31);
}));
_36.addErrback(function(_38){
_31(_38,_2f);
});
this.lastRequestHash=new Date().getTime()+"-"+String(Math.random()).substring(2);
this._lastServerQuery=dojo.mixin({},_32);
}
},_filterResponse:function(_39){
return _39;
},_assertIsItem:function(_3a){
if(!this.isItem(_3a)){
throw new Error(this._className+": Invalid item argument.");
}
},_assertIsAttribute:function(_3b){
if(typeof _3b!=="string"){
throw new Error(this._className+": Invalid attribute argument ('"+_3b+"').");
}
},fetchItemByIdentity:function(_3c){
if(this._itemsByIdentity){
var _3d=this._itemsByIdentity[_3c.identity];
if(!(_3d===undefined)){
if(_3c.onItem){
var _3e=_3c.scope?_3c.scope:dojo.global;
_3c.onItem.call(_3e,{i:_3d,r:this});
}
return;
}
}
var _3f=function(_40,_41){
var _42=_3c.scope?_3c.scope:dojo.global;
if(_3c.onError){
_3c.onError.call(_42,_40);
}
};
var _43=function(_44,_45){
var _46=_3c.scope?_3c.scope:dojo.global;
try{
var _47=null;
if(_44&&_44.length==1){
_47=_44[0];
}
if(_3c.onItem){
_3c.onItem.call(_46,_47);
}
}
catch(error){
if(_3c.onError){
_3c.onError.call(_46,error);
}
}
};
var _48={serverQuery:{id:_3c.identity}};
this._fetchItems(_48,_43,_3f);
},getIdentity:function(_49){
var _4a=null;
if(this._identifier===Number){
_4a=_49.n;
}else{
_4a=_49.i[this._identifier];
}
return _4a;
},getIdentityAttributes:function(_4b){
return [this._identifier];
}});
}