PDA

View Full Version : Random row from a Store after a filter.



BackgroundTeam
12 Apr 2012, 10:05 AM
Hi,

what I want to do is to input a filter in a store, like this:

store.filter('isLong', 'true')

and then get a random row from the filtered store, and show it in a template for example.

The problem with that is the random function, because I don't really know if the minimum-maximum interval from the random function is: 0-store.getCount() after the filter.

Any ideas?

Thank you so much.
undefined

scottmartin
12 Apr 2012, 12:17 PM
See what return your get on the following example



getCount >> 2
example.js:174getTotalCount >> 29
example.js:175store.totalCount >> 29
example.js:176filterCount:store.filters.length >> 1




Ext.onReady(function(){

Ext.QuickTips.init();

// sample static data for the store
var myData = [
['3m Co', 71.72, 0.02, 0.03, '9/1 12:00am'],
['Alcoa Inc', 29.01, 0.42, 1.47, '9/1 12:00am'],
['Altria Group Inc', 83.81, 0.28, 0.34, '9/1 12:00am'],
['American Express Company', 52.55, 0.01, 0.02, '9/1 12:00am'],
['American International Group, Inc.', 64.13, 0.31, 0.49, '9/1 12:00am'],
['AT&T Inc.', 31.61, -0.48, -1.54, '9/1 12:00am'],
['Boeing Co.', 75.43, 0.53, 0.71, '9/1 12:00am'],
['Caterpillar Inc.', 67.27, 0.92, 1.39, '9/1 12:00am'],
['Citigroup, Inc.', 49.37, 0.02, 0.04, '9/1 12:00am'],
['E.I. du Pont de Nemours and Company', 40.48, 0.51, 1.28, '9/1 12:00am'],
['Exxon Mobil Corp', 68.1, -0.43, -0.64, '9/1 12:00am'],
['General Electric Company', 34.14, -0.08, -0.23, '9/1 12:00am'],
['General Motors Corporation', 30.27, 1.09, 3.74, '9/1 12:00am'],
['Hewlett-Packard Co.', 36.53, -0.03, -0.08, '9/1 12:00am'],
['Honeywell Intl Inc', 38.77, 0.05, 0.13, '9/1 12:00am'],
['Intel Corporation', 19.88, 0.31, 1.58, '9/1 12:00am'],
['International Business Machines', 81.41, 0.44, 0.54, '9/1 12:00am'],
['Johnson & Johnson', 64.72, 0.06, 0.09, '9/1 12:00am'],
['JP Morgan & Chase & Co', 45.73, 0.07, 0.15, '9/1 12:00am'],
['McDonald\'s Corporation', 36.76, 0.86, 2.40, '9/1 12:00am'],
['Merck & Co., Inc.', 40.96, 0.41, 1.01, '9/1 12:00am'],
['Microsoft Corporation', 25.84, 0.14, 0.54, '9/1 12:00am'],
['Pfizer Inc', 27.96, 0.4, 1.45, '9/1 12:00am'],
['The Coca-Cola Company', 45.07, 0.26, 0.58, '9/1 12:00am'],
['The Home Depot, Inc.', 34.64, 0.35, 1.02, '9/1 12:00am'],
['The Procter & Gamble Company', 61.91, 0.01, 0.02, '9/1 12:00am'],
['United Technologies Corporation', 63.26, 0.55, 0.88, '9/1 12:00am'],
['Verizon Communications', 35.57, 0.39, 1.11, '9/1 12:00am'],
['Wal-Mart Stores, Inc.', 45.45, 0.73, 1.63, '9/1 12:00am']
];

Ext.define('company',{
extend: 'Ext.data.Model',
idProperty: 'company',
fields: [
{name: 'company'},
{name: 'price', type: 'float'},
{name: 'change', type: 'float'},
{name: 'pctChange', type: 'float'},
{name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'}
]
});

// create the data store
var store = Ext.create('Ext.data.ArrayStore', {
model: 'company',
data: myData
});

var cellEditing = Ext.create('Ext.grid.plugin.CellEditing', {
clicksToEdit: 1,
listeners: {
beforeedit: function(edit,opt){
if (opt.record.index !== undefined) { // no index; abort
return false;
}
}
}

});

// create the Grid
var grid = Ext.create('Ext.grid.Panel', {
store: store,
multiSelect: true,
tbar: [{
text: 'Add record',
handler: function(){
// Create a model instance
var rec = Ext.create('company', {
company: 'New Company',
price: 0,
pctChange: 0,
lastChange: Ext.Date.clearTime(new Date()),
});
store.insert(0, rec);
cellEditing.startEditByPosition({row: 0, column: 0});
}
}],
columns: [
{
text : 'Company',
flex : 1,
sortable : false,
dataIndex: 'company',
editor : {
xtype: 'textfield'
}
},
{
text : 'Price',
width : 75,
sortable : true,
renderer : 'usMoney',
dataIndex: 'price',
editor : {
xtype: 'textfield'
}
},
{
text : 'Change',
width : 75,
sortable : true,
dataIndex: 'change'
},
{
text : '% Change',
width : 75,
sortable : true,
dataIndex: 'pctChange'
},
{
text : 'Last Updated',
width : 85,
sortable : true,
renderer : Ext.util.Format.dateRenderer('m/d/Y'),
dataIndex: 'lastChange'
}
],
height: 350,
width: 600,
title: 'Array Grid',
renderTo: Ext.getBody(),
viewConfig: {
stripeRows: true
//enableTextSelection: true
},

plugins: [cellEditing]
});


var button = new Ext.Button({
text: 'load store',
width: 150,
renderTo: Ext.getBody(),
handler: function() {
store.load();

var count = store.getCount();
var totalCount = store.getTotalCount();
var filterCount = store.filters.length;

console.log('getCount >> ' + count);
console.log('getTotalCount >> ' + totalCount);
console.log('-');

store.add(store.model.create({
id: 'a'
}));

count = store.getCount();
totalCount = store.getTotalCount();

console.log('getCount >> ' + count);
console.log('getTotalCount >> ' + totalCount);
console.log('store.totalCount >> ' + store.totalCount);
console.log('-');

store.clearFilter(true);
store.filter('company','General');

count = store.getCount()
totalCount = store.getTotalCount()
filterCount = store.filters.length;

console.log('getCount >> ' + count);
console.log('getTotalCount >> ' + totalCount);
console.log('store.totalCount >> ' + store.totalCount);
console.log('filterCount:store.filters.length >> ' + filterCount);

}
});

});



Regards,
Scott

BackgroundTeam
13 Apr 2012, 1:49 AM
Scott, thank you so much for this valuable piece of code, very useful and clear.

But my main question is to input the random function between the filtered results you have.

tvanzoelen
13 Apr 2012, 4:24 AM
var filtered = [];
store.filterBy(function(r) {

if(r.get('isLong'))
{
filtered.push(r);
return true;
}
return false;
});


then extract a random record from the filtered array.

BackgroundTeam
16 Apr 2012, 2:38 AM
Looks good!

Thank you to everyone.