how can we use ''$data'' with ''required'' in ajv? - jsonschema

I have a json schema like this :
let schema = {
type: 'object',
properties : {
first: {
type : 'object',
properties : {
foo : {type : 'string'}
}
},
second: {
type : 'object',
properties : {
bar : {type : 'boolean'}
}
}
}
}
I'm trying to implement this condition: if {bar: true} then "foo" is necessary (required)
something like this :
let schema = {
type: 'object',
properties : {
first: {
type : 'object',
properties : {
foo : {type : 'string'}
}
},
second: {
type : 'object',
properties : {
bar : {type : 'boolean'}
},
if:{
bar : {const : 'true'}
},
then:{
required : {'$data': '1/first/foo'}
}
}
}
}
but it does not work!!!!

Related

How to deploy Column View artifact on CloudFoundry

I have a Column View in SAP HANA SQL that is used in a sql procedure
CREATE COLUMN VIEW "ABC_COLUMN_VIEW" TYPE hierarchy WITH PARAMETERS (
'hierarchyDefinition'='{
"MULTIPARENT":true,
"NODETYPE":"STRING",
"NODETYPE_INFERRED":"STRING",
"RUNTIMEOBJECTTYPE":"tree",
"SOURCEQUERY":"SELECT "A_COLUMN", "B_COLUMN" FROM "ABC_TABLE"",
"SOURCEQUERYSCHEMA":"ABC_SCHEMA",
"SOURCETYPE":"RECURSIVE"}')
and im trying to deploy it on cf but now i see that the .hdiconfig file doesnt have anything about column views
{
"plugin_version" : "2.0.0.0",
"file_suffixes" : {
"hdbsynonym" : {
"plugin_name" : "com.sap.hana.di.synonym"
},
"hdbsynonymconfig" : {
"plugin_name" : "com.sap.hana.di.synonym.config"
},
"hdbtable" : {
"plugin_name" : "com.sap.hana.di.table"
},
"hdbdropcreatetable" : {
"plugin_name" : "com.sap.hana.di.dropcreatetable"
},
"hdbvirtualtable" : {
"plugin_name" : "com.sap.hana.di.virtualtable"
},
"hdbvirtualtableconfig" : {
"plugin_name" : "com.sap.hana.di.virtualtable.config"
},
"hdbindex" : {
"plugin_name" : "com.sap.hana.di.index"
},
"hdbfulltextindex" : {
"plugin_name" : "com.sap.hana.di.fulltextindex"
},
"hdbconstraint" : {
"plugin_name" : "com.sap.hana.di.constraint"
},
"hdbtrigger" : {
"plugin_name" : "com.sap.hana.di.trigger"
},
"hdbstatistics" : {
"plugin_name" : "com.sap.hana.di.statistics"
},
"hdbview" : {
"plugin_name" : "com.sap.hana.di.view"
},
"hdbcalculationview" : {
"plugin_name" : "com.sap.hana.di.calculationview"
},
"hdbprojectionview" : {
"plugin_name" : "com.sap.hana.di.projectionview"
},
"hdbprojectionviewconfig" : {
"plugin_name" : "com.sap.hana.di.projectionview.config"
},
"hdbresultcache" : {
"plugin_name" : "com.sap.hana.di.resultcache"
},
"hdbcds" : {
"plugin_name" : "com.sap.hana.di.cds"
},
"hdbfunction" : {
"plugin_name" : "com.sap.hana.di.function"
},
"hdbvirtualfunction" : {
"plugin_name" : "com.sap.hana.di.virtualfunction"
},
"hdbvirtualfunctionconfig" : {
"plugin_name" : "com.sap.hana.di.virtualfunction.config"
},
"hdbhadoopmrjob" : {
"plugin_name" : "com.sap.hana.di.virtualfunctionpackage.hadoop"
},
"jar" : {
"plugin_name" : "com.sap.hana.di.virtualfunctionpackage.hadoop"
},
"hdbtabletype" : {
"plugin_name" : "com.sap.hana.di.tabletype"
},
"hdbprocedure" : {
"plugin_name" : "com.sap.hana.di.procedure"
},
"hdbvirtualprocedure" : {
"plugin_name" : "com.sap.hana.di.virtualprocedure"
},
"hdbvirtualprocedureconfig" : {
"plugin_name" : "com.sap.hana.di.virtualprocedure.config"
},
"hdbafllangprocedure" : {
"plugin_name" : "com.sap.hana.di.afllangprocedure"
},
"hdblibrary" : {
"plugin_name" : "com.sap.hana.di.library"
},
"hdbsequence" : {
"plugin_name" : "com.sap.hana.di.sequence"
},
"hdbrole" : {
"plugin_name" : "com.sap.hana.di.role"
},
"hdbroleconfig" : {
"plugin_name" : "com.sap.hana.di.role.config"
},
"hdbstructuredprivilege" : {
"plugin_name" : "com.sap.hana.di.structuredprivilege"
},
"hdbanalyticprivilege" : {
"plugin_name" : "com.sap.hana.di.analyticprivilege"
},
"hdbtabledata" : {
"plugin_name" : "com.sap.hana.di.tabledata"
},
"csv" : {
"plugin_name" : "com.sap.hana.di.tabledata.source"
},
"properties" : {
"plugin_name" : "com.sap.hana.di.tabledata.properties"
},
"tags" : {
"plugin_name" : "com.sap.hana.di.tabledata.properties"
},
"hdbgraphworkspace" : {
"plugin_name" : "com.sap.hana.di.graphworkspace"
},
"hdbflowgraph" : {
"plugin_name" : "com.sap.hana.di.flowgraph"
},
"hdbreptask" : {
"plugin_name" : "com.sap.hana.di.reptask"
},
"hdbsearchruleset" : {
"plugin_name" : "com.sap.hana.di.searchruleset"
},
"hdbtextconfig" : {
"plugin_name" : "com.sap.hana.di.textconfig"
},
"hdbtextdict" : {
"plugin_name" : "com.sap.hana.di.textdictionary"
},
"hdbtextrule" : {
"plugin_name" : "com.sap.hana.di.textrule"
},
"hdbtextinclude" : {
"plugin_name" : "com.sap.hana.di.textrule.include"
},
"hdbtextlexicon" : {
"plugin_name" : "com.sap.hana.di.textrule.lexicon"
},
"hdbtextminingconfig" : {
"plugin_name" : "com.sap.hana.di.textminingconfig"
},
"txt" : {
"plugin_name" : "com.sap.hana.di.copyonly"
}
}
}
So my problem is can i add a column view artifact somehow so i can push to cf or there is another way now to implement hierarchy?
You’re right, there isn’t a content type for column views because these are runtime objects.
The column view you posted looks like it belongs to a hierarchy view, which is a kind of column view. You can model hierarchy functions in HANA 2 WebIDE, so that’s what I’d recommend to try here.

