You successfully created a database on Hypi’s low code platform.
Next, how can you easily find the data you need ?
Hypi has developed its powerful query language as part of its lowcode platform: ArcQL
ArcQL works as a filter to select data to process or return. ArcQL statements are used along with query functions like find. If you understand SQL, you will write the ArcQL statements just by guessing at it.
Let’s consider the following schema of a social media App with Post and Profile types.
type Profile {
userAccnt: Account
address: Address
friends: [Account!]
}
type Post {
postedby: Account
date: DateTime
text: String
comments: [Post!]
rating: Float
tagFriends: [Account]
}
Suppose the following data has been inserted in the Post and Profile tables. To know about data insertion, check out this tutorial on CRUD Operations.
User Profile
userAccnt | user1 | user2 | user3 |
---|---|---|---|
address /city | Nagpur | Mumbai | Pune |
friends | user2/user3 | user1 | user1/user2 |
Post
postedby | user1 | user2 |
---|---|---|
text | Use low code! | Future is low code! |
date | 2010-12-12 | 2012-10-09 |
Let’s use ArcQL filters one by one to filter the data.
Term Query
Let’s say we want to search an existing user profile on our App. We can use a term query to refine the profile results.
A term query is a simple filter asking to return results that match the provided exact value. It searches for the record that contains the data mentioned in the arcql statement.
Query Statement:
arcql:”userAccnt.username=’user1′
This arcql filter searches the user1 profile.
{
find(type: Profile, arcql:"userAccnt.username='user1'") {
edges {
node {
... on Profile {
userAccnt{
username
}
address {
city
}
}
}
cursor
}
}
}
#Result
{
"data": {
"find": {
"edges": [
{
"node": {
"userAccnt": {
"username": "user1"
},
"address": {
"city": "Nagpur"
}
},
"cursor": "01F644E2S73ZZMB0QJD8ANM6GP"
}
]
}
}
}
Now we may search the posts where user1 has been tagged. A simple ArcQL statement like this will do the task.
arcql:"tagFriends.username = ‘user1’"
{
find(type: Post, arcql:"tagFriends.username = 'user1'") {
edges {
node {
... on Post {
postedby{
username
}
text
}
}
cursor
}
}
}
{
"data": {
"find": {
"edges": [
{
"node": {
"postedby": {
"username": "user2"
},
"text": "Future is low code!"
},
"cursor": "01F645M1FZ9M09PEV7DC49E701"
}
]
}
}
}
Boolean Logic is possible on all query types. AND and OR logic can be utilized to get specific records.
Let’s say you want to see posts by user1 as well as user2. You may frame an arcql statement like this using OR.
arcql:”postedby.username = ‘user2’ OR postedby.username = ‘user1′”
{
find(type: Post, arcql:"postedby.username = 'user2' OR postedby.username = 'user1'") {
edges {
node {
... on Post {
postedby{
username
}
text
}
}
cursor
}
}
}
#Result
{
"data": {
"find": {
"edges": [
{
"node": {
"postedby": {
"username": "user1"
},
"text": "Use low code!!"
},
"cursor": "01F645AXCE9CRRG0TQFGQC4F8A"
},
{
"node": {
"postedby": {
"username": "user2"
},
"text": "Future is low code!"
},
"cursor": "01F645M1FZ9M09PEV7DC49E701"
}
]
}
}
}
Prefix Query
Now we will look for the user profiles who live in a city starting with the letter P. A prefix query returns records that have data starting with the prefix stated in the query.
Query statement :
arcql:”address.city^’P’”
This arcql searches for the city with the prefix P.
{
find(type: Profile, arcql:"address.city^'P'") {
edges {
node {
... on Profile {
userAccnt{
username
}
address {
city
}
}
}
cursor
}
}
}
# Result
{
"data": {
"find": {
"edges": [
{
"node": {
"userAccnt": {
"username": "user3"
},
"address": {
"city": "Pune"
}
},
"cursor": "01F644X4BDWAG5SXP5D16TCBM3"
}
]
}
}
}
Phrase Query
On your App, you want to filter posts as per the date of the post. Let’s say you retrieve all the posts posted in the year 2010.
You will frame the Arcql statement with a phrase query like this.
arcql:”date~’2010′”
Phrase query searches for the individual words or exact phrases from the data. It is similar to a search engine that searches the phrase through various web pages.
{
find(type: Post, arcql:"date~'2010'") {
edges {
node {
... on Post {
postedby{
username
}
text
}
}
cursor
}
}
}
#Result
{
"data": {
"find": {
"edges": [
{
"node": {
"postedby": {
"username": "user1"
},
"text": "Use low code!!"
},
"cursor": "01F645AXCE9CRRG0TQFGQC4F8A"
}
]
}
}
}
Match All Query
Now you want to see posts by all users. Just use a wildcard to retrieve all records.
arcql:”*”
{
find(type: Post, arcql:"*") {
edges {
node {
... on Post {
postedby{
username
}
text
}
}
cursor
}
}
}
#Result
{
"data": {
"find": {
"edges": [
{
"node": {
"postedby": {
"username": "user1"
},
"text": "Use low code!!"
},
"cursor": "01F645AXCE9CRRG0TQFGQC4F8A"
},
{
"node": {
"postedby": {
"username": "user2"
},
"text": "Future is low code!"
},
"cursor": "01F645M1FZ9M09PEV7DC49E701"
}
]
}
}
}
Wildcard Query
You may also use wildcards like * and ? to filter the data.
The following query retrieves the data of the user with a username ending with 3.
arcql:"userAccnt.username * ‘*3’ "
{
find(type: Profile, arcql:"userAccnt.username * '*3'") {
edges {
node {
... on Profile {
userAccnt{
username
}
address{
city
}
}
}
cursor
}
}
}
#Result
{
"data": {
"find": {
"edges": [
{
"node": {
"userAccnt": {
"username": "user3"
},
"address": {
"city": "Pune"
}
},
"cursor": "01F644X4BDWAG5SXP5D16TCBM3"
}
]
}
}
}
EXIST/ NOT EXIST
EXIST query returns records that have non-null data in a field.
Let’s check the results where the rating has been provided to a post.
{
find(type: Post, arcql: "EXIST rating") {
edges {
node {
... on Post {
postedby {
username
}
rating
text
hypi {
id
}
date
text
tagFriends {
username
}
}
}
cursor
}
}
}
#Result
{
"data": {
"find": {
"edges": [
{
"node": {
"postedby": {
"username": "user1"
},
"rating": 3.5,
"text": "Use low code!!",
"hypi": {
"id": "01F645AXCE9CRRG0TQFGQC4F8A"
},
"date": "2010-12-12T00:00:00Z",
"tagFriends": [
{
"username": "user2"
},
{
"username": "user3"
}
]
},
"cursor": "01F645AXCE9CRRG0TQFGQC4F8A"
}
]
}
}
}
NOT EXIST does the opposite of EXIST. It returns records that have null data in a field.
SORT
You may sort the records in ascending or descending order. Specify ASC/DESC order as per the requirement. If the order is not specified, hypi performs DESC order by default.
Now let’s sort the text of the posts in ascending order.
arcql: “* SORT text ASC”
{
find(type: Post, arcql: "* SORT text ASC") {
edges {
node {
... on Post {
text
}
}
cursor
}
}
}
#Result
{
"data": {
"find": {
"edges": [
{
"node": {
"text": "Future is low code!"
},
"cursor": "01F645M1FZ9M09PEV7DC49E701"
},
{
"node": {
"text": "Use low code!!"
},
"cursor": "01F645AXCE9CRRG0TQFGQC4F8A"
}
]
}
}
}
Range Query
Range queries search for the content that falls within given range.
- a IN (0, 1] => left inclusive => including 0, excluding 1
- a IN [0, 1) => right inclusive => excluding 0, including 1
- a IN (0, 1) => exclusive => not including 0 or 1, only those in between
- a IN [0, 1] => inclusive => including both 0, 1 and everything in between
Let’s say you want to search for posts in between 2010 and 2011. You may phrase a query like this.
arcql: “date IN (‘2010-01-01′,’2011-01-01’)”
{
find(type: Post, arcql: "date IN ('2010-01-01','2011-01-01')"){
edges {
node {
... on Post {
text
}
}
cursor
}
}
}
#Result
{
"data": {
"find": {
"edges": [
{
"node": {
"text": "Use low code!!"
},
"cursor": "01F645AXCE9CRRG0TQFGQC4F8A"
}
]
}
}
}
Concluding Note
This tutorial may have given you a fair idea of how to frame your ArcQL statements to filter data. In case of more clarifications, you may check the docs here.
Build powerful search features on your Application. Search data using low code ArcQL filter with Hypi!