Skip to content

feat!: Require parentheses around pipelines - #4775

Merged
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens
Jul 24, 2024
Merged

feat!: Require parentheses around pipelines#4775
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens

Conversation

@max-sixty

Copy link
Copy Markdown
Member

Whether pipelines required parentheses was ambiguous before — does select (invoice_date | date.to_text "%d/%m/%Y") require its parentheses? How about in a tuple like select {(invoice_date | date.to_text "%d/%m/%Y")}?

This changes the parser so parentheses are required. This creates much better errors in some cases — for example a missing comma from a tuple isn't parsed as a pipeline:

derive {
x=y
a=b
}

...is no longer parsed as derive {x=(y | a=b)}, which is really confusing. Or similarly derive {x=y a=b} also parses into that.

It also simplifies the parser code slightly; unifying pipeline functions.

(tests fail on parsing one thing from the std lib, I need to fix)

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

It does make a lot of sense for those parsing error examples that you show. It's a pity though for the common use cases like sum or text.lower, e.g. derive low = (title | text.lower), where it adds overhead.

Would it be possible to require it only in cases where there's a \n involved? In Python you have

>>>s='a''b'>>>s'ab'>>>s= ('a'
... 'b')
>>>s'ab'

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

Or if one conceptually separated the two uses of |, maybe one could disallow \n as composition operator for the expression language?

What I mean is, assume one used |> or >> for piping relations to transforms and | for piping arguments to functions in column expressions, e.g. from customers >> derive upper_title = title | text.upper. While it's sometimes useful to use >> as above, we usually write this as

from customers
derive upper_title = title | text.upper

While I usually want to use \n instead of >>, I struggle to imagine scenarios where I would want to use \n instead of |. Even in cases where the line becomes very long and I want to split it over two lines, I'd be ok with requiring a mandatory | as well as () to suppress the conversion of \n to >>. So

from customers
derive upper_title =(title |...|...|
text.upper)

or

from customers
derive upper_title =(title | text.upper)

but never

from customers
derive upper_title =(title text.upper)

or

from customers
derive upper_title = title text.upper

@max-sixty

Copy link
Copy Markdown
MemberAuthor

I think any deviation away from "| is the same as a newline in a pipeline" is a huge change and would need a really compelling rationale. Similarly anything making a pipeline anything other than applying functions in turn...

max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
@max-sixty

max-sixty commented Jul 24, 2024

Copy link
Copy Markdown
MemberAuthor

Need to add some parentheses docs but otherwise this is ready to go!

Edit: actually the docs were already up-to-date... the code behavior was overly permissive and we didn't check for an error

@max-sixty
max-sixty enabled auto-merge (squash) July 24, 2024 07:48
@max-sixty
max-sixty merged commit f01789a into PRQL:mainJul 24, 2024
@max-sixty
max-sixty deleted the pipeline-parens branch July 24, 2024 07:50
max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
max-sixty added a commit that referenced this pull request Jul 24, 2024
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
vanillajonathan added a commit to vanillajonathan/prql that referenced this pull request Mar 18, 2025
Since prqlc 0.13.0 PRQL#4775 PRQL now requires paranthesis around pipelines. See PRQL#4775
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@max-sixty@snth
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat!: Require parentheses around pipelines by max-sixty · Pull Request #4775 · PRQL/prql · GitHub
Skip to content

feat!: Require parentheses around pipelines - #4775

Merged
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens
Jul 24, 2024
Merged

feat!: Require parentheses around pipelines#4775
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens

Conversation

@max-sixty

Copy link
Copy Markdown
Member

Whether pipelines required parentheses was ambiguous before — does select (invoice_date | date.to_text "%d/%m/%Y") require its parentheses? How about in a tuple like select {(invoice_date | date.to_text "%d/%m/%Y")}?

This changes the parser so parentheses are required. This creates much better errors in some cases — for example a missing comma from a tuple isn't parsed as a pipeline:

derive {
x=y
a=b
}

...is no longer parsed as derive {x=(y | a=b)}, which is really confusing. Or similarly derive {x=y a=b} also parses into that.

It also simplifies the parser code slightly; unifying pipeline functions.

(tests fail on parsing one thing from the std lib, I need to fix)

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

It does make a lot of sense for those parsing error examples that you show. It's a pity though for the common use cases like sum or text.lower, e.g. derive low = (title | text.lower), where it adds overhead.

Would it be possible to require it only in cases where there's a \n involved? In Python you have

>>>s='a''b'>>>s'ab'>>>s= ('a'
... 'b')
>>>s'ab'

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

Or if one conceptually separated the two uses of |, maybe one could disallow \n as composition operator for the expression language?

What I mean is, assume one used |> or >> for piping relations to transforms and | for piping arguments to functions in column expressions, e.g. from customers >> derive upper_title = title | text.upper. While it's sometimes useful to use >> as above, we usually write this as

from customers
derive upper_title = title | text.upper

While I usually want to use \n instead of >>, I struggle to imagine scenarios where I would want to use \n instead of |. Even in cases where the line becomes very long and I want to split it over two lines, I'd be ok with requiring a mandatory | as well as () to suppress the conversion of \n to >>. So

from customers
derive upper_title =(title |...|...|
text.upper)

or

from customers
derive upper_title =(title | text.upper)

but never

from customers
derive upper_title =(title text.upper)

or

from customers
derive upper_title = title text.upper

@max-sixty

Copy link
Copy Markdown
MemberAuthor

I think any deviation away from "| is the same as a newline in a pipeline" is a huge change and would need a really compelling rationale. Similarly anything making a pipeline anything other than applying functions in turn...

max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
@max-sixty

max-sixty commented Jul 24, 2024

Copy link
Copy Markdown
MemberAuthor

Need to add some parentheses docs but otherwise this is ready to go!

Edit: actually the docs were already up-to-date... the code behavior was overly permissive and we didn't check for an error

@max-sixty
max-sixty enabled auto-merge (squash) July 24, 2024 07:48
@max-sixty
max-sixty merged commit f01789a into PRQL:mainJul 24, 2024
@max-sixty
max-sixty deleted the pipeline-parens branch July 24, 2024 07:50
max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
max-sixty added a commit that referenced this pull request Jul 24, 2024
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
vanillajonathan added a commit to vanillajonathan/prql that referenced this pull request Mar 18, 2025
Since prqlc 0.13.0 PRQL#4775 PRQL now requires paranthesis around pipelines. See PRQL#4775
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@max-sixty@snth
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat!: Require parentheses around pipelines by max-sixty · Pull Request #4775 · PRQL/prql · GitHub
Skip to content

feat!: Require parentheses around pipelines - #4775

Merged
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens
Jul 24, 2024
Merged

feat!: Require parentheses around pipelines#4775
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens

Conversation

@max-sixty

Copy link
Copy Markdown
Member

Whether pipelines required parentheses was ambiguous before — does select (invoice_date | date.to_text "%d/%m/%Y") require its parentheses? How about in a tuple like select {(invoice_date | date.to_text "%d/%m/%Y")}?

This changes the parser so parentheses are required. This creates much better errors in some cases — for example a missing comma from a tuple isn't parsed as a pipeline:

derive {
x=y
a=b
}

...is no longer parsed as derive {x=(y | a=b)}, which is really confusing. Or similarly derive {x=y a=b} also parses into that.

It also simplifies the parser code slightly; unifying pipeline functions.

(tests fail on parsing one thing from the std lib, I need to fix)

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

It does make a lot of sense for those parsing error examples that you show. It's a pity though for the common use cases like sum or text.lower, e.g. derive low = (title | text.lower), where it adds overhead.

Would it be possible to require it only in cases where there's a \n involved? In Python you have

>>>s='a''b'>>>s'ab'>>>s= ('a'
... 'b')
>>>s'ab'

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

Or if one conceptually separated the two uses of |, maybe one could disallow \n as composition operator for the expression language?

What I mean is, assume one used |> or >> for piping relations to transforms and | for piping arguments to functions in column expressions, e.g. from customers >> derive upper_title = title | text.upper. While it's sometimes useful to use >> as above, we usually write this as

from customers
derive upper_title = title | text.upper

While I usually want to use \n instead of >>, I struggle to imagine scenarios where I would want to use \n instead of |. Even in cases where the line becomes very long and I want to split it over two lines, I'd be ok with requiring a mandatory | as well as () to suppress the conversion of \n to >>. So

from customers
derive upper_title =(title |...|...|
text.upper)

or

from customers
derive upper_title =(title | text.upper)

but never

from customers
derive upper_title =(title text.upper)

or

from customers
derive upper_title = title text.upper

@max-sixty

Copy link
Copy Markdown
MemberAuthor

I think any deviation away from "| is the same as a newline in a pipeline" is a huge change and would need a really compelling rationale. Similarly anything making a pipeline anything other than applying functions in turn...

max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
@max-sixty

max-sixty commented Jul 24, 2024

Copy link
Copy Markdown
MemberAuthor

Need to add some parentheses docs but otherwise this is ready to go!

Edit: actually the docs were already up-to-date... the code behavior was overly permissive and we didn't check for an error

@max-sixty
max-sixty enabled auto-merge (squash) July 24, 2024 07:48
@max-sixty
max-sixty merged commit f01789a into PRQL:mainJul 24, 2024
@max-sixty
max-sixty deleted the pipeline-parens branch July 24, 2024 07:50
max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
max-sixty added a commit that referenced this pull request Jul 24, 2024
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
vanillajonathan added a commit to vanillajonathan/prql that referenced this pull request Mar 18, 2025
Since prqlc 0.13.0 PRQL#4775 PRQL now requires paranthesis around pipelines. See PRQL#4775
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@max-sixty@snth
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat!: Require parentheses around pipelines by max-sixty · Pull Request #4775 · PRQL/prql · GitHub
Skip to content

feat!: Require parentheses around pipelines - #4775

Merged
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens
Jul 24, 2024
Merged

feat!: Require parentheses around pipelines#4775
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens

Conversation

@max-sixty

Copy link
Copy Markdown
Member

Whether pipelines required parentheses was ambiguous before — does select (invoice_date | date.to_text "%d/%m/%Y") require its parentheses? How about in a tuple like select {(invoice_date | date.to_text "%d/%m/%Y")}?

This changes the parser so parentheses are required. This creates much better errors in some cases — for example a missing comma from a tuple isn't parsed as a pipeline:

derive {
x=y
a=b
}

...is no longer parsed as derive {x=(y | a=b)}, which is really confusing. Or similarly derive {x=y a=b} also parses into that.

It also simplifies the parser code slightly; unifying pipeline functions.

(tests fail on parsing one thing from the std lib, I need to fix)

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

It does make a lot of sense for those parsing error examples that you show. It's a pity though for the common use cases like sum or text.lower, e.g. derive low = (title | text.lower), where it adds overhead.

Would it be possible to require it only in cases where there's a \n involved? In Python you have

>>>s='a''b'>>>s'ab'>>>s= ('a'
... 'b')
>>>s'ab'

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

Or if one conceptually separated the two uses of |, maybe one could disallow \n as composition operator for the expression language?

What I mean is, assume one used |> or >> for piping relations to transforms and | for piping arguments to functions in column expressions, e.g. from customers >> derive upper_title = title | text.upper. While it's sometimes useful to use >> as above, we usually write this as

from customers
derive upper_title = title | text.upper

While I usually want to use \n instead of >>, I struggle to imagine scenarios where I would want to use \n instead of |. Even in cases where the line becomes very long and I want to split it over two lines, I'd be ok with requiring a mandatory | as well as () to suppress the conversion of \n to >>. So

from customers
derive upper_title =(title |...|...|
text.upper)

or

from customers
derive upper_title =(title | text.upper)

but never

from customers
derive upper_title =(title text.upper)

or

from customers
derive upper_title = title text.upper

@max-sixty

Copy link
Copy Markdown
MemberAuthor

I think any deviation away from "| is the same as a newline in a pipeline" is a huge change and would need a really compelling rationale. Similarly anything making a pipeline anything other than applying functions in turn...

max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
@max-sixty

max-sixty commented Jul 24, 2024

Copy link
Copy Markdown
MemberAuthor

Need to add some parentheses docs but otherwise this is ready to go!

Edit: actually the docs were already up-to-date... the code behavior was overly permissive and we didn't check for an error

@max-sixty
max-sixty enabled auto-merge (squash) July 24, 2024 07:48
@max-sixty
max-sixty merged commit f01789a into PRQL:mainJul 24, 2024
@max-sixty
max-sixty deleted the pipeline-parens branch July 24, 2024 07:50
max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
max-sixty added a commit that referenced this pull request Jul 24, 2024
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
vanillajonathan added a commit to vanillajonathan/prql that referenced this pull request Mar 18, 2025
Since prqlc 0.13.0 PRQL#4775 PRQL now requires paranthesis around pipelines. See PRQL#4775
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@max-sixty@snth
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat!: Require parentheses around pipelines by max-sixty · Pull Request #4775 · PRQL/prql · GitHub
Skip to content

feat!: Require parentheses around pipelines - #4775

Merged
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens
Jul 24, 2024
Merged

feat!: Require parentheses around pipelines#4775
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens

Conversation

@max-sixty

Copy link
Copy Markdown
Member

Whether pipelines required parentheses was ambiguous before — does select (invoice_date | date.to_text "%d/%m/%Y") require its parentheses? How about in a tuple like select {(invoice_date | date.to_text "%d/%m/%Y")}?

This changes the parser so parentheses are required. This creates much better errors in some cases — for example a missing comma from a tuple isn't parsed as a pipeline:

derive {
x=y
a=b
}

...is no longer parsed as derive {x=(y | a=b)}, which is really confusing. Or similarly derive {x=y a=b} also parses into that.

It also simplifies the parser code slightly; unifying pipeline functions.

(tests fail on parsing one thing from the std lib, I need to fix)

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

It does make a lot of sense for those parsing error examples that you show. It's a pity though for the common use cases like sum or text.lower, e.g. derive low = (title | text.lower), where it adds overhead.

Would it be possible to require it only in cases where there's a \n involved? In Python you have

>>>s='a''b'>>>s'ab'>>>s= ('a'
... 'b')
>>>s'ab'

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

Or if one conceptually separated the two uses of |, maybe one could disallow \n as composition operator for the expression language?

What I mean is, assume one used |> or >> for piping relations to transforms and | for piping arguments to functions in column expressions, e.g. from customers >> derive upper_title = title | text.upper. While it's sometimes useful to use >> as above, we usually write this as

from customers
derive upper_title = title | text.upper

While I usually want to use \n instead of >>, I struggle to imagine scenarios where I would want to use \n instead of |. Even in cases where the line becomes very long and I want to split it over two lines, I'd be ok with requiring a mandatory | as well as () to suppress the conversion of \n to >>. So

from customers
derive upper_title =(title |...|...|
text.upper)

or

from customers
derive upper_title =(title | text.upper)

but never

from customers
derive upper_title =(title text.upper)

or

from customers
derive upper_title = title text.upper

@max-sixty

Copy link
Copy Markdown
MemberAuthor

I think any deviation away from "| is the same as a newline in a pipeline" is a huge change and would need a really compelling rationale. Similarly anything making a pipeline anything other than applying functions in turn...

max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
@max-sixty

max-sixty commented Jul 24, 2024

Copy link
Copy Markdown
MemberAuthor

Need to add some parentheses docs but otherwise this is ready to go!

Edit: actually the docs were already up-to-date... the code behavior was overly permissive and we didn't check for an error

@max-sixty
max-sixty enabled auto-merge (squash) July 24, 2024 07:48
@max-sixty
max-sixty merged commit f01789a into PRQL:mainJul 24, 2024
@max-sixty
max-sixty deleted the pipeline-parens branch July 24, 2024 07:50
max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
max-sixty added a commit that referenced this pull request Jul 24, 2024
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
vanillajonathan added a commit to vanillajonathan/prql that referenced this pull request Mar 18, 2025
Since prqlc 0.13.0 PRQL#4775 PRQL now requires paranthesis around pipelines. See PRQL#4775
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@max-sixty@snth
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat!: Require parentheses around pipelines by max-sixty · Pull Request #4775 · PRQL/prql · GitHub
Skip to content

feat!: Require parentheses around pipelines - #4775

Merged
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens
Jul 24, 2024
Merged

feat!: Require parentheses around pipelines#4775
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens

Conversation

@max-sixty

Copy link
Copy Markdown
Member

Whether pipelines required parentheses was ambiguous before — does select (invoice_date | date.to_text "%d/%m/%Y") require its parentheses? How about in a tuple like select {(invoice_date | date.to_text "%d/%m/%Y")}?

This changes the parser so parentheses are required. This creates much better errors in some cases — for example a missing comma from a tuple isn't parsed as a pipeline:

derive {
x=y
a=b
}

...is no longer parsed as derive {x=(y | a=b)}, which is really confusing. Or similarly derive {x=y a=b} also parses into that.

It also simplifies the parser code slightly; unifying pipeline functions.

(tests fail on parsing one thing from the std lib, I need to fix)

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

It does make a lot of sense for those parsing error examples that you show. It's a pity though for the common use cases like sum or text.lower, e.g. derive low = (title | text.lower), where it adds overhead.

Would it be possible to require it only in cases where there's a \n involved? In Python you have

>>>s='a''b'>>>s'ab'>>>s= ('a'
... 'b')
>>>s'ab'

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

Or if one conceptually separated the two uses of |, maybe one could disallow \n as composition operator for the expression language?

What I mean is, assume one used |> or >> for piping relations to transforms and | for piping arguments to functions in column expressions, e.g. from customers >> derive upper_title = title | text.upper. While it's sometimes useful to use >> as above, we usually write this as

from customers
derive upper_title = title | text.upper

While I usually want to use \n instead of >>, I struggle to imagine scenarios where I would want to use \n instead of |. Even in cases where the line becomes very long and I want to split it over two lines, I'd be ok with requiring a mandatory | as well as () to suppress the conversion of \n to >>. So

from customers
derive upper_title =(title |...|...|
text.upper)

or

from customers
derive upper_title =(title | text.upper)

but never

from customers
derive upper_title =(title text.upper)

or

from customers
derive upper_title = title text.upper

@max-sixty

Copy link
Copy Markdown
MemberAuthor

I think any deviation away from "| is the same as a newline in a pipeline" is a huge change and would need a really compelling rationale. Similarly anything making a pipeline anything other than applying functions in turn...

max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
@max-sixty

max-sixty commented Jul 24, 2024

Copy link
Copy Markdown
MemberAuthor

Need to add some parentheses docs but otherwise this is ready to go!

Edit: actually the docs were already up-to-date... the code behavior was overly permissive and we didn't check for an error

@max-sixty
max-sixty enabled auto-merge (squash) July 24, 2024 07:48
@max-sixty
max-sixty merged commit f01789a into PRQL:mainJul 24, 2024
@max-sixty
max-sixty deleted the pipeline-parens branch July 24, 2024 07:50
max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
max-sixty added a commit that referenced this pull request Jul 24, 2024
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
vanillajonathan added a commit to vanillajonathan/prql that referenced this pull request Mar 18, 2025
Since prqlc 0.13.0 PRQL#4775 PRQL now requires paranthesis around pipelines. See PRQL#4775
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@max-sixty@snth
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat!: Require parentheses around pipelines by max-sixty · Pull Request #4775 · PRQL/prql · GitHub
Skip to content

feat!: Require parentheses around pipelines - #4775

Merged
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens
Jul 24, 2024
Merged

feat!: Require parentheses around pipelines#4775
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens

Conversation

@max-sixty

Copy link
Copy Markdown
Member

Whether pipelines required parentheses was ambiguous before — does select (invoice_date | date.to_text "%d/%m/%Y") require its parentheses? How about in a tuple like select {(invoice_date | date.to_text "%d/%m/%Y")}?

This changes the parser so parentheses are required. This creates much better errors in some cases — for example a missing comma from a tuple isn't parsed as a pipeline:

derive {
x=y
a=b
}

...is no longer parsed as derive {x=(y | a=b)}, which is really confusing. Or similarly derive {x=y a=b} also parses into that.

It also simplifies the parser code slightly; unifying pipeline functions.

(tests fail on parsing one thing from the std lib, I need to fix)

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

It does make a lot of sense for those parsing error examples that you show. It's a pity though for the common use cases like sum or text.lower, e.g. derive low = (title | text.lower), where it adds overhead.

Would it be possible to require it only in cases where there's a \n involved? In Python you have

>>>s='a''b'>>>s'ab'>>>s= ('a'
... 'b')
>>>s'ab'

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

Or if one conceptually separated the two uses of |, maybe one could disallow \n as composition operator for the expression language?

What I mean is, assume one used |> or >> for piping relations to transforms and | for piping arguments to functions in column expressions, e.g. from customers >> derive upper_title = title | text.upper. While it's sometimes useful to use >> as above, we usually write this as

from customers
derive upper_title = title | text.upper

While I usually want to use \n instead of >>, I struggle to imagine scenarios where I would want to use \n instead of |. Even in cases where the line becomes very long and I want to split it over two lines, I'd be ok with requiring a mandatory | as well as () to suppress the conversion of \n to >>. So

from customers
derive upper_title =(title |...|...|
text.upper)

or

from customers
derive upper_title =(title | text.upper)

but never

from customers
derive upper_title =(title text.upper)

or

from customers
derive upper_title = title text.upper

@max-sixty

Copy link
Copy Markdown
MemberAuthor

I think any deviation away from "| is the same as a newline in a pipeline" is a huge change and would need a really compelling rationale. Similarly anything making a pipeline anything other than applying functions in turn...