Sencha List shows no data

I have a ProfileView which should show some user data. This is the first time I am trying to get data from MySql and showing it on a Sencha view.
The view
Ext.define('MyApp.view.Profile', {
extend : 'Ext.Panel',
xtype : 'profileview',
requires : ['Ext.List', 'Ext.data.Store'],
config : {
layout: 'fit',
title : 'Profiel',
iconCls : 'user3',
cls : 'home',
scrollable : true,
styleHtmlContent : true,
html : ['<h1>Mijn Profiel</h1>'].join(""),
items : [Ext.create('Ext.List', {
title : 'Profile',
docked : 'top',
store : myStore,
show : function(list, opts) {
alert('list === ' + list);
console.log('List Shown: ' + list);
}
})]
}
});
var myStore = Ext.create("Ext.data.Store", {
model : "MyApp.model.User",
proxy : {
type : "ajax",
url : "php/get_user.php",
reader : {
type : "json"
// rootProperty : "users"
}
},
autoLoad : true
});
The data is returned correctly but nothing is shown, and this I am trying to figure out.
The Response
[{"ID":"19","USERNAME":"Annet","EMAIL":"annet#annet.nl"}]
I skipped the rootProperty because it is a single user.
The Model
Ext.define('MyApp.model.User', {
extend : 'Ext.data.Model',
config : {
fields : [{
name : 'ID',
type : 'int'
}, {
name : 'USERNAME',
type : 'string'
}, {
name : 'EMAIL',
type : 'string'
}]
}
});
So, why does the list not show anything ?
Update
I check to see it the store contains data and it does
map: Object
ext-record-1: Class
_data: Object
EMAIL: "annet#annet.nl"
ID: 19
USERNAME: "Annet"
id: "ext-record-1"
__proto__: Object
Why is it not picked up by the list? I tried DataView as well.
You need to use itemTpl, i changed code for you.
Ext.define('MyApp.view.Profile', {
extend : 'Ext.Panel',
xtype : 'profileview',
requires : ['Ext.List', 'Ext.data.Store'],
config : {
layout: 'fit',
title : 'Profiel',
iconCls : 'user3',
cls : 'home',
scrollable : true,
styleHtmlContent : true,
html : ['<h1>Mijn Profiel</h1>'].join(""),
items : [Ext.create('Ext.List', {
title : 'Profile',
docked : 'top',
itemTpl : '<div>{ID} <span> {USERNAME} </span> <span> {EMAIL} </span> </div>',
store : myStore,
show : function(list, opts) {
alert('list === ' + list);
console.log('List Shown: ' + list);
}
})]
}
});

Unable to load data from a json file in sencha touch 2

I've trying to get the sencha touch 2 data management examples to work but with no use. Here is the code of a simple model and store that are not working (getCount returns 0).
Ext.define('MyClient.model.Product', {
extend:'Ext.data.Model',
config:{
fields:['name', 'image'],
proxy:{
type:'ajax',
url:'http://localhost/st2/Projets/my-client-sencha/data/products.json',
reader:{
type:'json',
rootProperty:'products',
successProperty:'success'
}
}
}
});
Ext.define('MyClient.store.ProductsStore', {
extend:'Ext.data.Store',
config:{
model:'MyClient.model.Product',
autoLoad:true,
autoSync:true
}
});
In the launch function I have these lines:
var prod = Ext.create('MyClient.store.ProductsStore');
prod.load();
alert(prod.getCount());
And finally here's my products.json:
[
{
"name":"test"
}
]
I'm not getting any errors in the console but still the getCount always returns 0. Can use some help here please.
EDIT: wrong JSON, not working with this neither:
{
"success":true,
"products": [
{
"name":"test"
}
]
}
Because of your setting rootProperty:'products', your json has to be like
{
products: [
{
"name":"test"
}
]
}
if you do not want to change server response remover rootProperty from config.
have a look at Json Reader doc
Ahh... you forgot about asyn nature of the load()....
var prod = Ext.create('MyClient.store.ProductsStore');
prod.load(function ( ){
alert(prod.getCount());
});
Notice that it prod.load() is using only for testing purposes, as far you have set property autoLoad: true.
In your snippet the loader would make 2 similar calls.
Cheers, Oleg
Ext.define('MyBizilinkms.model.Customer', {
extend: 'Ext.data.Model',
config: {
identifier:'uuid',
fields: [
'CustId',
'EMail',
'Title',
'FName',
'MdInitial',
'LName',
'PhnNum',
'SecondPhnNo',
'DOB',
'Address',
'SecondAddress',
'City',
'State',
'Zip',
'Country',
'RecieveEmail',
'IsSaveonServer',
{
name: 'Full_Name',
type:'string',
convert:function(v, rec) {
return rec.data.FName + " " + rec.data.LName;
}
}],
validations: [
{
type: 'format',
name: 'EMail',
matcher: /^[a-zA-Z0-9._-]+#[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/,
message:"Valid Email Required"
},
{
name: 'PhnNum',
type : 'custom',
message : "Valid Phone required",
validator : function(config, value, model) {
var reg = /^[0-9]{3}-[0-9]{3}-[0-9]{4}$/;
return reg.test(value);
}
},
{
name: 'SecondPhnNum',
type : 'custom',
message : "Valid 2nd Phone required",
validator : function(config, value, model) {
if (!Ext.isEmpty(value)) {
var reg = /^[0-9]{3}-[0-9]{3}-[0-9]{4}$/;
return reg.test(value)
}
return true;
}
},
{
type: 'presence',
name: 'FName',
message : "First Name is required"
},
{
type: 'presence',
name: 'LName',
message : "Last Name is required"
},
{
type: 'presence',
name: 'Address',
message : "Address is required"
},
{
type: 'presence',
name: 'City',
message : "City is required"
},
{
name: 'State',
type : 'custom',
message : "Valid State required",
validator : function(config, value, model) {
var reg = /^(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NB|NC|ND|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)$/i;
if(Ext.isEmpty(value))
value = '00'
var state = value.replace(/^\s+|\s+$/g, "");
return reg.test(state)
}
},
{
name: 'Zip',
type : 'custom',
message : "Valid Zip required",
validator : function(config, value, model) {
var reg = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
return reg.test(value)
}
},
{
type: 'presence',
name: 'Country',
message : "Country is required"
}
]
},
getFullName: function() {
return this.get('FName') + '' + this.get( 'LName');
}
});

node.updateInfo is not a function while appending node in extjs

I am trying to load data into an extjs 4 TreeStore but while appending node, I am getting node.updateInfo is not a function error.
My model classes are as follows :
Dimension.js
Ext.define('ilp.model.Dimension', {
extend : 'Ext.data.Model',
require : [
'ilp.model.DimensionLevel'
],
fields : [
'actualName',
'displayName'
],
hasMany : {model : 'ilp.model.DimensionLevel', name : 'dimensionLevels'}
});
DimensionLevel.js
Ext.define('ilp.model.DimensionLevel', {
extend : 'Ext.data.Model',
fields : [
{name : 'name', type : 'string'},
{name : 'totalTrainees', type : 'int'}
]
});
and tree store code is as follows :
Ext.define('ilp.store.DimensionTree', {
extend : 'Ext.data.TreeStore',
requires : [
'ilp.model.Dimension',
'ilp.model.DimensionLevel'
],
model : 'ilp.model.Dimension',
root: {
name: 'Dimensions'
},
proxy: {
type: 'ajax',
url: 'http://localhost:8080/pentaho/content/cda/doQuery',
reader: {
type: 'pentahoReader',
root: 'resultset'
},
extraParams: {
path: 'RINXDashboards%2FCDAs%2FILP_Employee_Qeries.cda',
dataAccessId:'Get_All_Levels_From_All_Dimensions',
userid : 'joe',
password : 'password'
}
},
listeners: {
append : function(parentNode, newNode, index, options) {
if(newNode.get('text') != 'Root') {
console.log('newNode text value = ' + newNode.get('text'));
newNode.set('checked', null);
newNode.set('expandable', true);
if(Ext.ClassManager.getName(newNode) == "ilp.model.Dimension") {
newNode.set('expanded', true);
newNode.set('text', newNode.get('displayName'));
if(newNode.dimensionLevels().getCount() > 0) {
newNode.dimensionLevels().each(function(level) {
newNode.appendChild(level);
});
} else {
newNode.set('leaf', true);
}
}else if(Ext.ClassManager.getName(newNode) == "ilp.model.DimensionLevel") {
newNode.set('leaf', true);
newNode.set('text', newNode.get('name'));
}
}
}
}
});
I am getting above error on following line :
newNode.dimensionLevels().each(function(level) {
while debugging I have found that updateInfo() method of newNode is undefined.
Can anyone please tell me why this error is coming? I am totally clueless now !!!
May this is caused by the bug EXTJSIV-6051
see Sencha Forum for further infos
I think your problem comes from :
root: {
name: 'Dimensions'
},
root attribute must be of type: Ext.data.Model/Ext.data.NodeInterface/Object. So try to replace 'root' attribute by this:
root: {
text: "Dimensions",
leaf: false
}
Check Sencha doc for more information: http://docs.sencha.com/ext-js/4-1/#!/api/Ext.tree.Panel-cfg-root

How does MongoDB index arrays?

In MongoDB, if I were to store an array (say ["red", "blue"]) in a field "color", does it index "red" and "blue" so I could query for "red", for example, or does in make {"red", "blue"} a composite index?
When it comes to indexing arrays, MongoDB indexes each value of the array so you can query for individual items, such as "red." For example:
> db.col1.save({'colors': ['red','blue']})
> db.col1.ensureIndex({'colors':1})
> db.col1.find({'colors': 'red'})
{ "_id" : ObjectId("4ccc78f97cf9bdc2a2e54ee9"), "colors" : [ "red", "blue" ] }
> db.col1.find({'colors': 'blue'})
{ "_id" : ObjectId("4ccc78f97cf9bdc2a2e54ee9"), "colors" : [ "red", "blue" ] }
For more information, check out MongoDB's documentation on Multikeys: http://www.mongodb.org/display/DOCS/Multikeys
You can simply test index usage by appending "explain" to your query:
> db.col1.save({'colors': ['red','blue']})
# without index
> db.col1.find({'colors': 'red'}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "protrain.col1",
"indexFilterSet" : false,
"parsedQuery" : {
"colors" : {
"$eq" : "red"
}
},
"winningPlan" : {
"stage" : "COLLSCAN", <--- simple column scan
"filter" : {
"colors" : {
"$eq" : "red"
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "bee34f15fe28",
"port" : 27017,
"version" : "3.4.4",
"gitVersion" : "888390515874a9debd1b6c5d36559ca86b44babd"
},
"ok" : 1
}
# query with index
> db.col1.createIndex( { "colors":1 } )
> db.col1.find({'colors': 'red'}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "protrain.col1",
"indexFilterSet" : false,
"parsedQuery" : {
"colors" : {
"$eq" : "red"
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN", <!---- INDEX HAS BEEN USED
"keyPattern" : {
"colors" : 1
},
"indexName" : "colors_1",
"isMultiKey" : true,
"multiKeyPaths" : {
"colors" : [
"colors"
]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"colors" : [
"[\"red\", \"red\"]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "bee34f15fe28",
"port" : 27017,
"version" : "3.4.4",
"gitVersion" : "888390515874a9debd1b6c5d36559ca86b44babd"
},
"ok" : 1
}
For structures where you have structured indexes, you could use the array position to index fields inside arrays:
{
'_id': 'BB167E2D61909E848EBC96C7B33251AC',
'hist': {
'map': {
'10': 1
}
},
'wayPoints': [{
'bhf_name': 'Zinsgutstr.(Berlin)',
'ext_no': 900180542,
'lat': 52.435158,
'lon': 13.559086,
'puic': 86,
'time': {
'dateTime': '2018-01-10T09: 38: 00',
'offset': {
'totalSeconds': 3600
}
},
'train_name': 'Bus162'
},
{
'bhf_name': 'SAdlershof(Berlin)',
'ext_no': 900193002,
'lat': 52.435104,
'lon': 13.54055,
'puic': 86,
'time': {
'dateTime': '2018-01-10T09: 44: 00',
'offset': {
'totalSeconds': 3600
}
},
'train_name': 'Bus162'
}]
}
db.col.createIndex( { "wayPoints.0.ext_no":1 } )
db.col.createIndex( { "wayPoints.0.train_name":1 } )
db.col.createIndex( { "wayPoints.1.ext_no":1 } )
db.col.createIndex( { "wayPoints.1.train_name":1 } )
> db.col.find(
... {
... "wayPoints.ext_no": 900180542
... }
... ,
... {
... "wayPoints.ext_no":1,
... "wayPoints.train_name":1,
... "wayPoints.time":1
... }
... ).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "db.col",
"indexFilterSet" : false,
"parsedQuery" : {
"wayPoints.ext_no" : {
"$eq" : 900180542
}
},
"winningPlan" : {
"stage" : "PROJECTION",
"transformBy" : {
"wayPoints.ext_no" : 1,
"wayPoints.train_name" : 1,
"wayPoints.time" : 1
},
"inputStage" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"wayPoints.ext_no" : 1
},
"indexName" : "wayPoints.ext_no_1",
"isMultiKey" : true,
"multiKeyPaths" : {
"wayPoints.ext_no" : [
"wayPoints"
]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"wayPoints.ext_no" : [
"[900180542.0, 900180542.0]"
]
}
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "bee34f15fe28",
"port" : 27017,
"version" : "3.4.4",
"gitVersion" : "888390515874a9debd1b6c5d36559ca86b44babd"
},
"ok" : 1
}