Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Introduce remove ambiguous grammar RFC #1
base: main
Are you sure you want to change the base?
Introduce remove ambiguous grammar RFC #1
Changes from 4 commits
a987efc
f43a47c
3c9badc
47fa19f
1a6a21e
b94acbd
5c8d953
File filter
Filter by extension
Conversations
Jump to
There are no files selected for viewing
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could it be more simple to just disallow certain keywords, and not allow for it to be wrapped? Would users be very upset by being unable to use a few keywords? In my case, if I saw an error message saying "can't use this keyword", I would just change it to something else. But I am only 1 person so not sure.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
❤️
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
question: will single quotes or double quotes matter? I notice uuid uses single quotes and the other 2 examples use double. Assuming either will be acceptable?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes either is acceptable, the only difference is the
u
ort
in front of the string.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What about ULIDs?? Taking a glance at SurrealDB's code, it seems that they are handled quite differently than UUIDs. Are they stored differently as well?
Also, I'm apprehensive about the record strand prefix.
I get it for datetime and UUIDs, but for solving the ambiguity between record IDs and object fields, I think the object syntax should change.
I think the way to go is to make objects have fields that are string literals.
(In the future there could be format strings, which would allow for dynamically setting the field name)
So, for your example:
Is taking the field
c
of a recorda:b
.To express an object with field
a
with a value ofb.c
, you would instead write:This also mirrors the rules in JSON.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this a minor ambiguity? It seems like you can get completely different results from the same syntax? Or am I understanding wrong?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I called it minor, because I don't think there are a lot of situation in which this ambiguity happens, but you are correct that you can get completely different results for the same syntax.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To visualize, would it be like:
or
{ a: u"some_uuid" }
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This ambiguity is unrelated to the ambiguity of strands.
This is a ambiguity is caused by the fact that raw records are allowed. you can for example write
CREATE some_table:some_specific_id;
. The problem is the:
. If a raw record is the first statement in an block statement it looks exactly like an object.In the example
{ a:b.c }
,a:b
looks like a raw record but it could also be a field definition with a value.Raw records will still be allowed in these proposed changes, so we need a way to define the value of
{ a:b.c }
. Currently the parse will first try to match an object and then try to match a block statement. This results in strange behavior like{a:b.c; true }
being parsed as an block but{a:b.c }
is parsed as an object.The proposed change here is to define that if the parsers sees
{
followed by and identifier followed by:
it will always choose to parse an object and error if it encounters{a:b.c; true }
. To make this statement work again you could use a record strand:{ r"a:b".c; true }
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, I think I see now. So the last code snippet at the end of your comment was what I was trying to understand.
So the 2 options you mentioned in the rfc would be visualized as
{ r"a:b".c; true }
or{ a:r"b.c"; true }
?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If error messaging is concise and explicit as you proposed, I don't think this would be too bad to learn, vs. hitting what seem like common ambiguity problems.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree! but it is still kind of a drawback.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not arguing there, just commenting that in my personal opinion I think the benefit would outweigh the drawback :).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
❤️ - I personally prefer this to #3. I should have kept reading before leaving that comment! haha
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am very curious about this. I am not too sure what is currently considered a plain object and a geometry object. Are there any examples?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah, I see a Geometry example at the bottom of page.
Is there potential that one may want to do topological analysis on plain objects like vectors or matrices, because then maybe with Geometry as a supertype one can share topology methods with plain objects?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Geometry objects are objects which have a very specific layout. The following query returns one kind of geometry object.
As you can see it looks exactly like an normal object but if you change even a small part like for example:
(
Lines
instead ofLine
) it is suddenly a plain object and no longer a geometry.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I shall add this example to the rfc
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think considering making the plain object the supertype may also be an option: one may be able to draw some tangents from geometry kernels and languages like apt for example: https://en.wikipedia.org/wiki/APT_(programming_language).
At the end of the day Geometry is comprised of plain objects. And this way plain objects are limited to methods that work for them, and geometry objects can be expanded.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Are there any semantic differences between geometry objects and plain objects (like operations)?
If not, then maybe the best thing to do is to treat geometries like plain objects by default and allow for defining the field as otherwise.
This would mean that an application like Surrealist can get information about the table to know how to display those fields.
We can even copy the
record<table>
syntax asobject<schema>
. There is even the potential to allow for user-defined schemas to validate against using a URI (maybe likeobject<"http://example.org/bibliography.schema.json">
).So for a geometry object this might look like:
DEFINE FIELD position ON TABLE location_history TYPE object<geometry>;
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, guess there are operators specialized for geometry objects. Maybe it would be better to move these operators to functions.
For example:
Could be:
Then the
INSIDE
operator could be generalized to plain objects. For example: