Converting SQL syntax dashboard widgets to CDK - amazon-cloudwatch

I'm trying to convert some old dashboard widgets into CDK. The widgets are all referencing custom metrics being output by the service, and performing some basic SQL-style grouping and filtering by various dimensions on the metric. The issue is I can't figure out what the syntax for adding such a widget looks like, and haven't been able to find references to SQL syntax in the AWS documentation; there are references to SEARCH expressions, but those seem to be for discovering metrics from cloudwatch logs, and references to MATH expressions, but none for these SQL queries I'm seeing.
How do I add a metric like the below to a cloudwatch widget?
"metrics": [
[ { "expression": "SELECT Count(outputRate) from ExampleService GROUP BY ProcessKey", "label exampleMetric", "id": "q1", "region": "us-east-1"} ]
]

I feel foolish for saying this, but as it turns out, MathExpressions are actually capable of running SQL-style aggregation and filtering. It simply doesn't appear to be documented, perhaps under the assumption that it was obvious.

Related

Parametrized BigQuery query produces no results from a joined table

I have rather a complex query that creates a table based on the inner join. The query is created by Python code and SQLAlchemy. When the query runs the result in the destination table is missing data from the right joined table.
To find out why I did the following:
Located the specific query in "Query History" of the BQ Console.
Using the Job associated with the query I have fetched the Job JSON file.
I have substituted all the parameters (#) in the query text with their literal values.
Loaded the resulting SQL text into the BQ editor and executed the query.
To my surprise, the data from the joined table are now present in the result.
The chance that this stems from a bug in BQ is very slim. I think the difference is in the way I substitute the values of the parameters when recreating the query.
The specific query parameters are either "STRING" or "INT64". Here is a sample from the query JSON file:
{
"name": "PARAM_802c1f6dd32747238ccdf80b305a4fd1",
"parameterType": {"type": "INT64"},
"parameterValue": {"value": "0"}
},
{
"name": "PARAM_f7ad61d9a6414d0ea8560e097950ecbc",
"parameterType": {"type": "STRING"},
"parameterValue": {"value": "`column`"}
},
These are the rules I follow for replacing "#param*":
if a parameter is INT64 I use the value from the JSON "as is" (without quotes)
if a parameter is STRING, I check whether it is surrounded by back ticks or not. If surrounded I use it "as is", if not, I add surrounding single quotes to the value.
Would be glad to hear from experts what can be wrong with my approach or anything else that can help me in solving (or debugging) my problem.
Seems my problem was that I have tried to use a column name as a value and this is not supported. Here is an excerpt from the documentation:
Parameters cannot be used as substitutes for identifiers, column names, table names, or other parts of the query.

Couchbase wildcard / variable keys in view

After doing some research and testing with Couchbase, I am getting some good results.
However, it seems strange that views must be created a head of time and are not very flexible.
Basically, if I have a view like this..
function(doc, meta) {
emit([doc.name, doc.location, doc.gender, doc.birthYear, doc.birthMonth], null);
}
And I want to query but different keys. Such as, maybe name = "John" and gender = "M"
It doesnt seem I can do startKey = ["John", {}, "M"], endKey = ["John", {}, "M", {}].
Similarly, what if I just want to filter the above by gender and birth month?
It seems i have to manually crate an individual view for every possible type of query, which with lots of data points if less than optimal.
I havnt seen any questions addressing this. Also, I looked into passing args to map or reduce to do any of it dynamically but that cant be done. I'd be stuck pulling ALL records across all group levels then having to manually sort/aggregate this data.
Can this be done?
Thank you
As of Couchbase version 4.x you have N1QL query language. You can specify a filter criteria to select your json objects without having any views in place.
So as per your example, you should be able issue a query like that:
SELECT *
FROM your_bucket_name
WHERE name = 'John' AND gender = 'M'
Here is a N1QL tutorial to get feel of it.
Yet another way is to use Couchbase integration with ElasticSearch and execute search query in ElasticSearch engine that will return you all the keys it found based on your search criteria.
http://www.couchbase.com/communities/n1ql
N1QL is more rich wuering language to couchbase data, which does not as limited as views

Category Implementation in a database

I'm building a system that involves users and teachers. In this particular system however I would like to categorize the teachers, but the tricky part is the categories are dynamic thus they can change anytime.
I have to have some functions, since I'm developing the backend;
The first one is showAllCategories(), that shows all the main categories.
Second is the showSubcategories() which shows the subcategories of a category()
Third is the showContent(), which in this case shows the teacher's information.
Before asking mighty Stack-Overflowers how would this be efficiently implemented, I thought I could use a doubly linked list approach where in categories table CategoryName, Before, After, Content and if the category did not have the after, the content would be pointing to the teacher's table. This is my classic SQL approach however I'm using MongoDB and since I'm a beginner I wonder if I could take the advantage of NoSQL in this particular situation?
MongoDb natively supports the Array type, which behaves actually more like a list. With $push and $pull you can add and remove elements from such an array field. $addToSet even makes sure there are no dublicates.
Now is the question of how the categories are stored. You can make a collection categories with the main categories, and they would be having a field each that has the array of the sub-categories:
{"_id": "science", "sub": ["chemist", "physicist", "biology"]}
{"_id": "languages", "sub": ["english", "german", "spanish"]}
Your teacher collection on the other hand would then have an array of embedded documents, the categories of the teacher. They are duplicates of those found in the categories collection, minus the fields that you won't need in the teacher view. This way you avoid joins, since they don't exist in MongoDB.
{
"_id": ObjectId(...),
"name": {"first": "Foo", "last": "Bar"},
"categories": ["chemist", "biology"]
}
The rest I am sure you can think up.
Addition: In short, use the flexible types that MongoDB offers, and don't worry about data redundancy. Embed documents often and don't forget the indexes.

Retrieving freebase quad dump type names from id

I'm currently working on a project using the freebase dumps, which I insert assertions into a per-mid ordered LevelDB. My goal is to be able for a given name, like Bob Dylan, to retrieve every types linked to it name.
For example, "Bob Dylan" would correspond to "Musician", "Film Producer" and so on, each corresponding themselves to the types "/music/artist", "/film/producer" etc...
Unfortunatly, if it's rather easy to find out the Bob Dylan mid into the quad dump
/m/bobdylanmid /common/topic/notable_types /music/artist
/m/bobdylanmid /common/topic/notable_types /film/producer
I'd like to be able to find those types names in various languages now. But I can't find a logical way to retrieve them in the dump.
Any clue please?
I'm not 100% certain, but I don't think the schema is actually in the quad dump. I know it never used to be.
You'll need to look up the names using a query like this. Unfortunately, the human readable names exist only in English, so you'd need to jump through some more hoops to get other languages. For that you could try something along the lines of this slightly more complicated query
[{
"id": "/music/artist",
"/freebase/type_profile/equivalent_topic": {
"name": {
"lang": null,
"value": null
}
},
"name": null
}]​
It depends on the "equivalent topic" property being filled in, which may not be the case for all types. If you only want a few languages, you could modify the query to return those explicitly ("Musician" has 45 different language variants).
If you are mainly interested in cases like your example (a person is/was a ...) using properties (rather than types) may do the job, in your case (the latter via a cvt):
/people/person/profession
/people/person/employment_history /business/employment_tenure/title
This might be more what you want to have anyways, unless you also want to display that e.g. Alan Turing is a "Literature Subject".
For the corresponding instances (with types /business/job_title, /people/profession) you can get the names in different languages (if existing).

How to extract property of a collection in the root document

I'm using RavenDB and I'm having trouble extracting a particular value using the Lucene Query.
Here is the JSON in my document:
{
"customer" : "my customer"
"locations": [
{
"name": "vel arcu. Curabitur",
"settings": {
"enabled": true
}
}
]
}
Here is my query:
var list = session.Advanced.LuceneQuery<ExpandoObject>()
.SelectFields<ExpandoObject>("customer", "locations;settings.enabled", "locations;name")
.ToList();
The list is populated and contains a bunch of ExpandoObjects with customer properties but I can't for the life of me get the location -> name or location -> settings -> enabled to come back.
Is the ";" or "." incorrect usage??
It seems that you have misunderstood the concept of indexes and queries in RavenDB. When you load a document in RavenDB you always load the whole document including all of its contents it contains. So in your case, if you load a customer, you already have the collection and all its children loaded. That means, you can use standard linq-to-objects to extract all these values, no need for anything special like indexes or lucene here.
If you want to do this extraction on the database side, so that you can query on those properties, then you need an index. Indexes are written using linq, but it's important to understand that they run on the server and just extract some data to populate the lucene index from. But here again, in most cases you don't even have to write the indexes yourself because RavenDB can create them automatically for you.
I no case, you need to write lucene queries like the one in your question because in RavenDB lucene queries will always be executed against a pre-built index, and these are generally flat. But again, chances are you don't need to do anything with lucene to get what you want.
I hope that makes sense for you. If not, please update your question and tell us more about what you actually want to do.
Technically, you can use the comma operator "," to nest into collections.
That should work, but it isn't recommended. You can just get your whole object and use it, it is easier and faster.