max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
@max-sixty

max-sixty commented Jul 24, 2024

Copy link
Copy Markdown
MemberAuthor

Need to add some parentheses docs but otherwise this is ready to go!

Edit: actually the docs were already up-to-date... the code behavior was overly permissive and we didn't check for an error

@max-sixty
max-sixty enabled auto-merge (squash) July 24, 2024 07:48
@max-sixty
max-sixty merged commit f01789a into PRQL:mainJul 24, 2024
@max-sixty
max-sixty deleted the pipeline-parens branch July 24, 2024 07:50
max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
max-sixty added a commit that referenced this pull request Jul 24, 2024
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
vanillajonathan added a commit to vanillajonathan/prql that referenced this pull request Mar 18, 2025
Since prqlc 0.13.0 PRQL#4775 PRQL now requires paranthesis around pipelines. See PRQL#4775
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@max-sixty@snth
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); feat!: Require parentheses around pipelines by max-sixty · Pull Request #4775 · PRQL/prql · GitHub
Skip to content

feat!: Require parentheses around pipelines - #4775

Merged
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens
Jul 24, 2024
Merged

feat!: Require parentheses around pipelines#4775
max-sixty merged 13 commits into
PRQL:mainfrom
max-sixty:pipeline-parens

Conversation

@max-sixty

Copy link
Copy Markdown
Member

Whether pipelines required parentheses was ambiguous before — does select (invoice_date | date.to_text "%d/%m/%Y") require its parentheses? How about in a tuple like select {(invoice_date | date.to_text "%d/%m/%Y")}?

This changes the parser so parentheses are required. This creates much better errors in some cases — for example a missing comma from a tuple isn't parsed as a pipeline:

derive {
x=y
a=b
}

...is no longer parsed as derive {x=(y | a=b)}, which is really confusing. Or similarly derive {x=y a=b} also parses into that.

It also simplifies the parser code slightly; unifying pipeline functions.

(tests fail on parsing one thing from the std lib, I need to fix)

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

It does make a lot of sense for those parsing error examples that you show. It's a pity though for the common use cases like sum or text.lower, e.g. derive low = (title | text.lower), where it adds overhead.

Would it be possible to require it only in cases where there's a \n involved? In Python you have

>>>s='a''b'>>>s'ab'>>>s= ('a'
... 'b')
>>>s'ab'

@snth

snth commented Jul 23, 2024

Copy link
Copy Markdown
Member

Or if one conceptually separated the two uses of |, maybe one could disallow \n as composition operator for the expression language?

What I mean is, assume one used |> or >> for piping relations to transforms and | for piping arguments to functions in column expressions, e.g. from customers >> derive upper_title = title | text.upper. While it's sometimes useful to use >> as above, we usually write this as

from customers
derive upper_title = title | text.upper

While I usually want to use \n instead of >>, I struggle to imagine scenarios where I would want to use \n instead of |. Even in cases where the line becomes very long and I want to split it over two lines, I'd be ok with requiring a mandatory | as well as () to suppress the conversion of \n to >>. So

from customers
derive upper_title =(title |...|...|
text.upper)

or

from customers
derive upper_title =(title | text.upper)

but never

from customers
derive upper_title =(title text.upper)

or

from customers
derive upper_title = title text.upper

@max-sixty

Copy link
Copy Markdown
MemberAuthor

I think any deviation away from "| is the same as a newline in a pipeline" is a huge change and would need a really compelling rationale. Similarly anything making a pipeline anything other than applying functions in turn...

max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
@max-sixty

max-sixty commented Jul 24, 2024

Copy link
Copy Markdown
MemberAuthor

Need to add some parentheses docs but otherwise this is ready to go!

Edit: actually the docs were already up-to-date... the code behavior was overly permissive and we didn't check for an error

@max-sixty
max-sixty enabled auto-merge (squash) July 24, 2024 07:48
@max-sixty
max-sixty merged commit f01789a into PRQL:mainJul 24, 2024
@max-sixty
max-sixty deleted the pipeline-parens branch July 24, 2024 07:50
max-sixty added a commit to max-sixty/prql that referenced this pull request Jul 24, 2024
max-sixty added a commit that referenced this pull request Jul 24, 2024
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
vanillajonathan added a commit to vanillajonathan/prql that referenced this pull request Mar 18, 2025
Since prqlc 0.13.0 PRQL#4775 PRQL now requires paranthesis around pipelines. See PRQL#4775
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@max-sixty@snth